Merge HTML changes in javadoc from branch 'geoapi-3.1'.
diff --git a/application/sis-console/src/main/java/org/apache/sis/console/AboutCommand.java b/application/sis-console/src/main/java/org/apache/sis/console/AboutCommand.java
index f830b87..0a01ea6 100644
--- a/application/sis-console/src/main/java/org/apache/sis/console/AboutCommand.java
+++ b/application/sis-console/src/main/java/org/apache/sis/console/AboutCommand.java
@@ -54,7 +54,7 @@
  *   <li>{@code --verbose}: prints all information including the libraries.</li>
  * </ul>
  *
- * <div class="section">About SIS installation on a remote machine</div>
+ * <h2>About SIS installation on a remote machine</h2>
  * This sub-command can provide information about SIS installation on a remote machine,
  * provided that remote access has been enabled at the Java Virtual Machine startup time.
  * See {@link org.apache.sis.console} package javadoc for more information.
diff --git a/application/sis-console/src/main/java/org/apache/sis/console/Command.java b/application/sis-console/src/main/java/org/apache/sis/console/Command.java
index 5fc9aa0..cc50d8b 100644
--- a/application/sis-console/src/main/java/org/apache/sis/console/Command.java
+++ b/application/sis-console/src/main/java/org/apache/sis/console/Command.java
@@ -67,7 +67,7 @@
  * to the {@linkplain System#err standard error stream}. The reason is that command output may be targeted to
  * a client, while the error messages are usually for the operator.
  *
- * <div class="section">SIS installation on remote machines</div>
+ * <h2>SIS installation on remote machines</h2>
  * Some sub-commands can operate on SIS installation on remote machines, provided that remote access has been enabled
  * at the Java Virtual Machine startup time. See {@linkplain org.apache.sis.console package javadoc} for more information.
  *
diff --git a/application/sis-console/src/main/java/org/apache/sis/console/package-info.java b/application/sis-console/src/main/java/org/apache/sis/console/package-info.java
index 9fd9235..f375519 100644
--- a/application/sis-console/src/main/java/org/apache/sis/console/package-info.java
+++ b/application/sis-console/src/main/java/org/apache/sis/console/package-info.java
@@ -19,7 +19,7 @@
  * Command line interface for Apache SIS.
  * See {@link org.apache.sis.console.Command} for the list of supported commands.
  *
- * <div class="section">SIS installation on remote machines</div>
+ * <h2>SIS installation on remote machines</h2>
  * Some sub-commands can operate on SIS installation on remote machines, provided that Apache SIS
  * has been {@linkplain org.apache.sis.internal.system.Supervisor#ENABLED compiled with MBeans enabled}
  * and that the remote Java Virtual Machine has been started with the following options:
diff --git a/core/sis-build-helper/src/main/java/org/apache/sis/internal/unopkg/package-info.java b/core/sis-build-helper/src/main/java/org/apache/sis/internal/unopkg/package-info.java
index 8ac5cc8..01e9e4e 100644
--- a/core/sis-build-helper/src/main/java/org/apache/sis/internal/unopkg/package-info.java
+++ b/core/sis-build-helper/src/main/java/org/apache/sis/internal/unopkg/package-info.java
@@ -25,7 +25,7 @@
  * but can also be used for other projects. See the Apache SIS add-in module for an example
  * about how a module can be configured in order to use this Maven plugin.</p>
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * Below is an example of {@code pom.xml} build configuration.
  * The following strings need to be replaced:
  *
@@ -37,7 +37,7 @@
  *       The final filename, without the {@code .oxt} extension.</li>
  * </ul>
  *
- * <div class="section">Maven project file</div>
+ * <h2>Maven project file</h2>
  * {@preformat xml
  *   <dependencies>
  *     <!-- Put all your project dependencies here, including transitive dependencies. -->
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
index 38152f1..1968bda 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
@@ -62,7 +62,7 @@
  * In this example, sample values in range [10…210] define a quantitative category, while all others categories are qualitative.
  * </div>
  *
- * <div class="section">Relationship with metadata</div>
+ * <h2>Relationship with metadata</h2>
  * This class provides the same information than ISO 19115 {@code org.opengis.metadata.content.SampleDimension},
  * but organized in a different way. The use of the same name may seem a risk, but those two types are typically
  * not used in same time.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
index e947a20..d7e2f02 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
@@ -184,7 +184,7 @@
      * If the {@code slicePoint} CRS is different than this grid coverage CRS (except for the number of dimensions),
      * a coordinate transformation will be applied as needed.</div>
      *
-     * <div class="section">Characteristics of the returned image</div>
+     * <h4>Characteristics of the returned image</h4>
      * Image dimensions <var>x</var> and <var>y</var> map to the first and second dimension respectively of
      * the two-dimensional {@code sliceExtent} {@linkplain GridExtent#getSubspaceDimensions(int) subspace}.
      * The coordinates given by {@link RenderedImage#getMinX()} and {@link RenderedImage#getMinY() getMinY()}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ImageRenderer.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ImageRenderer.java
index 33b84a7b..f0ef651 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ImageRenderer.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ImageRenderer.java
@@ -74,7 +74,7 @@
  * }
  * </div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * Current implementation constructs only images made of a single tile.
  * Support for tiled images will be added in a future version.
  *
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
index 31a8e58..480544c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAssociation.java
@@ -29,7 +29,7 @@
  * An instance of an {@linkplain DefaultAssociationRole feature association role} containing the associated feature.
  * {@code AbstractAssociation} can be instantiated by calls to {@link DefaultAssociationRole#newInstance()}.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code AbstractAssociation} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
@@ -158,7 +158,7 @@
      * <div class="warning"><b>Warning:</b> In a future SIS version, the argument type may be changed
      * to {@code org.opengis.feature.Feature}. This change is pending GeoAPI revision.</div>
      *
-     * <div class="section">Validation</div>
+     * <h4>Validation</h4>
      * The amount of validation performed by this method is implementation dependent.
      * Usually, only the most basic constraints are verified. This is so for performance reasons
      * and also because some rules may be temporarily broken while constructing a feature.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
index 6780fa9..d367c24 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
@@ -48,7 +48,7 @@
  *
  * {@code AbstractAttribute} can be instantiated by calls to {@link DefaultAttributeType#newInstance()}.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code AbstractAttribute} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
@@ -235,7 +235,7 @@
     /**
      * Sets the attribute value. All previous values are replaced by the given singleton.
      *
-     * <div class="section">Validation</div>
+     * <h4>Validation</h4>
      * The amount of validation performed by this method is implementation dependent.
      * Usually, only the most basic constraints are verified. This is so for performance reasons
      * and also because some rules may be temporarily broken while constructing a feature.
@@ -282,7 +282,7 @@
      * Consequently, {@code characteristics.isEmpty()} is a convenient way to check that an attribute have
      * all the "standard" characteristics and need no special processing.</div>
      *
-     * <div class="section">Reading a characteristic</div>
+     * <h4>Reading a characteristic</h4>
      * The characteristic values are enumerated in the {@linkplain Map#values() map values}.
      * The {@linkplain Map#keySet() map keys} are the {@code String} representations of characteristics
      * {@linkplain DefaultAttributeType#getName() name}, for more convenient lookups.
@@ -302,7 +302,7 @@
      *     }
      * }
      *
-     * <div class="section">Adding a characteristic</div>
+     * <h4>Adding a characteristic</h4>
      * A new characteristic can be added in the map in three different ways:
      * <ol>
      *   <li>Putting the (<var>name</var>, <var>characteristic</var>) pair explicitly.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
index 701b597..478b265 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractFeature.java
@@ -45,14 +45,14 @@
  *
  * {@code AbstractFeature} can be instantiated by calls to {@link DefaultFeatureType#newInstance()}.
  *
- * <div class="section">Simple features</div>
+ * <h2>Simple features</h2>
  * A feature is said “simple” if it complies to the following conditions:
  * <ul>
  *   <li>the feature allows only attributes and operations (no associations),</li>
  *   <li>the cardinality of all attributes is constrained to [1 … 1].</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code AbstractFeature} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
@@ -305,7 +305,7 @@
      * number of occurrences} and does not depend on the actual number of values. If an attribute allows more than one
      * value, then this method will always return a collection for that attribute even if the collection is empty.</div>
      *
-     * <div class="section">Multi-valued properties and collections</div>
+     * <h4>Multi-valued properties and collections</h4>
      * In the case of multi-valued properties (“max. occurs” &gt; 1), the collection returned by this method may
      * or may not be modifiable, at implementation choice. Generally the caller can not add new elements into the
      * returned collection anyway since {@code Collection<?>} does not allow such operations, and more specific
@@ -328,7 +328,7 @@
     /**
      * Sets the value for the property of the given name.
      *
-     * <div class="section">Validation</div>
+     * <h4>Validation</h4>
      * The amount of validation performed by this method is implementation dependent.
      * Usually, only the most basic constraints are verified. This is so for performance reasons
      * and also because some rules may be temporarily broken while constructing a feature.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java
index 6e8798f..b5f65cc 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractIdentifiedType.java
@@ -180,7 +180,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Localization</div>
+     * <h4>Localization</h4>
      * All localizable attributes like {@code "definition"} may have a language and country code suffix.
      * For example the {@code "definition_fr"} property stands for remarks in {@linkplain Locale#FRENCH French} and
      * the {@code "definition_fr_CA"} property stands for remarks in {@linkplain Locale#CANADA_FRENCH French Canadian}.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicTypeMap.java b/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicTypeMap.java
index 4e8f895..da37c07 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicTypeMap.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/CharacteristicTypeMap.java
@@ -33,7 +33,7 @@
  * Implementation of the map returned by {@link DefaultAttributeType#characteristics()}.
  * Information provided by this implementation are also used by {@link CharacteristicMap}.
  *
- * <div class="section">Comparison with standard hash map</div>
+ * <h2>Comparison with standard hash map</h2>
  * The straightforward approach would be to store the attributes directly as values in a standard {@code HashMap}.
  * But instead of that, we store attributes in an array and the array indices in a {@code HashMap}. This level of
  * indirection is useless if we consider only the {@link DefaultAttributeType#characteristics()} method, since a
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java
index a7341d7..12690bc 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAssociationRole.java
@@ -42,7 +42,7 @@
  *       feature instances by other feature instances.</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * Instances of this class are immutable if all properties ({@link GenericName} and {@link InternationalString}
  * instances) and all arguments (e.g. {@code valueType}) given to the constructor are also immutable.
  * Such immutable instances can be shared by many objects and passed between threads without synchronization.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java
index 643c17d..3c0bcf7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultAttributeType.java
@@ -48,7 +48,7 @@
  * When such interface will be available, most references to {@code DefaultAttributeType} in current
  * API will be replaced by references to the {@code AttributeType} interface.</div>
  *
- * <div class="section">Value type</div>
+ * <h2>Value type</h2>
  * Attributes can be used for both spatial and non-spatial properties.
  * Some examples are:
  *
@@ -60,7 +60,7 @@
  *   <tr><td>Horizontal accuracy</td> <td>{@link org.opengis.metadata.quality.PositionalAccuracy}</td></tr>
  * </table>
  *
- * <div class="section">Attribute characterization</div>
+ * <h2>Attribute characterization</h2>
  * An {@code Attribute} can be characterized by other attributes. For example an attribute that carries a measurement
  * (e.g. air temperature) may have another attribute that holds the measurement accuracy (e.g. ±0.1°C).
  * The accuracy value is often constant for all instances of that attribute
@@ -85,7 +85,7 @@
  * It is still possible for any specific {@code Attribute} instance to specify their own value,
  * but {@linkplain DefaultFeatureType#isSimple() simple feature} usually don't do that.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * Instances of this class are immutable if all properties ({@link GenericName} and {@link InternationalString}
  * instances) and all arguments (e.g. {@code defaultValue}) given to the constructor are also immutable.
  * Such immutable instances can be shared by many objects and passed between threads without synchronization.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
index b66af6a..f72e4c0 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
@@ -54,12 +54,12 @@
  * When such interface will be available, most references to {@code DefaultFeatureType} in the API
  * will be replaced by references to the {@code FeatureType} interface.</div>
  *
- * <div class="section">Naming</div>
+ * <h2>Naming</h2>
  * The feature type {@linkplain #getName() name} is mandatory and should be unique. Those names are the main
  * criterion used for deciding if a feature type {@linkplain #isAssignableFrom is assignable from} another type.
  * Names can be {@linkplain org.apache.sis.util.iso.DefaultScopedName scoped} for avoiding name collision.
  *
- * <div class="section">Properties and inheritance</div>
+ * <h2>Properties and inheritance</h2>
  * Each feature type can provide descriptions for the following {@linkplain #getProperties(boolean) properties}:
  *
  * <ul>
@@ -78,13 +78,13 @@
  * which are implicitly <cite>covariant</cite> (i.e. {@code String[]} can be casted to {@code CharSequence[]}, which
  * is safe for read operations but not for write operations — the later may throw {@link ArrayStoreException}).</div>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * {@code DefaultFeatureType} can be instantiated directly by a call to its {@linkplain #DefaultFeatureType constructor}.
  * But a more convenient approach may be to use the {@link org.apache.sis.feature.builder.FeatureTypeBuilder} instead,
  * which provides shortcuts for frequently-used operations like creating various {@link org.opengis.util.GenericName}
  * instances sharing the same namespace.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * Instances of this class are immutable if all properties ({@link GenericName} and {@link InternationalString}
  * instances) and all arguments ({@code AttributeType} instances) given to the constructor are also immutable.
  * Such immutable instances can be shared by many objects and passed between threads without synchronization.
@@ -652,7 +652,7 @@
      * However as a safety, this method also checks that all properties in this feature type is assignable
      * from a property of the same name in the given type.
      *
-     * <div class="section">Constraints:</div>
+     * <h4>Constraints:</h4>
      * <ul>
      *   <li>If <var>A</var> is assignable from <var>B</var> and <var>B</var> is assignable from <var>C</var>,
      *       then <var>A</var> is assignable from <var>C</var>.</li>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/EnvelopeOperation.java b/core/sis-feature/src/main/java/org/apache/sis/feature/EnvelopeOperation.java
index 22cafa4..19415c3 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/EnvelopeOperation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/EnvelopeOperation.java
@@ -50,7 +50,7 @@
  *   <li>the CRS of the first non-empty geometry.</li>
  * </ol>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * If a geometry contains other geometries, this operation queries only the envelope of the root geometry.
  * It is the root geometry responsibility to take in account the envelope of all its children.
  *
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java b/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
index 613c0e0..6601a4f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
@@ -36,7 +36,7 @@
  * <p>A flexible but relatively cumbersome way to define arbitrary computations is to subclass {@link AbstractOperation}.
  * This {@code FeatureOperations} class provides a more convenient way to get a few commonly-used operations.</p>
  *
- * <div class="section">Operation name, designation and description</div>
+ * <h2>Operation name, designation and description</h2>
  * All operations are identified by a programmatic name, but can also have a more human-readable designation
  * for Graphical User Interfaces (GUI). Those identification information are specified in a {@code Map<String,?>}.
  * The recognized entries are the same than the ones documented in {@link AbstractIdentifiedType}, augmented with
@@ -142,7 +142,7 @@
      * Since this method does not create new property (it only redirects to an existing property),
      * this method ignores all {@code "result.*"} entries in the given {@code identification} map.
      *
-     * <div class="section">Read/write behavior</div>
+     * <h4>Read/write behavior</h4>
      * Since the {@link AbstractOperation#apply Operation.apply(…)} method returns directly the property
      * identified by the {@code referent} argument, the returned property is writable if the referenced
      * property is also writable.
@@ -181,7 +181,7 @@
      *   <li>The delimiter can not contain the {@code '\'} escape character.</li>
      * </ul>
      *
-     * <div class="section">Read/write behavior</div>
+     * <h4>Read/write behavior</h4>
      * This operation supports both reading and writing. When setting a value on the attribute created by this
      * operation, the given string value will be split around the {@code delimiter} and each substring will be
      * forwarded to the corresponding single property.
@@ -249,11 +249,11 @@
      * {@linkplain org.apache.sis.geometry.GeneralEnvelope#getCoordinateReferenceSystem() envelope CRS}
      * will be that CRS.
      *
-     * <div class="section">Limitations</div>
+     * <h4>Limitations</h4>
      * If a geometry contains other geometries, this operation queries only the envelope of the root geometry.
      * It is the root geometry responsibility to take in account the envelope of all its children.
      *
-     * <div class="section">Read/write behavior</div>
+     * <h4>Read/write behavior</h4>
      * This operation is read-only. Calls to {@code Attribute.setValue(Envelope)} will result in an
      * {@link IllegalStateException} to be thrown.
      *
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java b/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
index 19f5ff8..c6867da 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAssociation.java
@@ -28,7 +28,7 @@
  * <div class="note"><b>Note:</b> in the common case where the {@linkplain DefaultAssociationRole association role}
  * restricts the cardinality to [0 … 1], the {@link SingletonAssociation} implementation consumes less memory.</div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code MultiValuedAssociation} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAttribute.java b/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAttribute.java
index 5363bab..6d34b5e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAttribute.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/MultiValuedAttribute.java
@@ -30,7 +30,7 @@
  * <div class="note"><b>Note:</b> in the common case where the {@linkplain DefaultAttributeType attribute type}
  * restricts the cardinality to [0 … 1], the {@link SingletonAttribute} implementation consumes less memory.</div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code MultiValuedAttribute} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java b/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
index 27eb607..17bb4f3 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAssociation.java
@@ -25,7 +25,7 @@
  * While {@link MultiValuedAssociation} would be suitable to all cases, this {@code SingletonAssociation}
  * consumes less memory.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code SingletonAssociation} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java b/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java
index ba3b60f..a088473 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/SingletonAttribute.java
@@ -27,7 +27,7 @@
  * While {@link MultiValuedAttribute} would be suitable to all cases, this {@code SingletonAttribute}
  * consumes less memory.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code SingletonAttribute} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/builder/TypeBuilder.java b/core/sis-feature/src/main/java/org/apache/sis/feature/builder/TypeBuilder.java
index 556c88b..45c54f4 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/builder/TypeBuilder.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/builder/TypeBuilder.java
@@ -49,7 +49,7 @@
  * {@link org.opengis.util.ScopedName}, {@link String} or {@link InternationalString} instance.
  * All other properties are optional.
  *
- * <div class="section">Default namespace</div>
+ * <h2>Default namespace</h2>
  * In many cases, the names of all {@code AttributeType}s and {@code AssociationRole}s to create
  * within a {@code FeatureType} share the same namespace.
  * For making name creations more convenient, the namespace can be
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java b/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java
index 3d489e1..7cba32d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/package-info.java
@@ -49,13 +49,13 @@
  * {@linkplain org.apache.sis.feature.DefaultFeatureType#getSuperTypes() super-types}, provided
  * that values of the sub-type property are assignable to the super-type property.
  *
- * <div class="section">Naming</div>
+ * <h2>Naming</h2>
  * Each feature type has a {@linkplain org.apache.sis.feature.DefaultFeatureType#getName() name},
  * which should be unique. Those names are the main criterion used for checking if a feature type
  * {@linkplain org.apache.sis.feature.DefaultFeatureType#isAssignableFrom is assignable from} another type.
  * Names can be {@linkplain org.apache.sis.util.iso.DefaultScopedName scoped} for avoiding name collision.
  *
- * <div class="section">Class hierarchy</div>
+ * <h2>Class hierarchy</h2>
  * The class hierarchy for feature <cite>types</cite> is derived from ISO 19109 specification.
  * The class hierarchy for feature <cite>instances</cite> is closely related:
  *
@@ -79,7 +79,7 @@
  * {@code      └─} {@linkplain org.apache.sis.feature.AbstractAssociation Feature association} (<cite>singleton</cite> or <cite>multi-valued</cite>)<br>
  * </td></tr></table>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * Classes defined in this package are rarely instantiated directly (by a {@code new} statement).
  * Instead those classes are instantiated indirectly by invoking a method on a parent container,
  * or by using a builder. The starting point is {@code FeatureType}, which may be created by a
diff --git a/core/sis-feature/src/main/java/org/apache/sis/image/WritablePixelIterator.java b/core/sis-feature/src/main/java/org/apache/sis/image/WritablePixelIterator.java
index c27f733..19b42dd 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/image/WritablePixelIterator.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/image/WritablePixelIterator.java
@@ -45,7 +45,7 @@
  *     }
  * }
  *
- * <div class="section">Casting a {@code PixelIterator}</div>
+ * <h2>Casting a {@code PixelIterator}</h2>
  * To check if a {@code PixelIterator} can be used for writing pixels, a {@code … instanceof WritablePixelIterator}
  * check is not sufficient. The {@link PixelIterator#isWritable()} method should be invoked instead.
  *
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
index ed5f5c4..cd4dd36 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
@@ -53,7 +53,7 @@
  *       map returned by {@link org.apache.sis.feature.DefaultAttributeType#characteristics()}.</li>
  * </ul>
  *
- * <div class="section">Mixing with other conventions</div>
+ * <h2>Mixing with other conventions</h2>
  * The conventions defined in this class are specific to Apache SIS.
  * Current implementation does not support any other convention than the SIS one,
  * but we may refactor this class in future SIS versions if there is a need to support different conventions.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
index a634dd8..95dcf08 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
@@ -48,13 +48,13 @@
  * only for small maps (less than 10 elements). Given that objects typically have only one or
  * two identifiers, this is considered acceptable.</p>
  *
- * <div class="section">Special cases</div>
+ * <h2>Special cases</h2>
  * The identifiers for the following authorities are handled in a special way:
  * <ul>
  *   <li>{@link IdentifierSpace#HREF}: handled as a shortcut to {@link XLink#getHRef()}.</li>
  * </ul>
  *
- * <div class="section">Handling of duplicated authorities</div>
+ * <h2>Handling of duplicated authorities</h2>
  * The collection shall not contain more than one identifier for the same
  * {@linkplain Identifier#getAuthority() authority}. However duplications may happen if the user
  * has direct access to the list, for example through {@link Citation#getIdentifiers()}. If such
@@ -71,13 +71,13 @@
  *       to getter methods.</li>
  * </ul>
  *
- * <div class="section">Handling of null identifiers</div>
+ * <h2>Handling of null identifiers</h2>
  * The collection of identifiers shall not contain any null element. This is normally ensured by
  * the {@link org.apache.sis.metadata.ModifiableMetadata} internal collection implementations.
  * This class performs opportunist null checks as an additional safety, but consistency is not
  * guaranteed. See {@link #size()} for more information.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is thread safe if the underlying identifier collection is thread safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/ModifiableIdentifierMap.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/ModifiableIdentifierMap.java
index 8aee37a..0fc131c 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/ModifiableIdentifierMap.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/ModifiableIdentifierMap.java
@@ -32,7 +32,7 @@
 /**
  * A map of identifiers which support {@code put} and {@code remove} operations.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is thread safe if the underlying identifier collection is thread safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/PrimitiveTypeProperties.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/PrimitiveTypeProperties.java
index 855bdf8..ff7a12f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/PrimitiveTypeProperties.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/PrimitiveTypeProperties.java
@@ -41,13 +41,13 @@
      * The map where to store specific instances. Keys are instances of the primitive wrappers considered as nil.
      * Values are the {@code NilReason} why the primitive is missing, or any other property we may want to attach.
      *
-     * <div class="section">Identity comparisons</div>
+     * <h4>Identity comparisons</h4>
      * We really need an identity hash map; using the {@code Object.equals(Object)} method is not allowed here.
      * This is because "nil values" are real values. For example if the type is {@link Integer}, then the nil value
      * is an {@code Integer} instance having the value 0. We don't want to consider every 0 integer value as nil,
      * but only the specific {@code Integer} instance used as sentinel value for nil.
      *
-     * <div class="section">Weak references</div>
+     * <h4>Weak references</h4>
      * We can not use weak value references, because we don't want the {@link NilReason} (the map value) to be lost
      * while the sentinel value (the map key) is still in use. We could use weak references for the keys, but JDK 7
      * does not provides any map implementation which is both an {@code IdentityHashMap} and a {@code WeakHashMap}.
@@ -57,7 +57,7 @@
      * {@code NilReason} instance and its sentinel values will never be garbage-collected.
      * We presume that such cases will be rare enough for not being an issue in practice.
      *
-     * <div class="section">Synchronization</div>
+     * <h4>Synchronization</h4>
      * All accesses to this map shall be synchronized on the map object.
      */
     private static final Map<Object,Object> SENTINEL_VALUES = new IdentityHashMap<>();
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_DateTime.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_DateTime.java
index 02d7aaa..14ee443 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_DateTime.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_DateTime.java
@@ -34,7 +34,7 @@
  * At marshalling time, the choice is performed depending on whatever the given date contains
  * hour, minute or seconds information different than zero.
  *
- * <div class="section">Difference between ISO 19139:2007 and ISO 19115-3:2016</div>
+ * <h2>Difference between ISO 19139:2007 and ISO 19115-3:2016</h2>
  * The ISO {@code baseTypes.xsd} files define two kinds of date property:
  * <ul>
  *   <li>{@code gco:Date_PropertyType} accepts either {@code gco:Date} or {@code gco:DateTime}.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Decimal.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Decimal.java
index e83bd29..417723d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Decimal.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Decimal.java
@@ -27,7 +27,7 @@
  * The JAXB default behavior is to marshal primitive Java types directly, without such wrapper element.
  * The role of this class is to add the {@code <gco:…>} wrapper element required by ISO 19115-3.
  *
- * <div class="section">Relationship with {@code GO_Real}</div>
+ * <h2>Relationship with {@code GO_Real}</h2>
  * This adapter is identical to {@link GO_Real} except for the element name, which is {@code "Decimal"} instead
  * than {@code "Real"}. This adapter is used for the {@code westBoundLongitude}, {@code eastBoundLongitude},
  * {@code southBoundLatitude} and {@code northBoundLatitude} properties of {@code EX_DefaultGeographicBoundingBox}.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Real.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Real.java
index 02f6858..31231f2 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Real.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/GO_Real.java
@@ -27,7 +27,7 @@
  * The JAXB default behavior is to marshal primitive Java types directly, without such wrapper element.
  * The role of this class is to add the {@code <gco:…>} wrapper element required by ISO 19115-3.
  *
- * <div class="section">Relationship with {@code GO_Decimal}</div>
+ * <h2>Relationship with {@code GO_Decimal}</h2>
  * This adapter is identical to {@link GO_Decimal} except for the element name, which is {@code "Real"}
  * instead than {@code "Decimal"}. This adapter is the most widely used one in IS 19139 XML schema.
  * The few exceptions are documented in {@link GO_Decimal}.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/PropertyType.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/PropertyType.java
index be1c147..7e11840 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/PropertyType.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/PropertyType.java
@@ -67,7 +67,7 @@
  *       ISO 19139 schemas.</li>
  * </ul>
  *
- * <div class="section">Guidlines for subclasses</div>
+ * <h2>Guidlines for subclasses</h2>
  * Subclasses shall provide a method returning the SIS implementation class for the metadata value.
  * This method will be systematically called at marshalling time by JAXB. Typical implementation
  * ({@code BoundType} and {@code ValueType} need to be replaced by the concrete class):
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/package-info.java
index 737fc18..b9f2fea 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gco/package-info.java
@@ -47,7 +47,7 @@
  * specifications; they are used only for consistency with current practice in
  * {@link org.apache.sis.internal.jaxb.metadata} and similar packages.
  *
- * <div class="section">Object identification and reference</div>
+ * <h2>Object identification and reference</h2>
  * <ul class="verbose">
  *   <li><code>org.apache.sis.<b>metadata.iso</b></code> public packages:
  *   <ul>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/GMLAdapter.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/GMLAdapter.java
index 8c54196..7047471 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/GMLAdapter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/GMLAdapter.java
@@ -46,7 +46,7 @@
      * The period identifier, or {@code null} if undefined.
      * This element is part of GML 3.1.1 specification.
      *
-     * <div class="section">Difference between {@code gco:uuid} and {@code gml:id}</div>
+     * <h4>Difference between {@code gco:uuid} and {@code gml:id}</h4>
      * <ul>
      *   <li>{@code id} is a standard <strong>GML</strong> attribute available on every
      *       object-with-identity. It has type={@code "xs:ID"} - i.e. it is a fragment
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/Measure.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/Measure.java
index c01cc0d..13e8ddb 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/Measure.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/gml/Measure.java
@@ -42,7 +42,7 @@
  * because that {@code Measure} extends {@link Number} and we are not allowed to use the
  * {@code @XmlValue} annotation on a class that extends another class.</p>
  *
- * <div class="section">XML marshalling</div>
+ * <h2>XML marshalling</h2>
  * Measures are used in different ways by the ISO 19115 (Metadata) and GML standards.
  * The former expresses some measurements with an object of XML type {@code gco:Distance}
  * (as a substitution for XML type {@code gco:Measure}):
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
index 1bb5269..6d9d652 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
@@ -56,7 +56,7 @@
  * parsing and formatting. For real parameter framework, consider using {@link org.apache.sis.parameter}
  * package instead.</p>
  *
- * <div class="section">Note about raw-type usage</div>
+ * <h2>Note about raw-type usage</h2>
  * We use raw type (i.e. we implement {@code ParameterDescriptor} instead of {@code ParameterDescriptor<T>})
  * because there is no way we can know {@code <T>} for sure at unmarshalling time. This is not a recommended
  * practice, so <strong>this class shall not be in public API</strong>.  However it should be okay to create
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
index ecd1f15..24080ec 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/package-info.java
@@ -23,7 +23,7 @@
  * This package is for internal use by SIS only. Classes in this package
  * may change in incompatible ways in any future version without notice.
  *
- * <div class="section">Main content</div>
+ * <h2>Main content</h2>
  * {@link org.apache.sis.internal.jaxb.IdentifierMapAdapter} is our internal implementation of
  * the public {@link org.apache.sis.xml.IdentifierMap} interface. The actual implementation is
  * usually the {@code ModifiableIdentifierMap} subclass.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/package-info.java
index 02e2403..8e3fe15 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/sql/package-info.java
@@ -23,7 +23,7 @@
  * This package is for internal use by SIS only. Classes in this package
  * may change in incompatible ways in any future version without notice.
  *
- * <div class="section">Declaring the data source in a web container</div>
+ * <h2>Declaring the data source in a web container</h2>
  * The {@link org.apache.sis.internal.metadata.sql.Initializer#getDataSource()} method gets the unique,
  * SIS-wide, data source for JDBC connection to the {@code $SIS_DATA/Databases/SpatialMetadata}.
  * The method Javadoc describes the steps for fetching that data source.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/xml/Schemas.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/xml/Schemas.java
index ff5f307..656461e 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/xml/Schemas.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/xml/Schemas.java
@@ -28,7 +28,7 @@
  *   <li>Constants with the {@code _XSD} suffix are {@code "http://"} URL to a the XSD definition file.</li>
  * </ul>
  *
- * <div class="section">Note on multi-lingual files</div>
+ * <h2>Note on multi-lingual files</h2>
  * Some files are available in two variants: with and without {@code "ML_"} prefix, which stands for "Multi Lingual".
  * Some examples are {@code "[ML_]gmxCodelists.xml"} and {@code "[ML_]gmxUom.xml"}. The following assumptions hold:
  *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
index 1431bda..0caf8a3 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java
@@ -62,7 +62,7 @@
  * </tr>
  * </table>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * Instances of this class are <strong>not</strong> synchronized for multi-threading.
  * Synchronization, if needed, is caller's responsibility. Note that synchronization locks
  * are not necessarily the metadata instances. For example an other common approach is to
@@ -89,7 +89,7 @@
      * Subclasses will typically return a hard-coded constant such as
      * {@link MetadataStandard#ISO_19115}.
      *
-     * <div class="section">Note for implementers</div>
+     * <h4>Note for implementers</h4>
      * Implementation of this method shall not depend on the object state,
      * since this method may be indirectly invoked by copy constructors.
      *
@@ -123,7 +123,7 @@
      *
      * Note that empty properties can be removed by calling the {@link ModifiableMetadata#prune()} method.
      *
-     * <div class="section">Note for implementers</div>
+     * <h4>Note for implementers</h4>
      * The default implementation uses Java reflection indirectly, by iterating over all entries
      * returned by {@link MetadataStandard#asValueMap(Object, Class, KeyNamePolicy, ValueExistencePolicy)}.
      * Subclasses that override this method should usually not invoke {@code super.isEmpty()},
@@ -155,19 +155,19 @@
      * object, so changes in the underlying metadata object are immediately reflected in the map
      * and conversely.
      *
-     * <div class="section">Supported operations</div>
+     * <h4>Supported operations</h4>
      * The map supports the {@link Map#put(Object, Object) put(…)} and {@link Map#remove(Object)
      * remove(…)} operations if the underlying metadata object contains setter methods.
      * The {@code remove(…)} method is implemented by a call to {@code put(…, null)}.
      *
-     * <div class="section">Keys and values</div>
+     * <h4>Keys and values</h4>
      * The keys are case-insensitive and can be either the JavaBeans property name, the getter method name
      * or the {@linkplain org.opengis.annotation.UML#identifier() UML identifier}. The value given to a call
      * to the {@code put(…)} method shall be an instance of the type expected by the corresponding setter method,
      * or an instance of a type {@linkplain org.apache.sis.util.ObjectConverters#find(Class, Class) convertible}
      * to the expected type.
      *
-     * <div class="section">Multi-values entries</div>
+     * <h4>Multi-values entries</h4>
      * Calls to {@code put(…)} replace the previous value, with one noticeable exception: if the metadata
      * property associated to the given key is a {@link java.util.Collection} but the given value is a single
      * element (not a collection), then the given value is {@linkplain java.util.Collection#add(Object) added}
@@ -176,7 +176,7 @@
      * values, then make sure that the given value is a collection when the associated metadata property expects
      * such collection.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation is equivalent to the following method call:
      *
      * {@preformat java
@@ -233,7 +233,7 @@
      *       in a geographic bounding box spanning the anti-meridian.</li>
      * </ul>
      *
-     * <div class="section">Write operations</div>
+     * <h4>Write operations</h4>
      * Only the {@code VALUE} column may be writable, with one exception: newly created children need
      * to have their {@code IDENTIFIER} set before any other operation. For example the following code
      * adds a title to a citation:
@@ -249,7 +249,7 @@
      * Nodes can be removed by invoking the {@link java.util.Iterator#remove()} method on the
      * {@linkplain org.apache.sis.util.collection.TreeTable.Node#getChildren() children} iterator.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation is equivalent to the following method call:
      *
      * {@preformat java
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
index ef9257d..60653e9 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java
@@ -73,7 +73,7 @@
  * The {@code AbstractMetadata} base class usually form the basis of ISO 19115 implementations but
  * can also be used for other standards.
  *
- * <div class="section">Defining new {@code MetadataStandard} instances</div>
+ * <h2>Defining new {@code MetadataStandard} instances</h2>
  * Users should use the pre-defined constants when applicable.
  * However if new instances need to be defined, then there is a choice:
  *
@@ -85,7 +85,7 @@
  *       method must be overridden in a {@code MetadataStandard} subclass.</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code MetadataStandard} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses shall make sure that any overridden methods remain safe to call
  * from multiple threads, because the same {@code MetadataStandard} instances are typically referenced
@@ -822,21 +822,21 @@
      * {@code valuePolicy} determines whether entries having a null value or an empty collection
      * shall be included in the map.</p>
      *
-     * <div class="section">Supported operations</div>
+     * <h4>Supported operations</h4>
      * The map supports the {@link Map#put(Object, Object) put(…)} and {@link Map#remove(Object)
      * remove(…)} operations if the underlying metadata object contains setter methods.
      * The {@code remove(…)} method is implemented by a call to {@code put(…, null)}.
      * Note that whether the entry appears as effectively removed from the map or just cleared
      * (i.e. associated to a null value) depends on the {@code valuePolicy} argument.
      *
-     * <div class="section">Keys and values</div>
+     * <h4>Keys and values</h4>
      * The keys are case-insensitive and can be either the JavaBeans property name, the getter method name
      * or the {@linkplain org.opengis.annotation.UML#identifier() UML identifier}. The value given to a call
      * to the {@code put(…)} method shall be an instance of the type expected by the corresponding setter method,
      * or an instance of a type {@linkplain org.apache.sis.util.ObjectConverters#find(Class, Class) convertible}
      * to the expected type.
      *
-     * <div class="section">Multi-values entries</div>
+     * <h4>Multi-values entries</h4>
      * Calls to {@code put(…)} replace the previous value, with one noticeable exception: if the metadata
      * property associated to the given key is a {@link java.util.Collection} but the given value is a single
      * element (not a collection), then the given value is {@linkplain java.util.Collection#add(Object) added}
@@ -845,7 +845,7 @@
      * values, then make sure that the given value is a collection when the associated metadata property expects
      * such collection.
      *
-     * <div class="section">Disambiguating instances that implement more than one metadata interface</div>
+     * <h4>Disambiguating instances that implement more than one metadata interface</h4>
      * It is some time convenient to implement more than one interface by the same class.
      * For example an implementation interested only in extents defined by geographic bounding boxes could implement
      * {@link org.opengis.metadata.extent.Extent} and {@link org.opengis.metadata.extent.GeographicBoundingBox}
@@ -916,7 +916,7 @@
      *       in a geographic bounding box spanning the anti-meridian.</li>
      * </ul>
      *
-     * <div class="section">Write operations</div>
+     * <h4>Write operations</h4>
      * Only the {@code VALUE} column may be writable, with one exception: newly created children need
      * to have their {@code IDENTIFIER} set before any other operation. For example the following code
      * adds a title to a citation:
@@ -934,7 +934,7 @@
      * Note that whether the child appears as effectively removed from the node or just cleared
      * (i.e. associated to a null value) depends on the {@code valuePolicy} argument.
      *
-     * <div class="section">Disambiguating instances that implement more than one metadata interface</div>
+     * <h4>Disambiguating instances that implement more than one metadata interface</h4>
      * If the given {@code metadata} instance implements more than one interface recognized by this
      * {@code MetadataStandard}, then the {@code baseType} argument need to be non-null in order to
      * specify which interface to reflect in the tree.
@@ -966,7 +966,7 @@
      * this {@code MetadataStandard}, otherwise an exception will be thrown. However the two
      * arguments do not need to be the same implementation class.
      *
-     * <div class="section">Shallow or deep comparisons</div>
+     * <h4>Shallow or deep comparisons</h4>
      * This method implements a <cite>shallow</cite> comparison in that properties are compared by
      * invoking their {@code properties.equals(…)} method without <em>explicit</em> recursive call
      * to this {@code standard.equals(…)} method for children metadata. However the comparison will
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataVisitor.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataVisitor.java
index dcf432d..80859d2 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataVisitor.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataVisitor.java
@@ -54,7 +54,7 @@
      * Keys are visited metadata instances and values are computed value. The value may be null if
      * the computation is in progress.
      *
-     * <div class="section">The problem</div>
+     * <h4>The problem</h4>
      * Cyclic associations can exist in ISO 19115 metadata. For example {@code Instrument} has a reference
      * to the platform it is mounted on, and the {@code Platform} has a list of instruments mounted on it.
      * Consequently walking down the metadata tree can cause infinite recursivity, unless we keep trace of
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
index 516c144..1c06835 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
@@ -50,7 +50,7 @@
  * The metadata can be populated using the setter methods provided by subclasses, then transition to the
  * {@linkplain State#FINAL final} state for making it safe to share by many consumers.
  *
- * <div class="section">Tip for subclass implementations</div>
+ * <h2>Tip for subclass implementations</h2>
  * Subclasses can follow the pattern below for every {@code get} and {@code set} methods,
  * with a different processing for singleton value or for {@linkplain Collection collections}.
  *
@@ -386,7 +386,7 @@
      *   <li>Copies the content of the given {@code source} into the target.</li>
      * </ul>
      *
-     * <div class="section">Choosing a collection type</div>
+     * <h4>Choosing a collection type</h4>
      * Implementations shall invoke {@link #writeList writeList} or {@link #writeSet writeSet} methods
      * instead than this method when the collection type is enforced by ISO specification.
      * When the type is not enforced by the specification, some freedom are allowed at
@@ -698,7 +698,7 @@
      * Returns the specified collection, or a new one if {@code current} is null.
      * This is a convenience method for implementation of {@code getFoo()} methods.
      *
-     * <div class="section">Choosing a collection type</div>
+     * <h4>Choosing a collection type</h4>
      * Implementations shall invoke {@link #nonNullList nonNullList(…)} or {@link #nonNullSet nonNullSet(…)}
      * instead than this method when the collection type is enforced by ISO specification.
      * When the type is not enforced by the specification, some freedom are allowed at implementer choice.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
index b80c900..852a4fc 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyAccessor.java
@@ -72,7 +72,7 @@
  *       XML marshalling.</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code PropertyAccessor} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses shall make sure that any overridden methods remain safe to call
  * from multiple threads, because the same {@code PropertyAccessor} instances are typically used by many
@@ -928,7 +928,7 @@
      * of a single argument and return value because an array will be needed anyway for invoking
      * the {@link #convert(Object[], Class)} and {@link Method#invoke(Object, Object[])} methods.
      *
-     * <div class="section">The collection special case</div>
+     * <h4>The collection special case</h4>
      * If the metadata property is a collection, then there is a choice:
      *
      * <ul>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java
index 346a752..16cfb63 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/PropertyInformation.java
@@ -51,7 +51,7 @@
  * instance as the set of all possible values for the property. If the information had a {@code contains(E)} method,
  * it would return {@code true} if the given value is valid for that property.</div>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNodeChildren.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNodeChildren.java
index aade06c..1c475d9 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNodeChildren.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNodeChildren.java
@@ -33,7 +33,7 @@
  * This collection holds a reference to the metadata object at creation time;
  * it does not track changes in {@code parent.getUserObject()}.
  *
- * <div class="section">Note on value existence policy</div>
+ * <h2>Note on value existence policy</h2>
  * It is better to use this class with {@link ValueExistencePolicy#NON_EMPTY} in order
  * to avoid code complication and surprising behavior of {@link Iter#remove()} operation.
  * If the policy is set to another value, we need to keep the following aspects in mind:
@@ -201,7 +201,7 @@
      * value policy. To check if the element shall be considered as removed (for example
      * in order to update index), invoke {@code isSkipped(value)} after this method.</p>
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * This method sets the property to {@code null}. This is not strictly correct for collections,
      * since we should rather set the property to an empty collection. However this approach would
      * force us to check if the expected collection type is actually a list, a set or any other type.
@@ -345,7 +345,7 @@
      * Each element is identified by its index in the {@link PropertyAccessor}, together with
      * its position in its sub-iterator when the metadata property is a collection.
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * It could be cheaper to not take an iterator for the properties that are collections,
      * and instead just increment a "sub-index" from 0 to the collection size.  It would be
      * cheaper because we don't really need to extract the values of those collections (i.e.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueExistencePolicy.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueExistencePolicy.java
index a2683c1..7acb6a1 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueExistencePolicy.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueExistencePolicy.java
@@ -30,7 +30,7 @@
  * {@linkplain java.util.Collection#isEmpty() empty collections}.
  * This enumeration allows to control this behavior.
  *
- * <div class="section">Difference between null and nil</div>
+ * <h2>Difference between null and nil</h2>
  * A null property is a reference which is {@code null} in the Java sense.
  * Null references can be used for missing properties when no information is provided about why the property is missing.
  * On the other hand, a nil object is a placeholder for a missing property similar in purpose to {@code null} references,
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java
index dc0da5c..29f963f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultIdentifier.java
@@ -60,7 +60,7 @@
  * which is a class unrelated to the usual {@code org.apache.metadata} hierarchy
  * because of the immutable nature of referencing objects.</p>
  *
- * <div class="section">Text, URN and XML representations</div>
+ * <h2>Text, URN and XML representations</h2>
  * The XML representation of {@link DefaultIdentifier} is as the following example:
  *
  * {@preformat xml
@@ -78,7 +78,7 @@
  *   </mcc:MD_Identifier>
  * }
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
index 43cad25..d37f1ea 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultMetadata.java
@@ -121,7 +121,7 @@
  * {@code       ├─title………………………………………………} Name by which the cited resource is known.
  * {@code       └─date…………………………………………………} Reference date for the cited resource.</div>
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * When this object is marshalled as an ISO 19139 compliant XML document, the value
  * given to the {@link #setLanguage(Locale)} method will be used for the localization
  * of {@link org.opengis.util.InternationalString} and {@link org.opengis.util.CodeList}
@@ -129,7 +129,7 @@
  * INSPIRE rules. If no language were specified, then the default locale will be the one
  * defined in the {@link org.apache.sis.xml.XML#LOCALE} marshaller property, if any.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
index 756b771..90d22a0 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
@@ -114,7 +114,7 @@
      * Returns the metadata standard implemented by subclasses,
      * which is {@linkplain MetadataStandard#ISO_19115 ISO 19115}.
      *
-     * <div class="section">Note for implementers</div>
+     * <h4>Note for implementers</h4>
      * Subclasses shall not override this method in a way that depends on the object state,
      * since this method may be indirectly invoked by copy constructors (i.e. is may be
      * invoked before this metadata object is fully constructed).
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java
index 6c3f97b..dbd681f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/DefaultObjective.java
@@ -173,7 +173,7 @@
     /**
      * Returns the code used to identify the objective.
      *
-     * <div class="section">Unified identifiers view</div>
+     * <h4>Unified identifiers view</h4>
      * In this SIS implementation, the collection returned by this method includes the XML identifiers
      * ({@linkplain IdentifierSpace#ID ID}, {@linkplain IdentifierSpace#UUID UUID}, <i>etc.</i>),
      * thus providing a unified view of every kind of identifiers associated to this objective.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java
index 784639c..226e89d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/acquisition/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.acquisition OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -70,7 +70,7 @@
  * {@code  └─}             {@linkplain org.apache.sis.metadata.iso.acquisition.DefaultEnvironmentalRecord    Environmental record}<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
index c1e3b1b..7f7e6a9 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/Citations.java
@@ -97,7 +97,7 @@
      * providing for example a unified view of {@code MI_Band} and {@code MD_Band}). This is why those standards
      * are defined in a collection rather than as separated constants.
      *
-     * <div class="section">Content and future evolution</div>
+     * <h4>Content and future evolution</h4>
      * The content of this list may vary in future Apache SIS versions depending on the evolution of standards
      * and in the way that SIS support them. The current content is:
      *
@@ -106,7 +106,7 @@
      *   <li>{@linkplain org.opengis.annotation.Specification#ISO_19115_2 ISO 19115-2:2019} at index 1.</li>
      * </ul>
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.metadata.iso.DefaultMetadata#getMetadataStandards()}</li>
@@ -156,7 +156,7 @@
      * The citation {@linkplain DefaultCitation#getCitedResponsibleParties() responsible party} is
      * the IOGP organization, but the {@linkplain IdentifierSpace#getName() namespace} is {@code "EPSG"}.
      *
-     * <div class="section">When to use "EPSG" and "IOGP"</div>
+     * <h4>When to use "EPSG" and "IOGP"</h4>
      * For all usages except GML, the {@code "EPSG"} namespace shall be used for identifying
      * {@linkplain org.apache.sis.referencing.crs.AbstractCRS Coordinate Reference System} objects.
      * But in the particular case of GML, both {@code "EPSG"} and {@code "IOGP"} appear in different locations.
@@ -181,7 +181,7 @@
      * the {@code "IOGP:EPSG"} identifier is handled in a special way by {@link #getIdentifier(Citation)},
      * which return only {@code "EPSG"}.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -204,7 +204,7 @@
      * The {@linkplain IdentifierSpace#getName() namespace} declared by this constant is {@code "OGC"},
      * but the {@code "CRS"}, {@code "AUTO"} and {@code "AUTO2"} namespaces are also commonly found in practice.</p>
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.factory.CommonAuthorityFactory#getAuthority()}</li>
@@ -237,7 +237,7 @@
      * <tr><td>{@code "OGC:false_northing"}</td>    <td>False northing</td></tr>
      * </table></div>
      *
-     * <div class="section">Specifications referenced</div>
+     * <h4>Specifications referenced</h4>
      * The specification actually referenced by this citation is implementation dependent
      * and may change in future SIS version. Some of the specifications used are:
      *
@@ -250,7 +250,7 @@
      * We do not commit to a particular OGC specification in order to keep the flexibility to change the
      * {@linkplain DefaultCitation#getTitle() title} or URL according newer OGC publications.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -283,7 +283,7 @@
      * <tr><td>{@code "ESRI:False_Northing"}</td>    <td>{@code "OGC:false_northing"}</td></tr>
      * </table></div>
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -318,7 +318,7 @@
      * <tr><td>{@code "NetCDF:false_northing"}</td>                    <td>False northing</td></tr>
      * </table></div>
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -333,7 +333,7 @@
      * the <a href="http://trac.osgeo.org/geotiff/">GeoTIFF</a> specification.
      * This specification identifies some map projections by their own numerical codes.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -346,7 +346,7 @@
     /**
      * The authority for identifiers of objects defined by the <a href="https://proj4.org/">Proj.4</a> project.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -359,7 +359,7 @@
     /**
      * The authority for identifiers of objects defined by MapInfo.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -373,7 +373,7 @@
      * The <a href="http://www.iho.int/iho_pubs/standard/S-57Ed3.1/31Main.pdf">IHO transfer standard
      * for digital hydrographic data</a> specification.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.referencing.ImmutableIdentifier#getAuthority()}</li>
@@ -388,7 +388,7 @@
      * The ISO 19115 metadata standard defines a specific attribute for this information,
      * but the SIS library handles it like any other identifier.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link DefaultCitation#getIdentifiers()}</li>
@@ -403,7 +403,7 @@
      * The ISO 19115 metadata standard defines a specific attribute for this information,
      * but the SIS library handles it like any other identifier.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link DefaultCitation#getIdentifiers()}</li>
@@ -416,7 +416,7 @@
     /**
      * The codespace of objects that are specific to the <a href="http://sis.apache.org">Apache SIS</a> project.
      *
-     * <div class="section">Main usage</div>
+     * <h4>Main usage</h4>
      * This value can be returned by:
      * <ul>
      *   <li>{@link org.apache.sis.metadata.iso.quality.DefaultConformanceResult#getSpecification()}</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultCitation.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultCitation.java
index e6f945f..166ad72 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultCitation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultCitation.java
@@ -56,13 +56,13 @@
  * {@code   ├─title………………………} Name by which the cited resource is known.
  * {@code   └─date…………………………} Reference date for the cited resource.</div>
  *
- * <div class="section">Unified identifiers view</div>
+ * <h2>Unified identifiers view</h2>
  * The ISO 19115 model provides specific attributes for the {@linkplain #getISBN() ISBN} and
  * {@linkplain #getISSN() ISSN} codes. However the SIS library handles those codes like any
  * other identifiers. Consequently the ISBN and ISSN codes are included in the collection
  * returned by {@link #getIdentifiers()}, except at XML marshalling time (for ISO 19115-3 compliance).
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
@@ -363,7 +363,7 @@
      *
      * <div class="note"><b>Example:</b> Universal Product Code (UPC), National Stock Number (NSN).</div>
      *
-     * <div class="section">Unified identifiers view</div>
+     * <h4>Unified identifiers view</h4>
      * In this SIS implementation, the collection returned by this method includes the XML identifiers
      * ({@linkplain IdentifierSpace#ID ID}, {@linkplain IdentifierSpace#UUID UUID}, <i>etc.</i>),
      * as well as the {@linkplain #getISBN() ISBN} and {@linkplain #getISSN() ISSN} codes, thus
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
index 7670622..4981fb0 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
@@ -50,7 +50,7 @@
  * <div class="preformat">{@code CI_Telephone}
  * {@code   └─number……} Telephone number by which individuals can contact responsible organisation or individual.</div>
  *
- * <div class="section">Differences between versions 2003 and 2014 of ISO 19115</div>
+ * <h2>Differences between versions 2003 and 2014 of ISO 19115</h2>
  * For any contact having more than one telephone number, the way to organize the information
  * changed significantly between the two versions of ISO standard:
  *
@@ -63,7 +63,7 @@
  *       {@link #getNumber()} and {@link #getNumberType()}.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/package-info.java
index 12aed4f..4573abe 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.citation OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -62,14 +62,14 @@
  * {@code  └─}             {@linkplain org.apache.sis.metadata.iso.citation.DefaultSeries           Series}<br>
  * </td></tr></table>
  *
- * <div class="section">Unified identifiers view</div>
+ * <h2>Unified identifiers view</h2>
  * Apache SIS provides a unified view of all metadata identifiers. This view includes the citation
  * {@linkplain org.apache.sis.metadata.iso.citation.DefaultCitation#getISBN() ISBN} and
  * {@linkplain org.apache.sis.metadata.iso.citation.DefaultCitation#getISSN() ISSN} codes,
  * except at XML marshalling time (for ISO 19115-3 compliance).
  * See {@link org.apache.sis.xml.IdentifierMap} for more information.
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraints.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraints.java
index 4f0173e..331e70c 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraints.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraints.java
@@ -39,7 +39,7 @@
  * {@linkplain #getAccessConstraints() access constraints} and/or {@linkplain #getUseConstraints()
  * use constraints} elements have a value of {@link Restriction#OTHER_RESTRICTIONS}.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/package-info.java
index fb17285..4a2d6b0 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.constraint OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -46,7 +46,7 @@
  * {@code  └─} {@linkplain org.opengis.metadata.constraint.Classification                    Classification} «code list»<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/package-info.java
index 069dbb5..4146cd1 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/content/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.content OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -63,7 +63,7 @@
  * {@code  └─}     {@linkplain org.opengis.metadata.content.ImagingCondition                          Imaging condition} «code list»<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultStandardOrderProcess.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultStandardOrderProcess.java
index 5ef1bc8..963642a 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultStandardOrderProcess.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultStandardOrderProcess.java
@@ -196,11 +196,11 @@
     /**
      * Returns the monetary units of the {@link #getFees() fees} (as specified in ISO 4217).
      *
-     * <p><b>Constraints:</b><br>
+     * <h4>Constraints</h4>
      * For ISO 19115 compatibility reasons, this method is <strong>not</strong> required to return
      * a non-null value even if the text returned by {@link #getFees()} contains a currency units.
      * However if this method returns a non-null value, then that value is required to be consistent
-     * with the fees text.</p>
+     * with the fees text.
      *
      * @return the fees monetary units, or {@code null} if none or unknown.
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java
index 3eec753..c04e4e5 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.distribution OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -52,7 +52,7 @@
  *                     {@linkplain org.apache.sis.metadata.iso.distribution.DefaultDataFile               Data file}<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
index c1eeeb3..78947a7 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultExtent.java
@@ -70,7 +70,7 @@
  *   <li>{@link Extents#getGeographicBoundingBox(Extent)} for extracting a global geographic bounding box.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
index 457eba1..3e376d4 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultGeographicBoundingBox.java
@@ -62,7 +62,7 @@
  *   <li>{@link #intersect(GeographicBoundingBox)} for the intersection between the two bounding boxes.</li>
  * </ul>
  *
- * <div class="section">Validation and normalization</div>
+ * <h2>Validation and normalization</h2>
  * All constructors and setter methods in this class perform the following argument validation or normalization:
  *
  * <ul>
@@ -81,7 +81,7 @@
  * {@linkplain #getEastBoundLongitude() east bound longitude}, then the box spans the anti-meridian.
  * See {@linkplain org.apache.sis.geometry.GeneralEnvelope} for more information on anti-meridian spanning.
  *
- * <div class="note"><b>Note: relationship with Envelope classes</b><br>
+ * <h2>Relationship with Envelope classes</h2>
  * The {@link org.apache.sis.geometry} package provides various {@code Envelope} classes serving a simular purpose.
  * The main difference is that envelopes can be expressed in any {@linkplain org.apache.sis.referencing.crs.AbstractCRS
  * Coordinate Reference System} (for example using any map projection), may have any number of dimensions, axes may have
@@ -94,9 +94,8 @@
  * box should be used only as a convenient way to give an <em>approximate</em> description of a location.
  * Users can assume a precision of about 0.01° for the latitude and longitude values in this class.
  * If more precision is desired, an {@code Envelope} should be considered instead.
- * </div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
index 2bdc4fd..826fd82 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultTemporalExtent.java
@@ -50,7 +50,7 @@
  *   <li>{@link #setBounds(Envelope)} for setting the extent from the given envelope.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
index b42af41..c915b5e 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/DefaultVerticalExtent.java
@@ -50,7 +50,7 @@
  *   <li>{@link #setBounds(Envelope)} for setting the extent from the given envelope.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
index 11c38e6..119af52 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
@@ -179,7 +179,7 @@
      * {@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis#getDirection() axis direction}
      * is toward down, then this method reverses the sign of minimum and maximum values.
      *
-     * <div class="section">Multi-occurrences</div>
+     * <h4>Multi-occurrences</h4>
      * If the given {@code Extent} object contains more than one vertical extent, then this method
      * performs a choice based on the vertical datum and the unit of measurement:
      *
@@ -492,7 +492,7 @@
      * <p>This method never modify the given extents, but may return directly one of the given arguments
      * if it already represents the intersection result.</p>
      *
-     * <div class="section">Advantage and inconvenient of this method</div>
+     * <h4>Advantage and inconvenient of this method</h4>
      * This method can not intersect extents defined with different datums because height transformations
      * generally require the geodetic positions (latitudes and longitudes) of the heights to transform.
      * For more general transformations, it is better to convert all extent components into a single envelope,
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/package-info.java
index b8ecfe2..685c216 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.extent OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -117,7 +117,7 @@
  *   </li>
  * </ul>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
index a939699..0c5314d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAggregateInformation.java
@@ -56,7 +56,7 @@
  * {@code AssociatedResource} interface (tentatively in GeoAPI 3.1 or 4.0).
  * </div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
index 486b965..0131685 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
@@ -52,7 +52,7 @@
  * According ISO 19115, at least one of {@linkplain #getName() name} and
  * {@linkplain #getMetadataReference() metadata reference} shall be provided.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
index f6abb5a..9063a05 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
@@ -60,7 +60,7 @@
  *   <li>{@link #setScale(double)} for computing the denominator from a scale value.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultResolution.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultResolution.java
index 6fb6dec..f128582 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultResolution.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultResolution.java
@@ -58,7 +58,7 @@
  * See the {@linkplain #DefaultResolution(Resolution) constructor javadoc}
  * for information about which property has precedence on copy operations.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
@@ -250,7 +250,7 @@
     /**
      * Sets the level of detail expressed as the scale of a comparable hardcopy map or chart.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
@@ -276,7 +276,7 @@
     /**
      * Sets the ground sample distance.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
@@ -307,7 +307,7 @@
     /**
      * Sets the vertical sampling distance.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
@@ -340,7 +340,7 @@
     /**
      * Sets the angular sampling measure.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
@@ -372,7 +372,7 @@
     /**
      * Sets the textual description of the spatial resolution of the resource.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/package-info.java
index 570360e..d5b31fd 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.identification OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -78,7 +78,7 @@
  *       for computing the denominator from a scale value.</li>
  * </ul>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultLineage.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
index 55c05b3..daf9d47 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
@@ -64,7 +64,7 @@
  * At least one of {@linkplain #getStatement statement}, {@linkplain #getProcessSteps() process steps}
  * and {@link #getSources() sources} shall be provided.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultSource.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultSource.java
index fe4baa2..0c13ea5 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultSource.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/DefaultSource.java
@@ -73,7 +73,7 @@
  * According ISO 19115, at least one of {@linkplain #getDescription() description} and
  * {@linkplain #getSourceExtents() source extents} shall be provided.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/package-info.java
index add3b23..03a0a45 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/lineage/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.lineage OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -48,7 +48,7 @@
  * {@code      └─}     {@linkplain org.apache.sis.metadata.iso.lineage.DefaultProcessStepReport Process step report}<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
index 143f6bf..3e97914 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
@@ -56,7 +56,7 @@
  * only one of the properties in this class can be set to a non-empty value.
  * Setting any property to a non-empty value discard all the other ones.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
@@ -335,7 +335,7 @@
     /**
      * Sets the dataset to which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
@@ -359,7 +359,7 @@
      * “<cite>Administrative area A — Road network</cite>” description.
      * </div>
      *
-     * <div class="section">Conditions</div>
+     * <h4>Conditions</h4>
      * This method returns a modifiable collection only if no other property is set.
      * Otherwise, this method returns an unmodifiable empty collection.
      *
@@ -378,7 +378,7 @@
     /**
      * Sets the feature types to which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-empty, then this method automatically
      * discards all other properties.
      *
@@ -401,7 +401,7 @@
      * “<cite>Administrative area A — Overhead clearance</cite>” description.
      * </div>
      *
-     * <div class="section">Conditions</div>
+     * <h4>Conditions</h4>
      * This method returns a modifiable collection only if no other property is set.
      * Otherwise, this method returns an unmodifiable empty collection.
      *
@@ -420,7 +420,7 @@
     /**
      * Sets the attribute types to which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-empty, then this method automatically
      * discards all other properties.
      *
@@ -443,7 +443,7 @@
      * “<cite>Administrative area A — New bridge</cite>” description.
      * </div>
      *
-     * <div class="section">Conditions</div>
+     * <h4>Conditions</h4>
      * This method returns a modifiable collection only if no other property is set.
      * Otherwise, this method returns an unmodifiable empty collection.
      *
@@ -462,7 +462,7 @@
     /**
      * Sets the feature instances to which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-empty, then this method automatically
      * discards all other properties.
      *
@@ -485,7 +485,7 @@
      * “<cite>Administrative area A — New bridge — Overhead clearance</cite>” description.
      * </div>
      *
-     * <div class="section">Conditions</div>
+     * <h4>Conditions</h4>
      * This method returns a modifiable collection only if no other property is set.
      * Otherwise, this method returns an unmodifiable empty collection.
      *
@@ -504,7 +504,7 @@
     /**
      * Sets the attribute instances to which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-empty, then this method automatically
      * discards all other properties.
      *
@@ -537,7 +537,7 @@
      * Sets the class of information that does not fall into the other categories to
      * which the information applies.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the {@code newValue} is non-null, then this method automatically
      * discards all other properties.
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/package-info.java
index 6248e4e..6cef01f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.maintenance OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -44,7 +44,7 @@
  * {@code      └─} {@linkplain org.apache.sis.metadata.iso.maintenance.DefaultScopeDescription   Scope description}<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/package-info.java
index 8040d05..2534760 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  * For some explanation about how to use various ISO 19115 elements for scientific dataset, the
  * <a href="https://geo-ide.noaa.gov/wiki/index.php?title=Category:ISO_19115">NOAA wiki page</a>
@@ -55,7 +55,7 @@
  * {@code  └─}         {@linkplain org.apache.sis.metadata.iso.DefaultIdentifier                   Identifier}<br>
  * </td></tr></table>
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * When a metadata object is marshalled as an ISO 19115-3 compliant XML document, the marshaller
  * {@link org.apache.sis.xml.XML#LOCALE} property will be used for the localization of every
  * {@link org.opengis.util.InternationalString} and {@link org.opengis.util.CodeList} instances,
@@ -64,7 +64,7 @@
  * {@link org.apache.sis.metadata.iso.DefaultMetadata#setLanguage setLanguage(Locale)} method
  * will have precedence. The later behavior is compliant with INSPIRE rules.
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
index 6caca41..9cb894d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultDataQuality.java
@@ -43,7 +43,7 @@
  * and {@linkplain #getReports() reports} is provided. Those properties are declared
  * {@linkplain org.opengis.annotation.Obligation#CONDITIONAL conditional}.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResult.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResult.java
index aadbc2a..176519d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResult.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResult.java
@@ -159,7 +159,7 @@
     /**
      * Return the value type for reporting a data quality result.
      *
-     * <div class="section">Default value</div>
+     * <h4>Default value</h4>
      * If no type has been set but all {@linkplain #getValues() values} are of the same type,
      * then this method defaults to that type. Otherwise this method returns {@code null}.
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java
index d27c272..60e616f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/quality/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.quality OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -91,7 +91,7 @@
  *                     {@linkplain org.apache.sis.metadata.iso.quality.DefaultCoverageResult                     Coverage result}<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/DefaultGeorectified.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/DefaultGeorectified.java
index 50149d7..583e43b 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/DefaultGeorectified.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/DefaultGeorectified.java
@@ -55,7 +55,7 @@
  * that {@linkplain #isCheckPointAvailable() check point availability} is {@code true}.
  * The setter methods will ensure that this condition is not violated.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Instances of this class are not synchronized for multi-threading.
  *       Synchronization, if needed, is caller's responsibility.</li>
@@ -211,7 +211,7 @@
      * Sets an indication of whether or not geographic position points are available to test the
      * accuracy of the georeferenced grid data.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the given {@code newValue} is {@code false}, then this method automatically hides
      * the {@linkplain #setCheckPointDescription check point description} property. The description can
      * be shown again by reverting {@code checkPointAvailability} to {@code true}.
@@ -248,7 +248,7 @@
      * Sets the description of geographic position points used to test the accuracy of the
      * georeferenced grid data.
      *
-     * <div class="section">Effect on other properties</div>
+     * <h4>Effect on other properties</h4>
      * If and only if the given {@code newValue} is non-null, then this method automatically sets
      * the {@linkplain #setCheckPointAvailable check point availability} property to {@code true}.
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/package-info.java
index e4c7f1c..7e70d6d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/spatial/package-info.java
@@ -20,7 +20,7 @@
  * An explanation for this package is provided in the {@linkplain org.opengis.metadata.spatial OpenGIS® javadoc}.
  * The remaining discussion on this page is specific to the SIS implementation.
  *
- * <div class="section">Overview</div>
+ * <h2>Overview</h2>
  * For a global overview of metadata in SIS, see the {@link org.apache.sis.metadata} package javadoc.
  *
  * <table class="sis">
@@ -66,7 +66,7 @@
  *                 {@linkplain org.opengis.metadata.spatial.SpatialRepresentationType                 Spatial representation type} «code list»<br>
  * </td></tr></table>
  *
- * <div class="section">Null values, nil objects and collections</div>
+ * <h2>Null values, nil objects and collections</h2>
  * All constructors and setter methods accept {@code null} arguments.
  * A null argument value means that the metadata element can not be provided, and the reason for that is unspecified.
  * Alternatively, users can specify why a metadata element is missing by providing a value created by
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/package-info.java
index cd3cb39..4ce3bba 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/package-info.java
@@ -18,13 +18,13 @@
 /**
  * Root package for various metadata implementations.
  *
- * <div class="section">Foreword</div>
+ * <h2>Foreword</h2>
  * Many metadata standards exist, including <cite>Dublin core</cite>, <cite>ISO 19115</cite> and the Image I/O
  * metadata defined in {@link javax.imageio.metadata}. The SIS implementation focuses on ISO 19115 (including
  * its ISO 19115-2 extension), but the classes are designed in a way that allow the usage of different standards.
  * This genericity goal should be keep in mind in the discussion below.
  *
- * <div class="section">How Metadata are defined</div>
+ * <h2>How Metadata are defined</h2>
  * A metadata standard is defined by a set of Java interfaces belonging to a specific package and its sub-packages.
  * For example the ISO 19115 standard is defined by the <a href="http://www.geoapi.org">GeoAPI</a> interfaces
  * defined in the {@link org.opengis.metadata} package and sub-packages. That standard is identified in SIS by the
@@ -59,7 +59,7 @@
  *       package for generating metadata implementations backed by the content of a database.</li>
  * </ul>
  *
- * <div class="section">How Metadata are handled</div>
+ * <h2>How Metadata are handled</h2>
  * Metadata objects in SIS are mostly containers: they provide getter and setter methods for manipulating the values
  * associated to properties (for example the {@code title} property of a {@code Citation} object), but provide few logic.
  * The package {@link org.apache.sis.metadata.iso} and its sub-packages are the main examples of such containers.
@@ -102,7 +102,7 @@
  *       where each call to a getter method is translated into a SQL query for the above database.</li>
  * </ul>
  *
- * <div class="section">How Metadata are marshalled</div>
+ * <h2>How Metadata are marshalled</h2>
  * The ISO 19115-3 standard defines how ISO 19115-1 metadata shall be represented in XML.
  * The SIS library supports XML marshalling and unmarshalling with JAXB annotations.
  *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/CachedStatement.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/CachedStatement.java
index 6b35eb3..76f6821 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/CachedStatement.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/CachedStatement.java
@@ -36,15 +36,15 @@
  * table is fetched, the {@link ResultSet} is automatically constructed. If many attributes are fetched consecutively
  * for the same record, then the same {@link ResultSet} is reused.
  *
- * <div class="section"><b>Synchronization</b>:
+ * <h2>Synchronization</h2>
  * This class is <strong>not</strong> thread-safe. Callers must perform their own synchronization in such a way
  * that only one query is executed on the same connection (JDBC connections can not be assumed thread-safe).
- * The synchronization lock shall be the {@link MetadataSource} which contain this entry.</div>
+ * The synchronization lock shall be the {@link MetadataSource} which contain this entry.
  *
- * <div class="section"><b>Closing</b>:
+ * <h2>Closing</h2>
  * While this class implements {@link java.lang.AutoCloseable}, it should not be used in a try-finally block.
  * This is because {@code CachedStatement} is typically closed by a different thread than the one that created
- * the {@code CachedStatement} instance. This object is closed by a background thread of {@link MetadataSource}.</div>
+ * the {@code CachedStatement} instance. This object is closed by a background thread of {@link MetadataSource}.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @version 1.0
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/IdentifierGenerator.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/IdentifierGenerator.java
index d682efe..4bc1677 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/IdentifierGenerator.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/IdentifierGenerator.java
@@ -38,7 +38,7 @@
  * numbers (i.e. if some old records have been deleted). Generating strictly increasing sequence is not a goal of this
  * class, since it would be too costly.</p>
  *
- * <div class="section">Assumptions</div>
+ * <h2>Assumptions</h2>
  * <ul>
  *   <li>{@code SELECT DISTINCT "ID" FROM "Table" WHERE "ID" LIKE 'proposal%' ORDER BY "ID";} is assumed efficient.
  *       For example in the case of a PostgreSQL database, it requires PostgreSQL 8.0 or above with a {@code btree}
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataSource.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataSource.java
index b7fe926..11341f2 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataSource.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataSource.java
@@ -89,7 +89,7 @@
  *
  * where {@code id} is the primary key value for the desired record in the {@code Format} table.
  *
- * <div class="section">Properties</div>
+ * <h2>Properties</h2>
  * The constructor expects three Java arguments (the {@linkplain MetadataStandard metadata standard},
  * the {@linkplain DataSource data source} and the database schema) completed by an arbitrary amount
  * of optional arguments given as a map of properties.
@@ -103,7 +103,7 @@
  *   <tr><td>{@code "maxStatements"}</td> <td>{@link Integer}</td>     <td>Maximal number of {@link PreparedStatement}s that can be kept simultaneously open.</td></tr>
  * </table>
  *
- * <div class="section">Concurrency</div>
+ * <h2>Concurrency</h2>
  * {@code MetadataSource} is thread-safe but is not concurrent. If concurrency is desired,
  * multiple instances of {@code MetadataSource} can be created for the same {@link DataSource}.
  * The {@link #MetadataSource(MetadataSource)} convenience constructor can be used for this purpose.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataWriter.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataWriter.java
index e334a62..dfe230f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataWriter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataWriter.java
@@ -68,7 +68,7 @@
  * However multiple instances of {@code MetadataSource} can be used concurrently with a single
  * {@code MetadataWriter} instance on the same database.</p>
  *
- * <div class="section">Properties</div>
+ * <h2>Properties</h2>
  * The constructor expects three Java arguments (the {@linkplain MetadataStandard metadata standard},
  * the {@linkplain DataSource data source} and the database schema) completed by an arbitrary amount
  * of optional arguments given as a map of properties.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/AbstractName.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/AbstractName.java
index b4eb2b3..ce693d1 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/AbstractName.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/AbstractName.java
@@ -44,11 +44,11 @@
  * For example the above-cited strings can both be split into smaller name components.
  * If such finer grain control is desired, {@link DefaultNameFactory} can be used instead of {@link Names}.</p>
  *
- * <div class="section">Natural ordering</div>
+ * <h2>Natural ordering</h2>
  * This class has a natural ordering that is inconsistent with {@link #equals(Object)}.
  * See {@link #compareTo(GenericName)} for more information.
  *
- * <div class="section">Note for implementers</div>
+ * <h2>Note for implementers</h2>
  * Subclasses need only to implement the following methods:
  * <ul>
  *   <li>{@link #scope()}</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java
index 1b58550..7899964 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java
@@ -49,7 +49,7 @@
  *   <li>Similar static convenience methods in {@link Names}.</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link NameSpace} and {@link CharSequence}
  * arguments given to the constructor are also immutable. Subclasses shall make sure that any overridden methods
  * remain safe to call from multiple threads and do not change any public {@code LocalName} state.
@@ -90,7 +90,7 @@
     /**
      * The name, either as a {@link String} or an {@link InternationalString}.
      *
-     * <div class="section">Note on JAXB annotation</div>
+     * <h4>Note on JAXB annotation</h4>
      * The {@link XmlElement} annotation applied here is appropriate for {@code TypeName} and {@code MemberName}
      * subtypes only. It is <strong>not</strong> appropriate when (un)marshalling directly a {@code LocalName}.
      * The distinction between the two cases is done by {@link org.apache.sis.internal.jaxb.gco.GO_GenericName},
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java
index dcba8f7..2271562 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java
@@ -36,7 +36,7 @@
  *   <li>Similar static convenience method in {@link Names}.</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link NameSpace}, {@link CharSequence} and
  * {@link TypeName} arguments given to the constructor are also immutable. Subclasses shall make sure that any
  * overridden methods remain safe to call from multiple threads and do not change any public {@code MemberName}
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameFactory.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameFactory.java
index 58293ee..e92ab89 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameFactory.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameFactory.java
@@ -64,7 +64,7 @@
  *   <li>{@link #toTypeName(Class)}</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code DefaultNameFactory} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses should make sure that any overridden methods remain safe to call
  * from multiple threads.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameSpace.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameSpace.java
index c274dbc..621f045 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameSpace.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultNameSpace.java
@@ -45,7 +45,7 @@
  *   <li>{@link DefaultNameFactory#createNameSpace(GenericName, Map)}</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link NameSpace} and {@link CharSequence}
  * arguments given to the constructor are also immutable. Subclasses shall make sure that any overridden methods
  * remain safe to call from multiple threads and do not change any public {@code NameSpace} state.
@@ -474,7 +474,7 @@
      * <div class="note"><b>Example:</b> if the name of this namespace is “<code>org.apache.sis</code>”,
      * then this method returns “<code>{org.apache.sis}</code>”.</div>
      *
-     * <div class="section">Usage</div>
+     * <h4>Usage</h4>
      * With this convention, it would be possible to create an <cite>expanded form</cite> of a generic name
      * (except for escaping of illegal characters) with a simple concatenation as in the following code example:
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
index e4650f6..7cf3c79 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
@@ -44,7 +44,7 @@
  * Since all members are expected to be assigned a value, the initial values on {@code DefaultRecord}
  * instantiation are unspecified. Some may be null, or some may be zero.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><b>Multi-threading:</b> {@code DefaultRecord} instances are <strong>not</strong> thread-safe.
  *       Synchronization, if needed, shall be done externally by the caller.</li>
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java
index 01812a7..fb30330 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordSchema.java
@@ -56,12 +56,12 @@
  *   <li>{@link DefaultNameFactory#toTypeName(Class)} if the factory given to the constructor.</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code DefaultRecordSchema} instance can be safely used by many threads without synchronization
  * on the part of the caller if the {@link NameFactory} given to the constructor is also thread-safe.
  * Subclasses should make sure that any overridden methods remain safe to call from multiple threads.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * This class is currently not serializable because {@code RecordSchema} contain an arbitrary amount of record
  * types in its {@linkplain #getDescription() description} map. Since each {@code RecordType} has a reference
  * to its schema, serializing a single {@code RecordType} could imply serializing all of them.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordType.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordType.java
index 0747de2..c5ffcc6 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordType.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecordType.java
@@ -57,7 +57,7 @@
  * The set of members in a {@code RecordType} can be though as equivalent to the set of fields in a class.
  * </div>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * The easiest way to create {@code DefaultRecordType} instances is to use the
  * {@link DefaultRecordSchema#createRecordType(CharSequence, Map)} method.
  * Example:
@@ -76,13 +76,13 @@
  * }
  * </div>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link TypeName}, the {@link RecordSchema}
  * and all ({@link MemberName}, {@link Type}) entries in the map given to the constructor are also immutable.
  * Subclasses shall make sure that any overridden methods remain safe to call from multiple threads and do not change
  * any public {@code RecordType} state.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * This class is serializable if all elements given to the constructor are also serializable.
  * Note in particular that {@link DefaultRecordSchema} is currently <strong>not</strong> serializable,
  * so users wanting serialization may need to provide their own schema.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java
index 8cf4582..a01e038 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java
@@ -42,7 +42,7 @@
  *   <li>Similar static convenience methods in {@link Names}.</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link NameSpace} and all {@link CharSequence}
  * elements in the arguments given to the constructor are also immutable. Subclasses shall make sure that any
  * overridden methods remain safe to call from multiple threads and do not change any public {@code LocalName}
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultTypeName.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultTypeName.java
index e730e38..52ade3c 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultTypeName.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultTypeName.java
@@ -32,7 +32,7 @@
  *   <li>{@link DefaultNameFactory#toTypeName(Class)}</li>
  * </ul>
  *
- * <div class="section">Mapping Java classes to type names</div>
+ * <h2>Mapping Java classes to type names</h2>
  * It is sometime useful to establish a mapping between {@link Class} and {@code TypeName}.
  * When an UML identifier from an OGC standard exists for a given {@code Class}, Apache SIS
  * uses that identifier prefixed by the {@code "OGC"} namespace.
@@ -116,7 +116,7 @@
  * {@link DefaultNameFactory#toTypeName(Class)} or {@link #toClass()} instead than parsing the name.
  *
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link NameSpace} and {@link CharSequence}
  * arguments given to the constructor are also immutable. Subclasses shall make sure that any overridden methods
  * remain safe to call from multiple threads and do not change any public {@code TypeName} state.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/GlobalNameSpace.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/GlobalNameSpace.java
index a08d0be..5a3de5f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/GlobalNameSpace.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/GlobalNameSpace.java
@@ -24,7 +24,7 @@
  * any global namespace in public API since ISO 19103 does not define them and users should not
  * need to handle them explicitly.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
index 2981457..6ec71a8 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
@@ -38,7 +38,7 @@
  * but makes some tasks easier by avoiding the need to find a factory, and by creating name and
  * their namespace in a single step.
  *
- * <div class="section">Relationship with Java Content Repository (JCR) names</div>
+ * <h2>Relationship with Java Content Repository (JCR) names</h2>
  * In the Java standard {@link javax.xml.namespace.QName} class and in the Java Content Repository (JCR) specification,
  * a name is an ordered pair of ({@code namespace}, {@code localPart}) strings. A JCR name can take two lexical forms:
  * <cite>expanded form</cite> and <cite>qualified form</cite>. Those names are mapped to generic names as below:
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/RecordDefinition.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/RecordDefinition.java
index 0fe49b3..6262a0b 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/RecordDefinition.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/RecordDefinition.java
@@ -38,7 +38,7 @@
  * Holds a {@code Record} definition in a way more convenient for Apache SIS than
  * what the {@code RecordType} interface provides.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * This base class is intentionally not serializable, and all private fields are marked as transient for making
  * this decision more visible. This is because the internal details of this class are quite arbitrary, so we do
  * not want to expose them in serialization for compatibility reasons. Furthermore some information are redundant,
@@ -58,7 +58,7 @@
      * is not an instance of {@link DefaultRecordType}. So this adapter is used only if Apache SIS is mixed
      * with other implementations.
      *
-     * <div class="section">Serialization</div>
+     * <h4>Serialization</h4>
      * This class is serializable if the {@code RecordType} given to the constructor is also serializable.
      */
     static final class Adapter extends RecordDefinition implements Serializable {
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
index ee40310..5b3bf4b 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
@@ -62,7 +62,7 @@
  *   </ul></li>
  * </ul>
  *
- * <div class="section">Substituting a free text by a code list</div>
+ * <h2>Substituting a free text by a code list</h2>
  * The ISO standard allows to substitute some character strings in the <cite>"free text"</cite> domain
  * by a {@link CodeList} value.
  *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/package-info.java
index ed59c76..2b4ab8e 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/package-info.java
@@ -52,7 +52,7 @@
  *   </li>
  * </ul>
  *
- * <div class="section">Anatomy of a name</div>
+ * <h2>Anatomy of a name</h2>
  * Names may be {@linkplain org.apache.sis.util.iso.AbstractName#toFullyQualifiedName() fully qualified}
  * (like {@code "urn:ogc:def:crs:EPSG::4326"}),
  * or they may be relative to a {@linkplain org.apache.sis.util.iso.AbstractName#scope() scope}
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/IdentifiedObject.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/IdentifiedObject.java
index ed4aace..891b7ef 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/IdentifiedObject.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/IdentifiedObject.java
@@ -37,7 +37,7 @@
  *     object.getIdentifierMap().put(IdentifierSpace.ID, "myID");
  * }
  *
- * <div class="section">Relationship with GeoAPI</div>
+ * <h2>Relationship with GeoAPI</h2>
  * Identifiers exist also in some (not all) GeoAPI objects. Some GeoAPI objects
  * ({@link org.opengis.metadata.acquisition.Instrument}, {@link org.opengis.metadata.acquisition.Platform},
  * {@link org.opengis.metadata.acquisition.Operation}, {@link org.opengis.metadata.lineage.Processing},
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshalContext.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshalContext.java
index c048d0c..c16db1c 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshalContext.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshalContext.java
@@ -45,13 +45,13 @@
      * In particular children of {@link org.opengis.metadata.Metadata} inherit the locale
      * specified by the {@link org.opengis.metadata.Metadata#getLanguage()} attribute.</p>
      *
-     * <div class="section">Handling of {@code Locale.ROOT}</div>
+     * <h4>Handling of {@code Locale.ROOT}</h4>
      * {@link Locale#ROOT} is interpreted as a request for locale-neutral strings.
      * The meaning of "locale-neutral" is implementation specific - this is usually
      * very close to the English locale, but not necessarily. For examples dates are
      * formatted according ISO standard instead than the rules of the English locale.
      *
-     * <div class="section">Handling of {@code null} locale</div>
+     * <h4>Handling of {@code null} locale</h4>
      * A {@code null} value means that the locale is unspecified. Callers are encouraged
      * to use the root locale as the default value, but some flexibility is allowed.
      *
@@ -64,12 +64,12 @@
     /**
      * Returns the timezone to use for (un)marshalling, or {@code null} if none was explicitly specified.
      *
-     * <div class="section">Handling of <code>null</code> timezone</div>
+     * <h4>Handling of <code>null</code> timezone</h4>
      * A {@code null} value means that the timezone is unspecified. Callers are encouraged
      * to use the UTC timezone as the default value, but some flexibility is allowed.
      *
-     * <div class="warning"><b>Upcoming API change — Java time API</b><br>
-     * Return type may be changed to {@link java.time.ZoneId} when Apache SIS will target Java 8.
+     * <div class="warning"><b>Upcoming API change — Java time API</b>:
+     * return type may be changed to {@link java.time.ZoneId} when Apache SIS will target Java 8.
      * This change may be applied in synchronization with GeoAPI 4.0.
      * </div>
      *
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshallerPool.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshallerPool.java
index 2c1528c..84ae0ca 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshallerPool.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/MarshallerPool.java
@@ -49,11 +49,11 @@
  *     pool.recycle(marshaller);
  * }
  *
- * <div class="section">Configuring (un)marshallers</div>
+ * <h2>Configuring (un)marshallers</h2>
  * The (un)marshallers created by this class can optionally by configured with the SIS-specific
  * properties defined in the {@link XML} class, in addition to JAXB standard properties.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code MarshallerPool} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses should make sure that any overridden methods remain safe to call
  * from multiple threads.
@@ -354,7 +354,7 @@
      * The caller should not use anymore the given marshaller after this method call,
      * since the marshaller may be re-used by another thread at any time after recycle.
      *
-     * <div class="section">Cautions</div>
+     * <h4>Cautions</h4>
      * <ul>
      *   <li>Do not invoke this method if the marshaller threw an exception, since the
      *       marshaller may be in an invalid state. In particular, this method should not
@@ -378,7 +378,7 @@
      * The caller should not use anymore the given unmarshaller after this method call,
      * since the unmarshaller may be re-used by another thread at any time after recycle.
      *
-     * <div class="section">Cautions</div>
+     * <h4>Cautions</h4>
      * <ul>
      *   <li>Do not invoke this method if the unmarshaller threw an exception, since the
      *       unmarshaller may be in an invalid state. In particular, this method should not
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/Namespaces.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/Namespaces.java
index 3b068c1..be390bb 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/Namespaces.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/Namespaces.java
@@ -74,7 +74,7 @@
  *   <tr><td>xlink</td>  <td>Link</td>                                       <td>{@value #XLINK}</td> <td></td></tr>
  * </table>
  *
- * <div class="section">Profiles</div>
+ * <h2>Profiles</h2>
  * Some countries or organizations define profiles of international standards, which may contain
  * country-specific extensions. The namespace of such extensions are usually defined in a separated
  * class dedicated to the profile. Some of them are listed below:
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObject.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObject.java
index aac8946..05e8110 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObject.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilObject.java
@@ -61,7 +61,7 @@
  * both the {@code Series} and the {@code NilObject} interfaces, and the {@link #getNilReason()} method
  * on that instance will return the {@link NilReason#UNKNOWN} constant.
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * Instances of {@code NilObject} are created by first fetching the reason why the information
  * is missing, then invoking {@link NilReason#createNilObject(Class)}. The following example
  * instantiates a {@code Citation} object which is nil because the information are missing:
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilReason.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilReason.java
index 5f511ca..91fdc53 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/NilReason.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/NilReason.java
@@ -50,7 +50,7 @@
  * {@code NilReason} is used in a number of XML elements where it is necessary to permit
  * one of the above values as an alternative to the primary element.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
@@ -119,7 +119,7 @@
      * The string representation of this constant is {@code "other"}.
      * The explanation property is an empty string, and the URI is {@code null}.
      *
-     * <div class="section">Providing an explanation</div>
+     * <h4>Providing an explanation</h4>
      * Users are encouraged to use the {@link #valueOf(String)} method instead than this constant,
      * in order to provide a brief explanation. The string representation for {@code valueOf(…)}
      * is <code>"other:<var>explanation</var>"</code> where <var>explanation</var> is a string of
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/Transformer.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/Transformer.java
index 2710a19..84dcf7a 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/Transformer.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/Transformer.java
@@ -59,7 +59,7 @@
  * methods in {@link org.apache.sis.metadata.iso} packages for legacy ISO 19115:2003 properties), and some
  * transformations, in particular namespace changes, are better handled by this {@code Transformer}.
  *
- * <div class="section">Why using {@code Transformer}</div>
+ * <h2>Why using {@code Transformer}</h2>
  * When the XML schemas of an international standard is updated, the URL of the namespace is often modified.
  * For example when GML has been updated from version 3.1 to 3.2, the URL mandated by the international standard
  * changed from {@code "http://www.opengis.net/gml"} to {@code "http://www.opengis.net/gml/3.2"}
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
index eeda0be..91bb5f8 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
@@ -103,7 +103,7 @@
      * such case, the unmarshaller will try to pickup a string in the language specified
      * by this property.</p>
      *
-     * <div class="section">Default behavior</div>
+     * <h4>Default behavior</h4>
      * If this property is never set, then (un)marshalling will try to use "unlocalized" strings -
      * typically some programmatic strings like {@linkplain org.opengis.annotation.UML#identifier()
      * UML identifiers}. While such identifiers often look like English words, they are not
@@ -111,7 +111,7 @@
      * The algorithm attempting to find a "unlocalized" string is defined in the
      * {@link org.apache.sis.util.iso.DefaultInternationalString#toString(Locale)} javadoc.
      *
-     * <div class="section">Special case</div>
+     * <h4>Special case</h4>
      * If the object to be marshalled is an instance of
      * {@link org.apache.sis.metadata.iso.DefaultMetadata}, then the value given to its
      * {@link org.apache.sis.metadata.iso.DefaultMetadata#setLanguage(Locale) setLanguage(Locale)}
@@ -128,7 +128,7 @@
      * The value for this property shall be an instance of {@link TimeZone}
      * or a {@link CharSequence} recognized by {@link TimeZone#getTimeZone(String)}.
      *
-     * <div class="section">Default behavior</div>
+     * <h4>Default behavior</h4>
      * If this property is never set, then (un)marshalling will use the
      * {@linkplain TimeZone#getDefault() default timezone}.
      *
@@ -153,7 +153,7 @@
      * The key to be used depends on the {@linkplain #METADATA_VERSION metadata version} to be marshalled.
      * Additional keys, if any, are ignored. Future SIS versions may recognize more keys.
      *
-     * <div class="section">Valid values</div>
+     * <h4>Valid values</h4>
      * The following table gives some typical URLs.
      * The URL in bold character is the default one.
      *
@@ -186,7 +186,7 @@
      * The value can be {@link String} or {@link Version} object.
      * If no version is specified, then the most recent supported GML version is assumed.
      *
-     * <div class="section">Supported GML versions</div>
+     * <h4>Supported GML versions</h4>
      * Apache SIS currently supports GML 3.2.1 by default. SIS can read and write GML 3.2
      * if this property is set to "3.2". It is also possible to set this property to "3.1",
      * but the marshalled XML is not GML 3.1.1 conformant because of the differences between the two schemas.
@@ -205,7 +205,7 @@
      * For example the {@code <gml:domainOfValidity>} element inside a coordinate reference system
      * is always marshalled using ISO 19139:2007 if the enclosing element uses GML 3.2 schema.</p>
      *
-     * <div class="section">Supported metadata versions</div>
+     * <h4>Supported metadata versions</h4>
      * Apache SIS currently supports ISO 19115-3:2016 by default. This version can be explicitly
      * set with value "2014" or above (because the abstract model was defined in ISO 19115-1:2014).
      * SIS can write legacy ISO 19139:2007 documents if this property is set to a value less than "2014".
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/package-info.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/package-info.java
index 1fd8e46..fbfc76b 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/package-info.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/package-info.java
@@ -41,7 +41,7 @@
  *   </cit:CI_Citation>
  * }
  *
- * <div class="section">Customizing the XML</div>
+ * <h2>Customizing the XML</h2>
  * In order to parse and format ISO 19115-3 compliant documents, SIS needs its own
  * {@link javax.xml.bind.Marshaller} and {@link javax.xml.bind.Unmarshaller} instances
  * (which are actually wrappers around standard instances). Those instances are created
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/NameMapTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/NameMapTest.java
index f0ff093..00c809e 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/NameMapTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/NameMapTest.java
@@ -92,7 +92,7 @@
      * it would just consume more memory than needed. We want to intern those strings because they usually
      * match method names or field names, which are already interned by the JVM.
      *
-     * <div class="section">Explicit calls to {@code String.intern()}</div>
+     * <h4>Explicit calls to {@code String.intern()}</h4>
      * I though that annotation strings were interned like any other constants, but it does not
      * seem to be the case as of JDK7. To check if a future JDK release still needs explicit
      * call to {@link String#intern()}, try to remove the "{@code .intern()}" part in the
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
index a903c83..7816a81 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
@@ -43,7 +43,7 @@
  * Tests the {@link TreeNodeChildren} class.
  * Unless otherwise specified, all tests use the {@link MetadataStandard#ISO_19115} constant.
  *
- * <div class="section">Test dependency</div>
+ * <h2>Test dependency</h2>
  * This class uses the {@link TreeNode#getUserObject()} method for comparing the values.
  * We can hardly avoid to use some {@code TreeNode} methods because of the cross-dependencies.
  * However we try to use nothing else than {@code getUserObject()} because the purpose of this
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java b/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
index 44871a3..f817af8 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
@@ -145,7 +145,7 @@
      *
      * The comparison will ignore comments and the optional attributes given in arguments.
      *
-     * <div class="section">Ignored attributes substitution</div>
+     * <h4>Ignored attributes substitution</h4>
      * For convenience, this method replaces some well known prefixes in the {@code ignoredAttributes}
      * array by their full namespace URLs. For example this method replaces{@code "xsi:schemaLocation"}
      * by {@code "http://www.w3.org/2001/XMLSchema-instance:schemaLocation"}.
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/test/sql/TestDatabase.java b/core/sis-metadata/src/test/java/org/apache/sis/test/sql/TestDatabase.java
index e8a73b6..11b90c2 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/sql/TestDatabase.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/sql/TestDatabase.java
@@ -40,7 +40,7 @@
  * Utility methods for creating temporary databases for testing purpose.
  * The databases are in-memory when the database engine supports this mode.
  *
- * <div class="section">Inspecting the Derby database content in a debugger</div>
+ * <h2>Inspecting the Derby database content in a debugger</h2>
  * Make sure that the classpath contains the {@code derbynet.jar} file in addition to {@code derby.jar}.
  * Then, specify the following options to the JVM (replace the 1527 port number by something else if needed):
  *
diff --git a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java
index 9f4989a..fac78c5 100644
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java
@@ -197,7 +197,7 @@
      * at arbitrary precision, but formats at the {@linkplain #setHashLength specified precision}.
      * The same {@code Coder} instance can be reused for reading or writing many geohashes.
      *
-     * <div class="section">Immutability and thread safety</div>
+     * <h2>Immutability and thread safety</h2>
      * This class is <strong>not</strong> thread-safe. A new instance must be created for each thread,
      * or synchronization must be applied by the caller.
      *
diff --git a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
index b269e39..cda1c14 100644
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
@@ -121,7 +121,7 @@
  * }
  * </div>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe.
  * However the {@link Coder Coder} instances performing conversions between references and coordinates
  * are not thread-safe; it is recommended to create a new {@code Coder} instance for each thread.
@@ -336,7 +336,7 @@
      *
      * <p>See the {@link MilitaryGridReferenceSystem} enclosing class for usage example.</p>
      *
-     * <div class="section">Immutability and thread safety</div>
+     * <h2>Immutability and thread safety</h2>
      * This class is <strong>not</strong> thread-safe. A new instance must be created for each thread,
      * or synchronization must be applied by the caller.
      *
@@ -1289,7 +1289,7 @@
      * Each {@code Encoder} instance is configured for one {@code DirectPosition} CRS.
      * If a position is given in another CRS, another {@code Encoder} instance must be created.
      *
-     * <div class="section">Immutability and thread safety</div>
+     * <h4>Immutability and thread safety</h4>
      * This class is <strong>not</strong> thread-safe. A new instance must be created for each thread,
      * or synchronization must be applied by the caller.
      *
diff --git a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java
index 8bf8273..013f54d 100644
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java
@@ -77,7 +77,7 @@
  * }
  * </div>
  *
- * <div class="section">Inheritance of property values</div>
+ * <h2>Inheritance of property values</h2>
  * According ISO 19112:2003, all properties except the collection of
  * {@linkplain #getParents() parents} and {@linkplain #getChildren() children} are mandatory.
  * Those mandatory properties are the {@linkplain #getName() name}, {@linkplain #getTheme() theme},
@@ -101,7 +101,7 @@
  * Then, the towns and streets automatically inherit the same value for that property,
  * unless they are explicitly given another value.</div>
  *
- * <div class="section">Limitation</div>
+ * <h2>Limitation</h2>
  * This class is not serializable and is not thread-safe. For thread safety or for serialization,
  * a {@linkplain #snapshot snapshots} of this location type should be taken.
  *
diff --git a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
index b1ec153..bd1e46a 100644
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
@@ -42,7 +42,7 @@
 /**
  * Base class of reference systems that describe locations using geographic identifiers instead than coordinates.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar
  * conditions. This means that unless otherwise noted in the javadoc, {@code ReferencingByIdentifiers} instances
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
index 1b6b448..a8d6b73 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
@@ -70,7 +70,7 @@
  * <p>All other methods, including {@link #toString()}, {@link #equals(Object)} and {@link #hashCode()},
  * are implemented on top of the above four methods.</p>
  *
- * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+ * <h2>Spanning the anti-meridian of a Geographic CRS</h2>
  * The <cite>Web Coverage Service</cite> (WCS) specification authorizes (with special treatment)
  * cases where <var>upper</var> &lt; <var>lower</var> at least in the longitude case. They are
  * envelopes crossing the anti-meridian, like the red box below (the green box is the usual case).
@@ -93,13 +93,13 @@
  * </ul>
  * </div></div>
  *
- * <div class="section">Choosing the range of longitude values</div>
+ * <h2>Choosing the range of longitude values</h2>
  * Geographic CRS typically have longitude values in the [-180 … +180]° range, but the [0 … 360]°
  * range is also occasionally used. Users of this class need to ensure that this envelope CRS is
  * associated to axes having the desired {@linkplain CoordinateSystemAxis#getMinimumValue() minimum}
  * and {@linkplain CoordinateSystemAxis#getMaximumValue() maximum value}.
  *
- * <div class="section">Note on positive and negative zeros</div>
+ * <h2>Note on positive and negative zeros</h2>
  * The IEEE 754 standard defines two different values for positive zero and negative zero.
  * When used with SIS envelopes and keeping in mind the above discussion, those zeros have
  * different meanings:
@@ -401,7 +401,7 @@
      *     median = (getUpper(dimension) + getLower(dimension)) / 2;
      * }
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * If <var>upper</var> &lt; <var>lower</var> and the
      * {@linkplain CoordinateSystemAxis#getRangeMeaning() range meaning} for the requested
      * dimension is {@linkplain RangeMeaning#WRAPAROUND wraparound}, then the median calculated
@@ -452,7 +452,7 @@
      *     span = getUpper(dimension) - getLower(dimension);
      * }
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * If <var>upper</var> &lt; <var>lower</var> and the
      * {@linkplain CoordinateSystemAxis#getRangeMeaning() range meaning} for the requested
      * dimension is {@linkplain RangeMeaning#WRAPAROUND wraparound}, then the span calculated
@@ -698,11 +698,11 @@
      * If it least one coordinate value in the given point is {@link Double#NaN NaN},
      * then this method returns {@code false}.
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified point uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * For any dimension, if <var>upper</var> &lt; <var>lower</var> then this method uses an
      * algorithm which is the opposite of the usual one: rather than testing if the given point is
      * inside the envelope interior, this method tests if the given point is <em>outside</em> the
@@ -750,11 +750,11 @@
      *
      * <blockquote><pre>{@linkplain #contains(Envelope, boolean) contains}(envelope, <b>true</b>)</pre></blockquote>
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified envelope uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * For every cases illustrated below, the yellow box is considered completely enclosed
      * in the blue envelope:
      *
@@ -879,11 +879,11 @@
      *
      * <blockquote><pre>{@linkplain #intersects(Envelope, boolean) intersects}(envelope, <b>false</b>)</pre></blockquote>
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified envelope uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method can handle envelopes spanning the anti-meridian.
      *
      * @param  envelope  the envelope to test for intersection.
@@ -1020,7 +1020,7 @@
      * smaller for geographic CRS than for UTM projections, because the former typically has a
      * [-180…180]° range while the later can have a range of thousands of meters.</div>
      *
-     * <div class="section">Coordinate Reference System</div>
+     * <h4>Coordinate Reference System</h4>
      * To be considered equal, the two envelopes must have the same {@linkplain #getDimension() dimension}
      * and their CRS must be {@linkplain org.apache.sis.util.Utilities#equalsIgnoreMetadata equals,
      * ignoring metadata}. If at least one envelope has a null CRS, then the CRS are ignored and the
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
index 3e07b68..6d6a0bb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
@@ -338,7 +338,7 @@
      * with the checks listed above, where failure to met those conditions will cause the methods to
      * behave in an unexpected way.
      *
-     * <div class="section">Implementation consistency</div>
+     * <h4>Implementation consistency</h4>
      * The checks performed by this method shall be consistent with the checks performed by the following methods:
      * <ul>
      *   <li>{@link GeneralEnvelope#setCoordinateReferenceSystem(CoordinateReferenceSystem)}</li>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
index 5dcd775..7e3d668 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
@@ -46,7 +46,7 @@
  * do not have such restriction, and it would be hard to generalize. For example there is no clear "x" or "y"
  * classification for North-East direction.</div>
  *
- * <div class="section">Caution when used in collections</div>
+ * <h2>Caution when used in collections</h2>
  * Do not mix instances of this class with ordinary {@link Point2D} instances
  * in a {@code HashSet} or as {@code HashMap} keys.
  * It is not possible to met both {@link Point2D#hashCode()} and {@link DirectPosition#hashCode()}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
index 7b16e2c..08c9b4e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
@@ -60,7 +60,7 @@
  * This is not specific to this implementation; in Java2D too, the visual axis orientation depend
  * on the {@linkplain java.awt.Graphics2D#getTransform() affine transform in the graphics context}.</p>
  *
- * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+ * <h2>Spanning the anti-meridian of a Geographic CRS</h2>
  * The <cite>Web Coverage Service</cite> (WCS) specification authorizes (with special treatment)
  * cases where <var>upper</var> &lt; <var>lower</var> at least in the longitude case. They are
  * envelopes spanning the anti-meridian, like the red box below (the green box is the usual case).
@@ -690,7 +690,7 @@
      * of the given coordinate value is {@link java.lang.Double#NaN NaN}, then this method returns
      * {@code false}.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link AbstractEnvelope#contains(DirectPosition)}.
      *
@@ -718,7 +718,7 @@
      * envelope or the given rectangle have at least one {@link java.lang.Double#NaN NaN} value,
      * then this method returns {@code false}.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link AbstractEnvelope#contains(Envelope)}.
      *
@@ -740,7 +740,7 @@
      * envelope or the given rectangle have at least one {@link java.lang.Double#NaN NaN} value,
      * then this method returns {@code false}.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link AbstractEnvelope#contains(Envelope)}.
      *
@@ -790,7 +790,7 @@
      * or the given rectangle have at least one {@link java.lang.Double#NaN NaN} value, then this
      * method returns {@code false}.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link AbstractEnvelope#intersects(Envelope)}.
      *
@@ -812,7 +812,7 @@
      * or the given rectangle have at least one {@link java.lang.Double#NaN NaN} value, then this
      * method returns {@code false}.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link AbstractEnvelope#intersects(Envelope)}.
      *
@@ -859,7 +859,7 @@
      * or the given rectangle have at least one {@link java.lang.Double#NaN NaN} values, then this
      * method returns an {@linkplain #isEmpty() empty} envelope.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link GeneralEnvelope#intersect(Envelope)}.
      *
@@ -949,7 +949,7 @@
      * Adds an other rectangle to this rectangle. The resulting rectangle is the union of the
      * two {@code Rectangle} objects.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link GeneralEnvelope#add(Envelope)}, except if the result is a rectangle expanding to
      * infinities. In the later case, the field values are set to {@code NaN} because infinite
@@ -1047,7 +1047,7 @@
      * as an argument will return {@code true}, except if one of the point coordinates was
      * {@link java.lang.Double#NaN} in which case the corresponding coordinate has been ignored.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports anti-meridian spanning in the same way than
      * {@link GeneralEnvelope#add(DirectPosition)}.
      *
@@ -1087,7 +1087,7 @@
      * i.e. the {@linkplain #getCoordinateReferenceSystem() coordinate reference system} of this
      * envelope is ignored.
      *
-     * <div class="section">Note on {@code hashCode()}</div>
+     * <h4>Note on {@code hashCode()}</h4>
      * This class does not override the {@link #hashCode()} method for consistency with the
      * {@link Rectangle2D#equals(Object)} method, which compare arbitrary {@code Rectangle2D}
      * implementations.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java
index fb82e82..3a95a2560 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/Envelopes.java
@@ -59,7 +59,7 @@
 /**
  * Transforms envelopes to new Coordinate Reference Systems, and miscellaneous utilities.
  *
- * <div class="section">Envelope transformations</div>
+ * <h2>Envelope transformations</h2>
  * All {@code transform(…)} methods in this class take in account the curvature of the transformed shape.
  * For example the shape of a geographic envelope (figure below on the left side) is not rectangular in a
  * conic projection (figure below on the right side). In order to get the envelope represented by the red
@@ -303,7 +303,7 @@
      * same instance than the given target CRS, then the given envelope is returned unchanged.
      * Otherwise a new transformed envelope is returned.
      *
-     * <div class="section">Performance tip</div>
+     * <h4>Performance tip</h4>
      * If there is many envelopes to transform with the same source and target CRS, then it is more efficient
      * to get the {@link CoordinateOperation} or {@link MathTransform} instance once and invoke one of the
      * others {@code transform(…)} methods.
@@ -349,7 +349,7 @@
      * or smaller than required if the bounding box contains a pole.
      * The coordinate reference system of the returned envelope will be null.
      *
-     * <div class="section">Limitation</div>
+     * <h4>Limitation</h4>
      * This method can not handle the case where the envelope contains the North or South pole,
      * or when it crosses the ±180° longitude, because {@link MathTransform} does not carry sufficient information.
      * For a more robust envelope transformation, use {@link #transform(CoordinateOperation, Envelope)} instead.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
index 852dd42..0182891 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
@@ -43,7 +43,7 @@
  * position is known to be always two-dimensional, then {@link DirectPosition2D} provides
  * a more efficient implementation.
  *
- * <div class="section">Coordinate Reference System (CRS) optionality</div>
+ * <h2>Coordinate Reference System (CRS) optionality</h2>
  * Since {@code DirectPosition}s, as data types, will often be included in larger objects
  * (such as {@link org.opengis.geometry.Geometry}) that have references
  * to {@code CoordinateReferenceSystem}, the {@link #getCoordinateReferenceSystem()} method
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
index 0b00fde..f4b2733 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
@@ -68,7 +68,7 @@
  *       representing a {@code BBOX} or a <cite>Well Known Text</cite> (WKT) format.</li>
  * </ul>
  *
- * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+ * <h2>Spanning the anti-meridian of a Geographic CRS</h2>
  * The <cite>Web Coverage Service</cite> (WCS) specification authorizes (with special treatment)
  * cases where <var>upper</var> &lt; <var>lower</var> at least in the longitude case. They are
  * envelopes crossing the anti-meridian, like the red box below (the green box is the usual case).
@@ -95,7 +95,7 @@
  * </ul>
  * </div></div>
  *
- * <div class="section">Envelope validation</div>
+ * <h2>Envelope validation</h2>
  * If and only if this envelope is associated to a non-null CRS, then constructors and setter methods
  * in this class perform the following checks:
  *
@@ -531,11 +531,11 @@
      * with the added point as an argument will return {@code true}, except if one of the point
      * coordinates was {@link Double#NaN} in which case the corresponding coordinate has been ignored.</p>
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified point uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports envelopes spanning the anti-meridian. In such cases it is possible to
      * move both envelope borders in order to encompass the given point, as illustrated below (the
      * new point is represented by the {@code +} symbol):
@@ -611,17 +611,17 @@
      * Adds an envelope object to this envelope.
      * The resulting envelope is the union of the two {@code Envelope} objects.
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified envelope uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports envelopes spanning the anti-meridian. If one or both envelopes span
      * the anti-meridian, then the result of the {@code add} operation may be an envelope expanding
      * to infinities. In such case, the coordinate range will be either [−∞…∞] or [0…−0] depending on
      * whatever the original range span the anti-meridian or not.
      *
-     * <div class="section">Handling of NaN values</div>
+     * <h4>Handling of NaN values</h4>
      * {@link Double#NaN} values may be present in any dimension, in the lower coordinate, upper coordinate or both.
      * The behavior of this method in such case depends where the {@code NaN} values appear and whether an envelope
      * spans the anti-meridian:
@@ -767,14 +767,14 @@
     /**
      * Sets this envelope to the intersection of this envelope with the specified one.
      *
-     * <div class="section">Pre-conditions</div>
+     * <h4>Pre-conditions</h4>
      * This method assumes that the specified envelope uses the same CRS than this envelope.
      * For performance reasons, it will no be verified unless Java assertions are enabled.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * This method supports envelopes spanning the anti-meridian.
      *
-     * <div class="section">Handling of NaN values</div>
+     * <h4>Handling of NaN values</h4>
      * {@link Double#NaN} values may be present in any dimension, in the lower coordinate, upper coordinate or both.
      * The behavior of this method in such case depends where the {@code NaN} values appear and whether an envelope
      * spans the anti-meridian:
@@ -959,7 +959,7 @@
      *       class javadoc for more information about the meaning of such range.</li>
      * </ul>
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * If the envelope is spanning the anti-meridian, then some {@linkplain #getLower(int) lower}
      * coordinate values may become greater than their {@linkplain #getUpper(int) upper} counterpart
      * as a result of this method call. If such effect is undesirable, then this method may be
@@ -971,13 +971,13 @@
      *     }
      * }
      *
-     * <div class="section">Choosing the range of longitude values</div>
+     * <h4>Choosing the range of longitude values</h4>
      * Geographic CRS typically have longitude values in the [-180 … +180]° range, but the [0 … 360]°
      * range is also occasionally used. Callers need to ensure that this envelope CRS is associated
      * to axes having the desired {@linkplain CoordinateSystemAxis#getMinimumValue() minimum} and
      * {@linkplain CoordinateSystemAxis#getMaximumValue() maximum value}.
      *
-     * <div class="section">Usage</div>
+     * <h4>Usage</h4>
      * This method is sometime useful before to compute the {@linkplain #add(Envelope) union}
      * or {@linkplain #intersect(Envelope) intersection} of envelopes, in order to ensure that
      * both envelopes are defined in the same domain. This method may also be invoked before
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/ImmutableEnvelope.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/ImmutableEnvelope.java
index 991d3d9..e674408 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/ImmutableEnvelope.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/ImmutableEnvelope.java
@@ -36,7 +36,7 @@
  * This class is final in order to ensure that the immutability contract can not be broken
  * (assuming not using <cite>Java Native Interface</cite> or reflections).
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe if the {@link CoordinateReferenceSystem}
  * instance given to the constructor is immutable. This is usually the case in Apache SIS.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java
index 9d39b12..5d49d52 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/package-info.java
@@ -45,13 +45,13 @@
  *   </tr>
  * </table>
  *
- * <div class="section">Java2D dependency</div>
+ * <h2>Java2D dependency</h2>
  * All classes having a name that ends with "2D" are designed for inter-operability with Java2D.
  * All other classes have no dependency to Java2D.
  * This clear separation aims to make easier to use Apache SIS on platforms that do not support Java2D
  * (for example Android) or to avoid loading Java2D classes when only JavaFX is desired.
  *
- * <div class="section">Envelopes spanning the anti-meridian of a Geographic CRS</div>
+ * <h2>Envelopes spanning the anti-meridian of a Geographic CRS</h2>
  * The Web Coverage Service (WCS) 1.1 specification uses an extended interpretation
  * of the bounding box definition. In a WCS 1.1 data structure, the
  * {@linkplain org.apache.sis.geometry.GeneralEnvelope#getLowerCorner() lower corner}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/RS_Identifier.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/RS_Identifier.java
index 16aa4d4..027e186 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/RS_Identifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/RS_Identifier.java
@@ -30,7 +30,7 @@
  * The ISO 19139 syntax represents the code and codespace as XML elements, while in this GML representation the code
  * is a XML value and the codespace is a XML attribute.</p>
  *
- * <div class="section">Marshalling</div>
+ * <h2>Marshalling</h2>
  * Identifiers are typically marshalled as below:
  *
  * {@preformat xml
@@ -44,7 +44,7 @@
  *   <gml:identifier codeSpace="EPSG:8.3">4326</gml:identifier>
  * }
  *
- * <div class="section">Unmarshalling</div>
+ * <h2>Unmarshalling</h2>
  * Some data producers put a URN instead than a simple code value, as in the example below:
  *
  * {@preformat xml
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/MillerCylindrical.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/MillerCylindrical.java
index 42cace0..579da16 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/MillerCylindrical.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/MillerCylindrical.java
@@ -36,7 +36,7 @@
  * supports also the ellipsoidal formulas. If spherical formulas are desired, then the parameters shall contains
  * semi-major and semi-minor axis lengths of equal length.
  *
- * <div class="section">Additional identifiers:</div>
+ * <h2>Additional identifiers:</h2>
  * This projection has the following identifiers from the French mapping agency (IGNF),
  * which have not yet been declared in this class:
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NADCON.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NADCON.java
index 3503b1c..ee02a22 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NADCON.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NADCON.java
@@ -194,7 +194,7 @@
      * Loaders of NADCON data. Instances of this class exist only at loading time.
      * This class can read both binary and ASCII grid files.
      *
-     * <div class="section">Binary format</div>
+     * <h4>Binary format</h4>
      * NADCON binary files ({@code "*.las"} and {@code "*.los"}) are organized into records
      * with the first record containing the header information, followed by the shift data.
      * The length of each record (including header) depends on the number of columns.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Convention.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Convention.java
index dc81cde..a7352b7 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Convention.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Convention.java
@@ -27,7 +27,7 @@
  * This enumeration specifies whether to use the <cite>Well Known Text</cite> format defined by ISO 19162
  * (also known as “WKT 2”), or whether to use the format previously defined in OGC 01-009 (referenced as “WKT 1”).
  *
- * <div class="section">WKT 1 variants</div>
+ * <h2>WKT 1 variants</h2>
  * The WKT 2 format should be parsed and formatted consistently by all software products.
  * But the WKT 1 format has been interpreted differently by various implementers.
  * Apache SIS can adapt itself to different WKT variants, sometime automatically. But some aspects can not be guessed.
@@ -114,7 +114,7 @@
      * and parameters formatted with this convention will use the {@linkplain Citations#OGC OGC}
      * names when available.</p>
      *
-     * <div class="section">Differences compared to WKT 2</div>
+     * <h4>Differences compared to WKT 2</h4>
      * WKT 1 and WKT 2 differ in their keywords and syntax, but also in more subtle ways regarding axis names,
      * parameter and code list values. For example in  {@link GeocentricCRS}, WKT 1 uses a legacy set of Cartesian axes
      * which were defined in OGC 01-009. Those axes use the <var>Other</var>, <var>Easting</var> and <var>Northing</var>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/FormattableObject.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/FormattableObject.java
index 36fca3a..c17a2e7 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/FormattableObject.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/FormattableObject.java
@@ -44,12 +44,12 @@
  *       it will rather use non-standard representation if necessary.</li>
  * </ul>
  *
- * <div class="section">Syntax coloring</div>
+ * <h2>Syntax coloring</h2>
  * A convenience {@link #print()} method is provided, which is roughly equivalent to
  * {@code System.out.println(this)} except that syntax coloring is automatically applied
  * if the terminal seems to support the ANSI escape codes.
  *
- * <div class="section">Non-standard WKT</div>
+ * <h2>Non-standard WKT</h2>
  * If this object can not be formatted without violating some WKT constraints,
  * then the behavior depends on the method invoked:
  *
@@ -234,7 +234,7 @@
      *       (insertion point)
      * }
      *
-     * <div class="section">Formatting non-standard WKT</div>
+     * <h4>Formatting non-standard WKT</h4>
      * If the implementation can not represent this object without violating some WKT constraints,
      * it can uses its own (non-standard) keywords but shall declare that it did so by invoking one
      * of the {@link Formatter#setInvalidWKT(IdentifiedObject, Exception) Formatter.setInvalidWKT(…)}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
index 8cdf101..4ba2b70 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
@@ -895,7 +895,7 @@
      * Longitudes are relative to the Greenwich meridian, with values increasing toward East.
      * Latitudes values are increasing toward North.
      *
-     * <div class="section">Numerical precision</div>
+     * <h4>Numerical precision</h4>
      * The ISO 19162 standards recommends to format those values with only 2 decimal digits.
      * This is because {@code GeographicBoundingBox} does not specify the datum, so this box
      * is an approximated information only.
@@ -1636,7 +1636,7 @@
      *
      * <p>If the given unit is null, then this method does nothing and returns {@code null}.</p>
      *
-     * <div class="section">Special case</div>
+     * <h4>Special case</h4>
      * If the WKT conventions are {@code WKT1_COMMON_UNITS}, then this method ignores the given unit
      * and returns {@code null}. See {@link Convention#WKT1_COMMON_UNITS} javadoc for more information.
      *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
index 5160515..ccc011c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
@@ -381,7 +381,7 @@
      *     AUTHORITY["<name>", "<code>"]
      * }
      *
-     * <div class="section">Fallback</div>
+     * <h4>Fallback</h4>
      * The name is a mandatory property, but some invalid WKT with an empty string exist. In such case,
      * we will use the name of the enclosed datum. Indeed, it is not uncommon to have the same name for
      * a geographic CRS and its geodetic datum.
@@ -656,7 +656,7 @@
      * or be any kind of unit, depending on the context in which this {@code parseCoordinateSystem(…)} method is
      * invoked.</p>
      *
-     * <div class="section">Variants of Cartesian type</div>
+     * <h4>Variants of Cartesian type</h4>
      * The {@link WKTKeywords#Cartesian} type may be used for projected, geocentric or other kinds of CRS.
      * However while all those variants are of the same CS type, their axis names and directions differ.
      * Current implementation uses the following rules:
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Symbols.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Symbols.java
index 4ca8c07..c3287d7 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Symbols.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Symbols.java
@@ -259,7 +259,7 @@
      * Returns the locale for formatting dates and numbers.
      * The default value is {@link Locale#ROOT}.
      *
-     * <div class="section">Relationship between {@code Symbols} locale and {@code WKTFormat} locale</div>
+     * <h4>Relationship between {@code Symbols} locale and {@code WKTFormat} locale</h4>
      * The {@code WKTFormat.getLocale(Locale.DISPLAY)} property specifies the language to use when
      * formatting {@link org.opengis.util.InternationalString} instances and can be set to any value.
      * On the contrary, the {@code Locale} property of this {@code Symbols} class controls
@@ -563,7 +563,7 @@
      * Creates a new number format to use for parsing and formatting. Each {@link WKTFormat} will
      * create its own instance, since {@link NumberFormat}s are not guaranteed to be thread-safe.
      *
-     * <div class="section">Scientific notation</div>
+     * <h4>Scientific notation</h4>
      * The {@link NumberFormat} created here does not use scientific notation. This is okay for many
      * WKT formatting purpose since Earth ellipsoid axis lengths in metres are large enough for trigging
      * scientific notation, while we want to express them as normal numbers with centimetre precision.
@@ -627,7 +627,7 @@
      * Invoking this method is equivalent to invoking
      * <code>{@linkplain #containsElement(CharSequence, String) containsElement}(wkt, "AXIS")</code>.
      *
-     * <div class="section">Use case</div>
+     * <h4>Use case</h4>
      * The check for axis elements is of particular interest because the axis order is a frequent cause
      * of confusion when processing geographic data. Some applications just ignore any declared axis order
      * in favor of their own hard-coded (<var>longitude</var>, <var>latitude</var>) axis order.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Transliterator.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Transliterator.java
index 8293c36..2b197a9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Transliterator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Transliterator.java
@@ -40,7 +40,7 @@
  * axis abbreviations rather than texts. Some mappings may also apply to words instead than characters, when the word
  * come from a controlled vocabulary.
  *
- * <div class="section">Permitted characters in Well Known Text</div>
+ * <h2>Permitted characters in Well Known Text</h2>
  * The ISO 19162 standard restricts <cite>Well Known Text</cite> to the following characters in all
  * {@linkplain Formatter#append(String, ElementKind) quoted texts} except in {@code REMARKS["…"]} elements:
  *
@@ -54,7 +54,7 @@
  * <p>The {@link #filter(String)} method is responsible for replacing or removing characters outside the above-cited
  * set of permitted characters.</p>
  *
- * <div class="section">Application to mathematical symbols</div>
+ * <h2>Application to mathematical symbols</h2>
  * For Greek letters used as mathematical symbols in
  * {@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis#getAbbreviation() coordinate axis abbreviations},
  * the ISO 19162 standard recommends:
@@ -81,7 +81,7 @@
  * The {@link #toLatinAbbreviation toLatinAbbreviation(…)} and {@link #toUnicodeAbbreviation toUnicodeAbbreviation(…)}
  * methods are responsible for doing the transliteration at formatting and parsing time, respectively.
  *
- * <div class="section">Replacement of names</div>
+ * <h2>Replacement of names</h2>
  * The longitude and latitude axis names are explicitly fixed by ISO 19111:2007 to <cite>"Geodetic longitude"</cite>
  * and <cite>"Geodetic latitude"</cite>. But ISO 19162:2015 §7.5.3(ii) said that the <cite>"Geodetic"</cite> part in
  * those names shall be omitted at WKT formatting time.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/UnparsableObjectException.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/UnparsableObjectException.java
index 13a0b99..ed9115c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/UnparsableObjectException.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/UnparsableObjectException.java
@@ -26,7 +26,7 @@
 /**
  * Thrown when a <cite>Well Known Text</cite> (WKT) can not be parsed.
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * This exception may contain the error message in two languages:
  *
  * <ul>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTFormat.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTFormat.java
index d738ae7..e5897d1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTFormat.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTFormat.java
@@ -64,7 +64,7 @@
  *   <li>The indentation.</li>
  * </ul>
  *
- * <div class="section">String expansion</div>
+ * <h2>String expansion</h2>
  * Because the strings to be parsed by this class are long and tend to contain repetitive substrings,
  * {@code WKTFormat} provides a mechanism for performing string substitutions before the parsing take place.
  * Long strings can be assigned short names by calls to the {@link #addFragment(String, String)} method.
@@ -90,7 +90,7 @@
  * In particular, the default linear and angular units depend on the context in which the WKT fragment appears.
  * </div>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li><strong>The WKT format is not lossless!</strong>
  *       Objects formatted by {@code WKTFormat} are not guaranteed to be identical after parsing.
@@ -638,7 +638,7 @@
      *   <li><code>{@linkplain CoordinateOperationFactory}.class</code></li>
      * </ul>
      *
-     * <div class="section">Limitation</div>
+     * <h4>Limitation</h4>
      * The current implementation does not serialize the given factories, because they are usually not
      * {@link java.io.Serializable}. The factories used by {@code WKTFormat} instances after deserialization
      * are the default ones.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/package-info.java
index 6fd2462..7907ba6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/package-info.java
@@ -43,7 +43,7 @@
  *   <li>Report warnings that occurred during parsing or formatting.</li>
  * </ul>
  *
- * <div class="section">Referencing WKT</div>
+ * <h2>Referencing WKT</h2>
  * Referencing WKT is defined using Extended Backus Naur Form (EBNF) in two versions:
  * <ul>
  *   <li>ISO 19162 defines the current format, also known as “WKT 2”. The specification is also made
@@ -60,12 +60,12 @@
  * with the WKT syntax require knowledge of the WKT variant used by that software. This variant can be specified by
  * the {@link org.apache.sis.io.wkt.Convention} enumeration.
  *
- * <div class="section">Geometry WKT</div>
+ * <h2>Geometry WKT</h2>
  * The {@link org.apache.sis.geometry.GeneralEnvelope} and {@link org.apache.sis.geometry.GeneralDirectPosition} classes
  * provide their own, limited, WKT parsing and formatting services for the {@code BOX} and {@code POINT} elements.
  * A description for this WKT format can be found on <a href="http://en.wikipedia.org/wiki/Well-known_text">Wikipedia</a>.
  *
- * <div class="section">Where to find WKT examples</div>
+ * <h2>Where to find WKT examples</h2>
  * An excellent source of well-formed WKT is the online <cite>EPSG Geodetic Parameter Registry</cite>.
  * The WKT of many Coordinate Reference System object can be viewed using the pattern below
  * (replace {@code 3395} by the EPSG code of the desired CRS):
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
index 978a55d..2341753 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
@@ -45,7 +45,7 @@
  * The definition of a group of related parameters used by an operation method.
  * {@code DefaultParameterDescriptorGroup} instances are immutable and thus thread-safe.
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * Parameter descriptors are usually pre-defined by the SIS library and available through the following methods:
  *
  * <ul>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
index 94f7287..86f1ff2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
@@ -96,14 +96,14 @@
  *     Class<T> valueClass = parameter.getDescriptor().getValueClass();
  * }
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * A {@linkplain DefaultParameterDescriptor parameter descriptor} must be defined before parameter value can be created.
  * Descriptors are usually pre-defined by map projection or process providers. Given a descriptor, a parameter value can
  * be created by a call to the {@link #DefaultParameterValue(ParameterDescriptor)} constructor or by a call to the
  * {@link ParameterDescriptor#createValue()} method. The later is recommended since it allows descriptors to return
  * specialized implementations.
  *
- * <div class="section">Implementation note for subclasses</div>
+ * <h2>Implementation note for subclasses</h2>
  * All read and write operations (except constructors, {@link #equals(Object)} and {@link #hashCode()})
  * ultimately delegates to the following methods:
  *
@@ -214,7 +214,7 @@
      * If the parameter value has no unit (for example because it is a {@link String} type),
      * then this method returns {@code null}. Note that "no unit" does not mean "dimensionless".
      *
-     * <div class="section">Implementation note for subclasses</div>
+     * <h4>Implementation note for subclasses</h4>
      * All getter methods which need unit information will invoke this {@code getUnit()} method.
      * Subclasses can override this method if they need to compute the unit dynamically.
      *
@@ -234,7 +234,7 @@
      * If no value has been set, then this method returns the
      * {@linkplain DefaultParameterDescriptor#getDefaultValue() default value} (which may be null).
      *
-     * <div class="section">Implementation note for subclasses</div>
+     * <h4>Implementation note for subclasses</h4>
      * All getter methods will invoke this {@code getValue()} method.
      * Subclasses can override this method if they need to compute the value dynamically.
      *
@@ -772,7 +772,7 @@
      *       {@code double[]} arrays are stored <cite>as-is</cite>.</li>
      * </ul>
      *
-     * <div class="section">Implementation note for subclasses</div>
+     * <h4>Implementation note for subclasses</h4>
      * This method is invoked by all setter methods in this class, thus providing a single point that
      * subclasses can override if they want to perform more processing on the value before its storage,
      * or to be notified about value changes.
@@ -800,13 +800,13 @@
      * Invoked by {@link #setValue(Object, Unit)} after the basic verifications have been done and before
      * the value is stored. Subclasses can override this method for performing additional verifications.
      *
-     * <div class="section">Unit of measurement</div>
+     * <h4>Unit of measurement</h4>
      * If the user specified a unit of measurement, then the value given to this method has been converted
      * to the unit specified by the {@linkplain #getDescriptor() descriptor}, for easier comparisons against
      * standardized values. This converted value may be different than the value to be stored in this
      * {@code ParameterValue}, since the later value will be stored in the unit specified by the user.
      *
-     * <div class="section">Standard validations</div>
+     * <h4>Standard validations</h4>
      * The checks for {@linkplain DefaultParameterDescriptor#getValueClass() value class},
      * for {@linkplain DefaultParameterDescriptor#getValueDomain() value domain} and for
      * {@linkplain DefaultParameterDescriptor#getValidValues() valid values} are performed
@@ -912,7 +912,7 @@
      * The value is not cloned by this method however; it is caller's responsibility to not modify the value of
      * the given {@code parameter} instance after this method call.
      *
-     * <div class="section">Instances sharing</div>
+     * <h4>Instances sharing</h4>
      * If this method is invoked more than once with equal {@linkplain #getDescriptor() descriptor},
      * {@linkplain #getValue() value} and {@linkplain #getUnit() unit}, then this method will return
      * the same {@code DefaultParameterValue} instance on a <cite>best effort</cite> basis.
@@ -942,7 +942,7 @@
      *   Parameter["False easting", 0.0, LengthUnit["metre", 1]]
      * }
      *
-     * <div class="section">Unit of measurement</div>
+     * <h4>Unit of measurement</h4>
      * The units of measurement were never specified in WKT 1 format, and are optional in WKT 2 format.
      * If the units are not specified, then they are inferred from the context.
      * Typically, parameter values that are lengths are given in the unit for the projected CRS axes
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
index 5986687..43d7ef6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValueGroup.java
@@ -55,7 +55,7 @@
  *       with {@code ParameterValue} playing a role similar to {@code Map.Entry}.</li>
  * </ul>
  *
- * <div class="section">Instantiation and validity constraints</div>
+ * <h2>Instantiation and validity constraints</h2>
  * {@code ParameterValueGroup} instances are typically created by calls to
  * <code>descriptor.{@linkplain DefaultParameterDescriptorGroup#createValue() createValue()}</code> on a descriptor
  * supplied by a coordinate operation or process provider. New instances are initialized with a {@linkplain #values()
@@ -64,7 +64,7 @@
  * and maximum occurrences of that parameter allowed by the descriptor). If a cardinality constraint is violated, then
  * an {@link InvalidParameterCardinalityException} will be thrown.
  *
- * <div class="section">Setting the parameter values</div>
+ * <h2>Setting the parameter values</h2>
  * After a new {@code ParameterValueGroup} instance has been created, the parameter values can be set by chaining
  * calls to {@link #parameter(String)} with one of the {@code setValue(…)} methods defined in the returned object
  * (see the {@linkplain DefaultParameterValue table of setter methods}). The {@code parameter(String)} method can
@@ -189,7 +189,7 @@
      * Returns the values in this group. The returned list is <cite>live</cite>:
      * changes in this list are reflected on this {@code ParameterValueGroup}, and conversely.
      *
-     * <div class="section">Restrictions</div>
+     * <h4>Restrictions</h4>
      * All write operations must comply to the following conditions:
      *
      * <ul>
@@ -235,7 +235,7 @@
      * returning a list of parameter values because the ISO 19111 standard fixes the {@code ParameterValue}
      * {@linkplain DefaultParameterDescriptor#getMaximumOccurs() maximum occurrence} to 1.</div>
      *
-     * <div class="section">Parameters subgroups</div>
+     * <h4>Parameters subgroups</h4>
      * This method does not search recursively in subgroups. This is because more than one subgroup
      * may exist for the same {@linkplain ParameterDescriptorGroup descriptor}. The user have to
      * {@linkplain #groups(String) query all subgroups} and select explicitly the appropriate one.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
index 59975c0..fc38819 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
@@ -34,7 +34,7 @@
  * implementers). Operation <em>users</em> do not need this builder since they can invoke
  * {@link ParameterDescriptor#createValue()} on the descriptor provided by the implementer.
  *
- * <div class="section">Identification properties</div>
+ * <h2>Identification properties</h2>
  * The following properties are cleared after a call to any {@code createXXX(…)} method,
  * since those properties are specific to the each parameter. Other properties like codespace,
  * version and multiplicity are left unchanged because they may be shared by many parameters.
@@ -55,7 +55,7 @@
  * </ul>
  *
  *
- * <div class="section">Usage example</div>
+ * <h2>Usage example</h2>
  * Parameter descriptors are typically grouped in a {@link ParameterDescriptorGroup}.
  * All parameters usually have the same namespace, which can be declared only once.
  * The following example creates parameters for <cite>"Mercator (variant A)"</cite>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameterized.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameterized.java
index 2d6c01c..79fc09d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameterized.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameterized.java
@@ -41,7 +41,7 @@
     /**
      * Returns the parameter values for this parameterized object, or {@code null} if unknown.
      *
-     * <div class="section">Modifying parameter values</div>
+     * <h4>Modifying parameter values</h4>
      * Unless explicitly allowed by the implementation class, callers should not modify the values
      * returned by this method. Implementers are encouraged to protect their internal data by returning
      * an unmodifiable view or a copy of their parameters. If the caller wishes to edit parameter values,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
index a7db507..caff949 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/Parameters.java
@@ -44,7 +44,7 @@
  * See {@link DefaultParameterValueGroup} javadoc for a description of the standard way to get and set a particular
  * parameter in a group. The remaining of this javadoc is specific to Apache SIS.
  *
- * <div class="section">Convenience methods</div>
+ * <h2>Convenience methods</h2>
  * This class provides the following convenience static methods:
  * <ul>
  *   <li>{@link #cast(ParameterValue, Class) cast(…, Class)} for type safety with parameterized types.</li>
@@ -70,7 +70,7 @@
  * </table>
  *
  *
- * <div class="section">Fetching parameter values despite different names, types or units</div>
+ * <h2>Fetching parameter values despite different names, types or units</h2>
  * The common way to get a parameter is to invoke the {@link #parameter(String)} method.
  * This {@code Parameters} class provides alternative ways, using a {@link ParameterDescriptor} argument
  * instead than a {@code String} argument. Those descriptors provide additional information like the various
@@ -91,7 +91,7 @@
  * (i.e. returned values are converted to the units of measurement specified by the given parameter descriptor).
  *
  *
- * <div class="section">Note for subclass implementers</div>
+ * <h2>Note for subclass implementers</h2>
  * This class does not implement any method from the {@link ParameterValueGroup} interface
  * (this class is not named “{@code AbstractParameterValueGroup}” for that reason).
  * Extending this class or extending {@link Object} make almost no difference for implementers;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
index 47d25fe..fce229f 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
@@ -77,7 +77,7 @@
  * For a more efficient matrix storage,
  * see the {@linkplain org.apache.sis.referencing.operation.matrix matrix package}.</p>
  *
- * <div class="section">Formatting</div>
+ * <h2>Formatting</h2>
  * In the particular case of a tensor of {@linkplain #rank() rank} 2 (i.e. a matrix),
  * the parameters are typically formatted as below. Note that in the EPSG convention,
  * the matrix is implicitly {@linkplain Matrices#isAffine affine} and of dimension 3×3.
@@ -121,7 +121,7 @@
  * depends on the {@code "num_row"} and {@code "num_col"} parameter values. For this reason, the descriptor of
  * matrix or tensor parameters is not immutable.
  *
- * <div class="section">Usage examples</div>
+ * <h2>Usage examples</h2>
  * For creating a new group of parameters for a matrix using the {@link #WKT1} naming conventions,
  * one can use the following code:
  *
@@ -184,7 +184,7 @@
      * }</td></tr>
      * </table>
      *
-     * <div class="section">Relationship with EPSG</div>
+     * <h4>Relationship with EPSG</h4>
      * The above-cited group of parameters are close, but not identical, to the definitions provided
      * by the <cite>"Affine parametric transformation"</cite> (EPSG:9624) operation method.
      * The differences are:
@@ -476,12 +476,12 @@
      * This method is invoked by {@link #getElementDescriptor(int[])} when a new descriptor needs
      * to be created.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation converts the given indices to a parameter name by invoking the
      * {@link #indicesToName(int[])} method, then creates a descriptor for an optional parameter
      * of that name. The default value is given by {@link #getDefaultValue(int[])}.
      *
-     * <div class="section">Subclassing</div>
+     * <h4>Subclassing</h4>
      * Subclasses can override this method if they want more control on descriptor properties
      * like identification information, aliases or value domain.
      *
@@ -504,13 +504,13 @@
      * Returns the parameter descriptor name of a matrix or tensor element at the given indices.
      * The returned name shall be parsable by the {@link #nameToIndices(String)} method.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation requires an {@code indices} array having a length equals to the {@linkplain #rank()
      * rank}. That length is usually 2, where {@code indices[0]} is the <var>row</var> index and {@code indices[1]} is
      * the <var>column</var> index. Then this method builds a name with the “{@link #prefix} + <var>row</var> +
      * {@link #separator} + <var>column</var> + …” pattern (e.g. {@code "elt_0_0"}).
      *
-     * <div class="section">Subclassing</div>
+     * <h4>Subclassing</h4>
      * If a subclass overrides this method for creating different names, then that subclass shall
      * also override {@link #nameToIndices(String)} for parsing those names.
      *
@@ -533,7 +533,7 @@
      * Returns the indices of matrix element for the given parameter name, or {@code null} if none.
      * This method is the converse of {@link #indicesToName(int[])}.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation expects a name matching the “{@link #prefix} + <var>row</var> + {@link #separator} +
      * <var>column</var> + …” pattern and returns an array containing the <var>row</var>, <var>column</var> and other
      * indices, in that order.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
index 3ccabeb..a5ef86b 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/UnmodifiableParameterValue.java
@@ -38,7 +38,7 @@
  * The value is not cloned by this method however; it is caller's responsibility to not modify the value of
  * the given {@code parameter} instance after this method call.
  *
- * <div class="section">Instances sharing</div>
+ * <h2>Instances sharing</h2>
  * If the {@link #create(ParameterValue)} method is invoked more than once with equal descriptor, value and unit,
  * then the method will return the same {@code UnmodifiableParameterValue} instance on a <cite>best effort</cite>
  * basis.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
index 458a1d6..e0f6d61 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/package-info.java
@@ -55,7 +55,7 @@
  *   <li>Group may contain other groups.</li>
  * </ul>
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * When using this {@code org.apache.sis.parameter} package, the starting point is usually to obtain a
  * {@linkplain org.apache.sis.parameter.DefaultParameterDescriptorGroup parameter group descriptor} for
  * the operation of interest. Those groups are provided by the operation implementers, so users do not
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractIdentifiedObject.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractIdentifiedObject.java
index ab30872..c20bab5 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractIdentifiedObject.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractIdentifiedObject.java
@@ -93,7 +93,7 @@
  *   <li>optional {@linkplain #getRemarks() remarks}.</li>
  * </ul>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * This class is conceptually <cite>abstract</cite>, even if it is technically possible to instantiate it.
  * Applications should instead instantiate the most specific subclass having a name starting by {@code Default}.
  * However exceptions to this rule may occur when it is not possible to identify the exact type.
@@ -115,7 +115,7 @@
  *       All other information are fetched from the database.</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable if the {@link Citation}, {@link ReferenceIdentifier}, {@link GenericName} and
  * {@link InternationalString} instances given to the constructor are also immutable. Most SIS subclasses and
  * related classes are immutable under similar conditions. This means that unless otherwise noted in the javadoc,
@@ -305,7 +305,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Localization</div>
+     * <h4>Localization</h4>
      * All localizable attributes like {@code "remarks"} may have a language and country code suffix.
      * For example the {@code "remarks_fr"} property stands for remarks in {@linkplain Locale#FRENCH French} and
      * the {@code "remarks_fr_CA"} property stands for remarks in {@linkplain Locale#CANADA_FRENCH French Canadian}.
@@ -315,7 +315,7 @@
      * is used only on a <cite>best effort</cite> basis. The locale is discarded after successful construction
      * since localizations are applied by the {@link InternationalString#toString(Locale)} method.</p>
      *
-     * <div class="section">Properties map versus explicit arguments</div>
+     * <h4>Properties map versus explicit arguments</h4>
      * Generally speaking, information provided in the {@code properties} map are considered ignorable metadata
      * while information provided in explicit arguments to the sub-class constructors have an impact on coordinate
      * transformation results. See {@link #equals(Object, ComparisonMode)} for more information.
@@ -463,7 +463,7 @@
      * <p>The default implementation returns {@code IdentifiedObject.class}.
      * Subclasses implementing a more specific GeoAPI interface shall override this method.</p>
      *
-     * <div class="section">Invariants</div>
+     * <h4>Invariants</h4>
      * The following invariants must hold for all {@code AbstractIdentifiedObject} instances:
      * <ul>
      *   <li><code>getInterface().{@linkplain Class#isInstance(Object) isInstance}(this)</code>
@@ -519,7 +519,7 @@
     /**
      * Returns a narrative explanation of the role of this object.
      *
-     * <div class="section">Default value</div>
+     * <h4>Default value</h4>
      * The default implementation returns the {@linkplain ImmutableIdentifier#getDescription() description}
      * provided by this object's {@linkplain #getName() name}.
      *
@@ -591,7 +591,7 @@
      *       projection or parameter name.</li>
      * </ul>
      *
-     * <div class="section">Usage</div>
+     * <h4>Usage</h4>
      * This method is invoked by SIS when comparing in {@link ComparisonMode#IGNORE_METADATA IGNORE_METADATA} mode
      * two objects that can be differentiated only by some identifier (name or alias), like
      * {@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis coordinate system axes},
@@ -605,7 +605,7 @@
      * and {@code "Mercator (1SP)"} (the legacy name prior EPSG 7.6). Since the later is still in frequent use, SIS
      * accepts it as an alias of the <cite>Mercator (variant A)</cite> projection.</p>
      *
-     * <div class="section">Overriding by subclasses</div>
+     * <h4>Overriding by subclasses</h4>
      * Some subclasses add more flexibility to the comparisons:
      * <ul>
      *   <li>{@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis#isHeuristicMatchForName(String)
@@ -619,7 +619,7 @@
      *       Example: <cite>"(Paris)"</cite> in <cite>"Nouvelle Triangulation Française (Paris)"</cite>.</li>
      * </ul>
      *
-     * <div class="section">Future evolutions</div>
+     * <h4>Future evolutions</h4>
      * This method implements recommendations from the
      * <a href="http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#139">WKT 2 specification §B.5.2</a>,
      * together with heuristic rules learned from experience while trying to provide inter-operability
@@ -671,7 +671,7 @@
      * then the transformation from {@code sourceCRS} to {@code targetCRS} should be the identity transform
      * even if the two CRS do not have the same name.
      *
-     * <div class="section">When object name matter</div>
+     * <h4>When object name matter</h4>
      * Some subclasses (especially
      * {@link org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis},
      * {@link org.apache.sis.referencing.datum.AbstractDatum} and
@@ -682,7 +682,7 @@
      * The name comparison may be lenient however, i.e. the rules may accept a name matching an alias.
      * See {@link #isHeuristicMatchForName(String)} for more information.
      *
-     * <div class="section">Conformance to the <code>equals(Object)</code> method contract</div>
+     * <h4>Conformance to the <code>equals(Object)</code> method contract</h4>
      * {@link ComparisonMode#STRICT} is the only mode compliant with the {@link Object#equals(Object)} contract.
      * For all other modes, the comparison is not guaranteed to be <cite>symmetric</cite> neither
      * <cite>transitive</cite>. See {@link LenientComparable#equals(Object, ComparisonMode) LenientComparable}
@@ -796,7 +796,7 @@
      * <em>not</em> guaranteed to be stable between different versions of the Apache SIS library, or
      * between libraries running on different JVM.
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * This method invokes {@link #computeHashCode()} when first needed, then caches the result.
      * Subclasses shall override {@link #computeHashCode()} instead than this method.
      *
@@ -823,7 +823,7 @@
      * object in a JVM. The hash code value does not need to be the same in two different executions of
      * the JVM.
      *
-     * <div class="section">Overriding</div>
+     * <h4>Overriding</h4>
      * Subclasses can override this method for using more properties in hash code calculation.
      * All {@code computeHashCode()} methods shall invoke {@code super.computeHashCode()},
      * <strong>not</strong> {@code hashCode()}. Example:
@@ -869,7 +869,7 @@
      * }
      * </div></div>
      *
-     * <div class="section">Formatting non-standard WKT</div>
+     * <h4>Formatting non-standard WKT</h4>
      * If the implementation can not represent this object without violating some WKT constraints,
      * it can uses its own (non-standard) keywords but shall declare that it did so by invoking one
      * of the {@link Formatter#setInvalidWKT(IdentifiedObject, Exception) Formatter.setInvalidWKT(…)}
@@ -1027,7 +1027,7 @@
      * {@code AbstractIdentifiedObject} instance. This is needed for unmarshalling with JAXB and should not
      * be used in other context.</p>
      *
-     * <div class="section">Why there is no <code>setNames(…)</code> method</div>
+     * <h4>Why there is no <code>setNames(…)</code> method</h4>
      * Some JAXB implementations never invoke setter method for collections. Instead they invoke the getter and
      * add directly the identifiers in the returned collection. Whether JAXB will perform or not a final call to
      * {@code setNames(…)} is JAXB-implementation dependent (JDK7 does but JDK6 and JDK8 early access do not).
@@ -1047,7 +1047,7 @@
      * Used by JAXB only at (un)marshalling time because GML merges the name and aliases in a single {@code <gml:name>}
      * property.
      *
-     * <div class="section">Why we do not use {@code Identifier[]} array instead</div>
+     * <h4>Why we do not use {@code Identifier[]} array instead</h4>
      * It would be easier to define a {@code getNames()} method returning all identifiers in an array, and let JAXB
      * invoke {@code setNames(Identifier[])} at unmarshalling time.  But methods expecting an array in argument are
      * invoked by JAXB only after the full element has been unmarshalled. For some {@code AbstractIdentifiedObject}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractReferenceSystem.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractReferenceSystem.java
index d7cdffd..f342934 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractReferenceSystem.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/AbstractReferenceSystem.java
@@ -51,11 +51,11 @@
  *   <li>a {@linkplain #getScope() scope}, which describes the domain of usage or limitation of usage.
  * </ul>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * This class is conceptually <cite>abstract</cite>, even if it is technically possible to instantiate it.
  * Typical applications should create instances of the most specific subclass prefixed by {@code Default} instead.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar
  * conditions. This means that unless otherwise noted in the javadoc, {@code ReferenceSystem} instances created using
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
index 3debd19..bd1522e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
@@ -81,7 +81,7 @@
  *       {@link #setRemarks(CharSequence) code setRemarks(…)} method.</li>
  * </ul>
  *
- * <div class="section">Namespaces and scopes</div>
+ * <h2>Namespaces and scopes</h2>
  * The {@code addName(…)} and {@code addIdentifier(…)} methods come in three flavors:
  *
  * <ul class="verbose">
@@ -119,7 +119,7 @@
  * <code>"<b>OGC:</b>Mercator_1SP"</code> respectively.</div>
  *
  *
- * <div class="section">Builder property lifetimes</div>
+ * <h2>Builder property lifetimes</h2>
  * Some complex objects require the creation of many components. For example constructing a
  * {@linkplain org.apache.sis.referencing.crs.AbstractCRS Coordinate Reference System} (CRS) may require constructing a
  * {@linkplain org.apache.sis.referencing.cs.AbstractCS coordinate system}, a
@@ -145,11 +145,11 @@
  *   </li>
  * </ul>
  *
- * <div class="section">Usage examples</div>
+ * <h2>Usage examples</h2>
  * See {@link org.apache.sis.parameter.ParameterBuilder} class javadoc for more examples with the
  * <cite>Mercator</cite> projection parameters.
  *
- * <div class="section">Note for subclass implementers</div>
+ * <h2>Note for subclass implementers</h2>
  * <ul>
  *   <li>The type {@code <B>} shall be exactly the subclass type.
  *       For performance reasons, this is verified only if Java assertions are enabled.</li>
@@ -483,12 +483,12 @@
      * code space} and {@linkplain #setVersion(String) version} information for creating the
      * {@link Identifier} or {@link GenericName} object.
      *
-     * <div class="section">Name and aliases</div>
+     * <h4>Name and aliases</h4>
      * This method can be invoked many times. The first invocation sets the
      * {@linkplain AbstractIdentifiedObject#getName() primary name}, and
      * all subsequent invocations add an {@linkplain AbstractIdentifiedObject#getAlias() alias}.
      *
-     * <div class="section">Deprecated names</div>
+     * <h4>Deprecated names</h4>
      * Some names may exist for historical reasons but have their use discouraged.
      * If <code>{@linkplain #setDeprecated(boolean) setDeprecated}(true)</code> has been invoked, then this
      * method creates a deprecated alias with the current {@linkplain #setRemarks(CharSequence) remarks}.
@@ -575,7 +575,7 @@
      * {@linkplain #setVersion(String) version} and {@linkplain #setDescription(CharSequence) description}
      * specified to this builder (if any), since the given identifier may already contain those information.
      *
-     * <div class="section">Name and aliases</div>
+     * <h4>Name and aliases</h4>
      * This method can be invoked many times. The first invocation sets the
      * {@linkplain AbstractIdentifiedObject#getName() primary name} to the given value, and
      * all subsequent invocations add an {@linkplain AbstractIdentifiedObject#getAlias() alias}.
@@ -601,7 +601,7 @@
      * {@linkplain #setVersion(String) version} and {@linkplain #setDescription(CharSequence) description}
      * specified to this builder (if any), since the given generic name may already contain those information.
      *
-     * <div class="section">Name and aliases</div>
+     * <h4>Name and aliases</h4>
      * This method can be invoked many times. The first invocation sets the
      * {@linkplain AbstractIdentifiedObject#getName() primary name} to the given value, and
      * all subsequent invocations add an {@linkplain AbstractIdentifiedObject#getAlias() alias}.
@@ -628,7 +628,7 @@
      * {@linkplain #setVersion(String) version} and {@linkplain #setDescription(CharSequence) description} information
      * for creating the {@link Identifier} object.
      *
-     * <div class="section">Deprecated identifiers</div>
+     * <h4>Deprecated identifiers</h4>
      * Some identifiers may exist for historical reasons but have their use discouraged.
      * If <code>{@linkplain #setDeprecated(boolean) setDeprecated}(true)</code> has been invoked, then this
      * method creates a deprecated identifier with the current {@linkplain #setRemarks(CharSequence) remarks}.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
index b2bffe3..781e344 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
@@ -99,7 +99,7 @@
  *   <li>Finding coordinate operations between a source and a target CRS.</li>
  * </ul>
  *
- * <div class="section">Usage example</div>
+ * <h2>Usage example</h2>
  * The most frequently used methods in this class are {@link #forCode forCode(…)}, {@link #fromWKT fromWKT(…)}
  * and {@link #findOperation findOperation(…)}. An usage example is like below
  * (see the <a href="http://sis.apache.org/tables/CoordinateReferenceSystems.html">Apache SIS™ Coordinate
@@ -119,7 +119,7 @@
  *   System.out.println(position);
  * }
  *
- * <div class="section">Note on kinds of CRS</div>
+ * <h2>Note on kinds of CRS</h2>
  * The {@link #getSingleComponents(CoordinateReferenceSystem)} method decomposes an arbitrary CRS into a flat
  * list of single components. In such flat list, vertical and temporal components can easily be identified by
  * {@code instanceof} checks. But identifying the horizontal component is not as easy. The list below suggests
@@ -273,7 +273,7 @@
      * Should the WKT description and the authoritative description be in conflict, the WKT description prevails
      * as mandated by ISO 19162 standard (see {@link #fromAuthority fromAuthority(…)} if a different behavior is needed).
      *
-     * <div class="section">Usage and performance considerations</div>
+     * <h4>Usage and performance considerations</h4>
      * This convenience method delegates to
      * {@link org.apache.sis.referencing.factory.GeodeticObjectFactory#createFromWKT(String)}
      * using a default factory instance. This is okay for occasional use, but has the following limitations:
@@ -388,7 +388,7 @@
      *   <li>Otherwise this method silently returns the given CRS as-is.</li>
      * </ul>
      *
-     * <div class="section">Avoiding warning redundancies</div>
+     * <h4>Avoiding warning redundancies</h4>
      * The warnings logged by this method are redundant with warnings logged by other methods in this class,
      * in particular {@link #fromWKT(String)} and {@link #fromXML(String)} methods. For avoiding this annoyance,
      * a {@code null} value for the {@code warningFilter} argument means to shut off those redundant loggings.
@@ -830,7 +830,7 @@
      * {@linkplain org.apache.sis.metadata.iso.extent.DefaultExtent#intersect intersection}
      * of the domain of validity of all components.
      *
-     * <div class="section">Ellipsoidal height</div>
+     * <h4>Ellipsoidal height</h4>
      * If a two-dimensional geographic or projected CRS if followed or preceded by a vertical CRS with ellipsoidal
      * {@linkplain org.apache.sis.referencing.datum.DefaultVerticalDatum#getVerticalDatumType() datum type}, then
      * this method combines them in a single three-dimensional geographic or projected CRS.  Note that standalone
@@ -838,7 +838,7 @@
      * the action described here fixes the issue. This is the reverse of <code>{@linkplain #getVerticalComponent
      * getVerticalComponent}(crs, true)</code>.
      *
-     * <div class="section">Components order</div>
+     * <h4>Components order</h4>
      * Apache SIS is permissive on the order of components that can be used in a compound CRS.
      * However for better inter-operability, users are encouraged to follow the order mandated by ISO 19162:
      *
@@ -880,7 +880,7 @@
      * This method can be used for dimensionality reduction, but not for changing axis order.
      * The specified dimensions are used as if they were in strictly increasing order without duplicated values.
      *
-     * <div class="section">Ellipsoidal height</div>
+     * <h4>Ellipsoidal height</h4>
      * This method can transform a three-dimensional geographic CRS into a two-dimensional geographic CRS.
      * In this aspect, this method is the converse of {@link #compound(CoordinateReferenceSystem...)}.
      * This method can also extract the {@linkplain CommonCRS.Vertical#ELLIPSOIDAL ellipsoidal height}
@@ -1114,7 +1114,7 @@
      * Otherwise if the given CRS is compound, then this method searches for the first vertical component
      * in the order of the {@linkplain #getSingleComponents(CoordinateReferenceSystem) single components list}.
      *
-     * <div class="section">Height in a three-dimensional geographic CRS</div>
+     * <h4>Height in a three-dimensional geographic CRS</h4>
      * In ISO 19111 model, ellipsoidal heights are indissociable from geographic CRS because such heights
      * without their (<var>latitude</var>, <var>longitude</var>) locations make little sense. Consequently
      * a standard-conformant library should return {@code null} when asked for the {@code VerticalCRS}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodesicsOnEllipsoid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodesicsOnEllipsoid.java
index 5af8a70..98302b0 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodesicsOnEllipsoid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodesicsOnEllipsoid.java
@@ -845,7 +845,7 @@
      *
      * The results should have only one positive root {@literal (μ > 0)}.
      *
-     * <div class="section">Condition on <var>y</var> value</div>
+     * <h4>Condition on <var>y</var> value</h4>
      * This method is indeterminate when <var>y</var> → 0 (it returns {@link Double#NaN}). For values too close to zero,
      * the result may be non-significative because of rounding errors. For choosing a threshold value for <var>y</var>,
      * {@code GeodesicsOnEllipsoidTest.Calculator} compares the value computed by this method against the value computed
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticCalculator.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticCalculator.java
index d4dbabe..dcf9399 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticCalculator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticCalculator.java
@@ -72,7 +72,7 @@
  *   </li>
  * </ul>
  *
- * <div class="section">Algorithms and accuracy</div>
+ * <h2>Algorithms and accuracy</h2>
  * {@code GeodeticCalculator} uses two set of formulas, depending if the figure of the Earth
  * {@linkplain Ellipsoid#isSphere() is a sphere} or an ellipsoid.
  * Publications relevant to this class are:
@@ -100,14 +100,14 @@
  * Apache SIS accuracy does not go as far as GeographicLib because the rest of Apache SIS
  * library (map projections, <i>etc.</i>) aims for an one centimetre accuracy anyway.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * Current implementation can not compute the geodesics in some cases.
  * In particular, calculation may fail for antipodal points on an ellipsoid.
  * Karney's algorithm should cover those cases,
  * but this {@code GeodeticCalculator} implementation may not be sufficiently tuned.
  * See <a href="https://issues.apache.org/jira/browse/SIS-467">SIS-467</a> for more information.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is not thread-safe. If geodetic calculations are needed in a multi-threads environment,
  * then a distinct instance of {@code GeodeticCalculator} needs to be created for each thread.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
index 8697ea8..2f84a1a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
@@ -300,7 +300,7 @@
      * then this method fallback on <code>object.{@linkplain AbstractIdentifiedObject#getName() getName()}</code>.
      * The first element found is formatted by {@link #toString(Identifier)}.
      *
-     * <div class="section">Recommended alternatives</div>
+     * <h4>Recommended alternatives</h4>
      * <ul>
      *   <li>If the code of a specific authority is wanted (typically EPSG), then consider
      *       using {@link #getIdentifier(IdentifiedObject, Citation)} instead.</li>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
index b17ca1b..f603083 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
@@ -49,7 +49,7 @@
  * {@link org.opengis.referencing.crs.CoordinateReferenceSystem} objects.
  *
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link Citation} and {@link InternationalString}
  * arguments given to the constructor are also immutable. It is caller's responsibility to ensure that those
  * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transitionTo
@@ -58,7 +58,7 @@
  * any public {@code ImmutableIdentifier} state.
  *
  *
- * <div class="section">Text, URN and XML representations</div>
+ * <h2>Text, URN and XML representations</h2>
  * Identifiers are represented in various ways depending on the context. In particular identifiers are
  * marshalled differently depending on whether they appear in a metadata object or a referencing object.
  * The following examples show an identifier for a Geographic Coordinate Reference System (CRS)
@@ -262,7 +262,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Localization</div>
+     * <h4>Localization</h4>
      * {@code "description"} is a localizable attributes which may have a language and country
      * code suffix. For example the {@code "description_fr"} property stands for description in
      * {@linkplain Locale#FRENCH French} and the {@code "description_fr_CA"} property stands
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
index ae0ce7d..d54d386 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
@@ -57,7 +57,7 @@
  * {@linkplain AbstractIdentifiedObject#getAlias() aliases} and have those names used in contexts
  * where {@code Identifier} instances are required, like GML marshalling time.
  *
- * <div class="section">Name ↔ Identifier mapping</div>
+ * <h2>Name ↔ Identifier mapping</h2>
  * The {@code GenericName} attributes will be inferred from {@code Identifier} attributes as below:
  *
  * <ul>
@@ -76,7 +76,7 @@
  * Note that the scope does not appear in the string representation of names.</div>
  *
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the {@link Citation} and {@link InternationalString}
  * arguments given to the constructor are also immutable. It is caller's responsibility to ensure that those
  * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transitionTo
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractCRS.java
index 9c7bb22..8d23613 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/AbstractCRS.java
@@ -65,12 +65,12 @@
  *
  * However most subclasses restrict the allowed number of dimensions.
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * This class is conceptually <cite>abstract</cite>, even if it is technically possible to instantiate it.
  * Typical applications should create instances of the most specific subclass prefixed by {@code Default} instead.
  * An exception to this rule may occur when it is not possible to identify the exact CRS type.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar
  * conditions. This means that unless otherwise noted in the javadoc, {@code CoordinateReferenceSystem} instances
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultCompoundCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultCompoundCRS.java
index 08f5022..2d3b33d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultCompoundCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultCompoundCRS.java
@@ -86,7 +86,7 @@
  * part (e.g. the EPSG identifier) that would otherwise been lost. Users can obtain the list of their
  * choice by invoking {@link #getSingleComponents()} or {@link #getComponents()} respectively.
  *
- * <div class="section">Component order</div>
+ * <h2>Component order</h2>
  * ISO 19162 restricts compound CRS to the following components in that order:
  * <ul>
  *   <li>A mandatory horizontal CRS (only one of two-dimensional {@code GeographicCRS} or {@code ProjectedCRS} or {@code EngineeringCRS}).</li>
@@ -103,7 +103,7 @@
  *
  * However users are encouraged to follow ISO 19162 restriction for better portability.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and all {@link CoordinateReferenceSystem} instances given to the constructor are also immutable.
  * Unless otherwise noted in the javadoc, this condition holds if all components were created using only
@@ -561,7 +561,7 @@
     /**
      * Formats this CRS as a <cite>Well Known Text</cite> {@code CompoundCRS[…]} element.
      *
-     * <div class="section">WKT validity</div>
+     * <h4>WKT validity</h4>
      * The WKT version 2 format restricts compound CRS to the following components in that order:
      *
      * <ul>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultDerivedCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
index 48d399f..1ad71fb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
@@ -87,7 +87,7 @@
  * Those specialized subclasses can be inferred automatically by the {@link #create create(…)} static method.
  * Alternatively, users can create their own {@code DefaultDerivedCRS} subclass implementing the desired interface.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar
  * conditions. This means that unless otherwise noted in the javadoc, {@code GeneralDerivedCRS} instances created
@@ -189,7 +189,7 @@
      * values specifically from the {@code baseCRS} to {@code this} CRS (optionally with an interpolation CRS);
      * there is no consideration about <cite>“normalized CRS”</cite> in this constructor.
      *
-     * <div class="section">Conversion properties</div>
+     * <h4>Conversion properties</h4>
      * The {@code properties} map given in argument can contain any entries documented in the
      * {@linkplain #DefaultDerivedCRS(Map, SingleCRS, Conversion, CoordinateSystem) above constructor},
      * together with any entries documented by the {@linkplain DefaultConversion#DefaultConversion(Map,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
index eb38ca0..586b204 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
@@ -54,7 +54,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultUserDefinedCS User Defined}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
index c0ea42f..19e152a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
@@ -40,7 +40,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultSphericalCS Spherical}.
  * </p>
  *
- * <div class="section">Creating new geocentric CRS instances</div>
+ * <h2>Creating new geocentric CRS instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * Choice 1 in the following list is the easiest but most restrictive way to get a geocentric CRS.
@@ -63,7 +63,7 @@
  *     GeodeticDatum datum = CommonCRS.WGS84.geocentric();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeographicCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeographicCRS.java
index 6c7c33d..d3a1208 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeographicCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultGeographicCRS.java
@@ -53,7 +53,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultEllipsoidalCS Ellipsoidal}.
  * </p>
  *
- * <div class="section">Creating new geographic CRS instances</div>
+ * <h2>Creating new geographic CRS instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * Choice 1 in the following list is the easiest but most restrictive way to get a geographic CRS.
@@ -78,7 +78,7 @@
  *     GeodeticDatum datum = CommonCRS.WGS84.geographic();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
@@ -246,7 +246,7 @@
     /**
      * Returns a coordinate reference system of the same type than this CRS but with different axes.
      *
-     * <div class="section">Special case</div>
+     * <h4>Special case</h4>
      * If the first axis is the longitude in the [-180 … +180]° range and the identifier is EPSG:4267,
      * EPSG:4269 or EPSG:4326, then this method magically add the CRS:27, CRS:83 or CRS:84 identifier.
      * Without this special case, the normal behavior would be no identifier. The expected behavior is
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultImageCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultImageCRS.java
index 557f827..d699626 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultImageCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultImageCRS.java
@@ -46,7 +46,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultAffineCS Affine}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultParametricCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultParametricCRS.java
index 66d1869..70e3e9a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultParametricCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultParametricCRS.java
@@ -45,7 +45,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultParametricCS Parametric}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultProjectedCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
index d790c40..87532de 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
@@ -65,7 +65,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultCartesianCS Cartesian}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultTemporalCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
index 76b18be..c15a6f9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
@@ -59,7 +59,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultTimeCS Time}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultVerticalCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultVerticalCRS.java
index 556b11b..8d6a65b 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultVerticalCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/DefaultVerticalCRS.java
@@ -44,7 +44,7 @@
  *   {@linkplain org.apache.sis.referencing.cs.DefaultVerticalCS Vertical}.
  * </p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the coordinate system and the datum instances given to the constructor are also immutable. Unless otherwise noted
  * in the javadoc, this condition holds if all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/package-info.java
index 5cf04f4..92333b8 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/crs/package-info.java
@@ -49,7 +49,7 @@
  *   </tr>
  * </table>
  *
- * <div class="section">Apache SIS extensions</div>
+ * <h2>Apache SIS extensions</h2>
  * Some SIS implementations provide additional methods that are not part of OGC/ISO specifications:
  *
  * <ul>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java
index a349870..ee58ac3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java
@@ -66,7 +66,7 @@
  * (e.g. in a {@code LOCAL_CS} element). In such exceptional situation, a plain {@code AbstractCS} object may be
  * instantiated.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Most SIS subclasses and
  * related classes are immutable under similar conditions. This means that unless otherwise noted in the javadoc,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
index c1f6cd2..c110764 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
@@ -78,7 +78,7 @@
  *   </tr>
  * </table>
  *
- * <div class="section">Note on axis order</div>
+ * <h2>Note on axis order</h2>
  * The axis order is specified by the authority (typically a national agency) defining the Coordinate Reference System
  * (CRS). The order depends on the CRS type and the country defining the CRS. In the case of geographic CRS, the
  * (<var>latitude</var>, <var>longitude</var>) axis order is widely used by geographers and pilotes for centuries.
@@ -96,7 +96,7 @@
  * with older OGC specifications or other software products, CRS forced to "longitude first" axis order can be created
  * using the {@link #DISPLAY_ORIENTED} or {@link #NORMALIZED} enumeration value.</p>
  *
- * <div class="section">Note on range of longitude values</div>
+ * <h2>Note on range of longitude values</h2>
  * Most geographic CRS have a longitude axis defined in the [-180 … +180]° range. All map projections in Apache SIS are
  * designed to work in that range. This is also the range of {@link Math} trigonometric functions like {@code atan2(y,x)}.
  * However some data use the [0 … 360]° range instead. A geographic CRS can be shifted to that range of longitude values
@@ -269,7 +269,7 @@
      * {@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis#getMinimumValue() minimum value})
      * are unchanged.
      *
-     * <div class="section">Usage</div>
+     * <h4>Usage</h4>
      * The most frequent usage of this enum is for shifting longitude values from the [-180 … +180]° range
      * to the [0 … 360]° range. However this enum could also be used with climatological calendars if their
      * time axis has a wrapround range meaning.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxisFilter.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxisFilter.java
index 1342835..f68f30d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxisFilter.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxisFilter.java
@@ -36,11 +36,11 @@
  * For example excluding the <var>z</var> axis of a {@linkplain DefaultCylindricalCS cylindrical} coordinate system
  * results in a {@linkplain DefaultPolarCS polar} coordinate system.</p>
  *
- * <div class="section">Default implementation</div>
+ * <h2>Default implementation</h2>
  * All methods in this interface have a default implementation equivalent to <i>no-operation</i>.
  * Implementers need to override only the methods for the aspects to change.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * This interface is not for changing axis order.
  * For changing axis order in addition to axis directions or units, see {@link AxesConvention}.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
index 6996a92..71cebe3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
@@ -116,7 +116,7 @@
      * {@code directionAlongMeridian(AxisDirection.SOUTH, -90)} returns an axis direction for
      * <cite>“South along 90°W”</cite>.</div>
      *
-     * <div class="section">Reference meridian</div>
+     * <h4>Reference meridian</h4>
      * The reference meridian depends on the context. It is usually the prime meridian of the
      * {@linkplain org.apache.sis.referencing.datum.DefaultGeodeticDatum geodetic datum} of the
      * {@linkplain org.apache.sis.referencing.crs.DefaultGeographicCRS geographic CRS} instance
@@ -139,7 +139,7 @@
      * Returns the arithmetic (counterclockwise) angle from the first axis direction to the second direction.
      * This method returns a value between -180° and +180°, or {@code null} if no angle can be computed.
      *
-     * <div class="section">Horizontal directions</div>
+     * <h4>Horizontal directions</h4>
      * For any pair of compass directions which are not opposite directions, a positive angle denotes
      * a right-handed system while a negative angle denotes a left-handed system. Examples:
      *
@@ -154,7 +154,7 @@
      * that the meridians are relative to the same prime meridian. This is the case if the axes are part of
      * the same {@code CoordinateSystem} instance.</div>
      *
-     * <div class="section">Horizontal and vertical directions</div>
+     * <h4>Horizontal and vertical directions</h4>
      * By convention this method defines the angle from any compass direction to the {@link AxisDirection#UP UP}
      * vertical direction as 90°, and the angle of any compass direction to the {@link AxisDirection#DOWN DOWN}
      * vertical direction as -90°. The sign of those angles gives no indication about whether the coordinate system
@@ -163,7 +163,7 @@
      * <p>All angles are approximations since this method does not take the Earth ellipsoidal or geoidal shape in
      * account.</p>
      *
-     * <div class="section">Invariants</div>
+     * <h4>Invariants</h4>
      * For any non-null return value:
      * <ul>
      *   <li>{@code angle(A, A) = 0°}</li>
@@ -243,7 +243,7 @@
      * ({@linkplain AxisDirection#EAST East}, {@linkplain AxisDirection#NORTH North})
      * are taken in account by this method.
      *
-     * <div class="section">Conditions</div>
+     * <h4>Conditions</h4>
      * The two coordinate systems must implement the same GeoAPI coordinate system interface.
      * For example if {@code sourceCS} is a {@link org.opengis.referencing.cs.CartesianCS},
      * then {@code targetCS} must be a {@code CartesianCS} too.
@@ -360,7 +360,7 @@
      *     });
      * }</div>
      *
-     * <div class="section">Coordinate system normalization</div>
+     * <h4>Coordinate system normalization</h4>
      * This method is often used together with {@link #swapAndScaleAxes swapAndScaleAxes(…)} for normalizing the
      * coordinate values given to a {@linkplain org.apache.sis.referencing.operation.transform.AbstractMathTransform
      * math transform}.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java
index c7f13d2..b163e6a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java
@@ -44,7 +44,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java
index 1a2cb08..4b347f2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java
@@ -49,7 +49,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java
index 177b748..67b3aad 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java
@@ -44,7 +44,7 @@
  *   <td>(not applicable)</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java
index 10bc9d1..3ed7b7e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java
@@ -75,7 +75,7 @@
 /**
  * Coordinate system axis name, direction, unit and range of values.
  *
- * <div class="section">Axis names</div>
+ * <h2>Axis names</h2>
  * In some case, the axis name is constrained by ISO 19111 depending on the
  * {@linkplain org.opengis.referencing.crs.CoordinateReferenceSystem coordinate reference system} type.
  * This constraint works in two directions. For example the names <cite>"geodetic latitude"</cite> and
@@ -83,7 +83,7 @@
  * with a {@link org.opengis.referencing.crs.GeographicCRS}. Conversely, these names shall not be used
  * in any other context. See the GeoAPI {@link CoordinateSystemAxis} javadoc for more information.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if all
  * components were created using only SIS factories and static constants.
@@ -512,7 +512,7 @@
      * OGC 01-009 (where version 1 of the WKT format is defined) said that the default values shall be
      * <cite>"Lat"</cite> and <cite>"Lon"</cite>.
      *
-     * <div class="section">Future evolutions</div>
+     * <h4>Future evolutions</h4>
      * This method implements heuristic rules learned from experience while trying to provide inter-operability
      * with different data producers. Those rules may be adjusted in any future SIS version according experience
      * gained while working with more data producers.
@@ -709,7 +709,7 @@
     /**
      * Formats this axis as a <cite>Well Known Text</cite> {@code Axis[…]} element.
      *
-     * <div class="section">Constraints for WKT validity</div>
+     * <h4>Constraints for WKT validity</h4>
      * The ISO 19162 specification puts many constraints on axis names, abbreviations and directions allowed in WKT.
      * Most of those constraints are inherited from ISO 19111 — see {@link CoordinateSystemAxis} javadoc for some of
      * those. The current Apache SIS implementation does not verify whether this axis name and abbreviation are
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java
index 8454f78..f0d4009 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java
@@ -41,7 +41,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java
index 34a0fc5..1f615a3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java
@@ -41,7 +41,7 @@
  *   <td>“Geodetic latitude”, “Geodetic longitude”, “Ellipsoidal height” (if 3D)</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java
index 41c1d4d..e3115dc 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java
@@ -42,7 +42,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultParametricCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultParametricCS.java
index edf6fed..dca9747 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultParametricCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultParametricCS.java
@@ -35,7 +35,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java
index 48a67f3..5012d50 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java
@@ -41,7 +41,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java
index fdb8fa3..0a11fd6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java
@@ -45,7 +45,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java
index 17d3858..0963d7a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java
@@ -40,7 +40,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
index b8f3fe6..f6fc9a1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
@@ -36,7 +36,7 @@
  *   <td>unspecified</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java
index a313436..f80ec96 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java
@@ -51,7 +51,7 @@
  *   <td>“Gravity-related height” or “Depth”</td>
  * </tr></table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * and the {@link CoordinateSystemAxis} instances given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java
index 33d2b12..e106ef9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java
@@ -37,13 +37,13 @@
  * Parses {@linkplain AxisDirection axis direction} of the kind <cite>"South along 90 deg East"</cite>.
  * Those directions are used in the EPSG database for polar stereographic projections.
  *
- * <div class="section">Reference meridian</div>
+ * <h2>Reference meridian</h2>
  * This class does not know whether the meridian is relative to Greenwich or any other reference meridian.
  * The reference meridian shall be inferred from the geodetic datum of the {@code GeographicCRS} instance
  * that contains (through its coordinate system) the axes having those directions. This is consistent with
  * ISO 19162:2015 §7.5.4(iv) - WKT 2 formatting.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (IRD)
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/AbstractDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/AbstractDatum.java
index 8b29a34..3629fc4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/AbstractDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/AbstractDatum.java
@@ -55,11 +55,11 @@
  * {@linkplain org.apache.sis.referencing.cs.AbstractCS coordinate systems}, thus creating specific types of
  * {@linkplain org.apache.sis.referencing.crs.AbstractCRS coordinate reference system}.
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * This class is conceptually <cite>abstract</cite>, even if it is technically possible to instantiate it.
  * Typical applications should create instances of the most specific subclass prefixed by {@code Default} instead.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable if the property <em>values</em> (not necessarily the map itself) given to the
  * constructor are also immutable. Most SIS subclasses and related classes are immutable under similar conditions.
  * This means that unless otherwise noted in the javadoc, {@code Datum} instances created using only SIS factories
@@ -344,7 +344,7 @@
      *       be ignored.</li>
      * </ul>
      *
-     * <div class="section">Future evolutions</div>
+     * <h4>Future evolutions</h4>
      * This method implements heuristic rules learned from experience while trying to provide inter-operability
      * with different data producers. Those rules may be adjusted in any future SIS version according experience
      * gained while working with more data producers.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/BursaWolfParameters.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/BursaWolfParameters.java
index 438a5a9..4f5fe29 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/BursaWolfParameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/BursaWolfParameters.java
@@ -95,7 +95,7 @@
  *       The Position Vector convention is used by IAG and recommended by ISO 19111.</li>
  * </ul>
  *
- * <div class="section">Source and target geodetic datum</div>
+ * <h2>Source and target geodetic datum</h2>
  * The <var>source datum</var> in above coordinates transformation is the {@link DefaultGeodeticDatum} instance
  * that contain this {@code BursaWolfParameters}. It can be any datum, including datum that are valid only locally.
  * The <var>{@linkplain #getTargetDatum() target datum}</var> is specified at construction time and is often,
@@ -105,7 +105,7 @@
  * prime meridian}, then it is user's responsibility to apply longitude rotation before to use the Bursa-Wolf
  * parameters.</p>
  *
- * <div class="section">When Bursa-Wolf parameters are used</div>
+ * <h2>When Bursa-Wolf parameters are used</h2>
  * {@code BursaWolfParameters} are used in three contexts:
  * <ol>
  *   <li>Created as a step while creating a {@linkplain org.apache.sis.referencing.operation.AbstractCoordinateOperation
@@ -454,14 +454,14 @@
      * {@linkplain DefaultGeodeticDatum#getPrimeMeridian() prime meridian}, then it is caller's responsibility
      * to apply longitude rotation before to use the matrix returned by this method.</p>
      *
-     * <div class="section">Time-dependent transformation</div>
+     * <h4>Time-dependent transformation</h4>
      * Some transformations use parameters that vary with time (e.g. operation method EPSG:1053).
      * Users can optionally specify a date for which the transformation is desired.
      * For transformations that do not depends on time, this date is ignored and can be null.
      * For time-dependent transformations, {@code null} values default to the transformation's
      * {@linkplain TimeDependentBWP#getTimeReference() reference time}.
      *
-     * <div class="section">Inverse transformation</div>
+     * <h4>Inverse transformation</h4>
      * The inverse transformation can be approximated by reversing the sign of the 7 parameters before to use them
      * in the above matrix. This is often considered sufficient since <cite>position vector transformations</cite>
      * are themselves approximations. However Apache SIS will rather use
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
index 15d8d5d..ac74508 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
@@ -98,7 +98,7 @@
  *
  * Implementations of this class shall be immutable and thread-safe.
  *
- * <div class="section">Number of dimensions</div>
+ * <h2>Number of dimensions</h2>
  * Input coordinates and translation vectors can have any number of dimensions. However in the current implementation,
  * only the two first dimensions are used for interpolating the translation vectors. This restriction appears in the
  * following field and method signatures:
@@ -117,7 +117,7 @@
  * in more than two dimensions. See the above <cite>datum shift by geocentric translations</cite> use case for
  * an example.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases.
  * Serialization support is appropriate for short term storage or RMI between applications running the
  * same version of Apache SIS. But for long term storage, an established datum shift grid format like
@@ -369,7 +369,7 @@
      * The output values are in the unit given by {@link #getTranslationUnit()}.
      * The length of the returned array is given by {@link #getTranslationDimensions()}.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation performs the following steps:
      * <ol>
      *   <li>Convert the given coordinate into grid indices using the transform given by {@link #getCoordinateToGrid()}.</li>
@@ -407,13 +407,13 @@
      * the given {@code vector} array, which shall have a length of at least {@link #getTranslationDimensions()}.
      * The output unit of measurement is the same than the one documented in {@link #getCellValue(int, int, int)}.
      *
-     * <div class="section">Extrapolations</div>
+     * <h4>Extrapolations</h4>
      * If the given coordinates are outside this grid, then this method computes the translation vector at the
      * closest position in the grid. Applying translations on points outside the grid is a kind of extrapolation,
      * but some amount of extrapolations are necessary for operations like transforming an envelope before to compute
      * its intersection with another envelope.
      *
-     * <div class="section">Derivative (Jacobian matrix)</div>
+     * <h4>Derivative (Jacobian matrix)</h4>
      * If the length of the given array is at least <var>n</var> + 4 where <var>n</var> = {@link #getTranslationDimensions()},
      * then this method appends the derivative (approximated) at the given grid indices. This is the same derivative than the
      * one computed by {@link #derivativeInCell(double, double)}, opportunistically computed here for performance reasons.
@@ -426,7 +426,7 @@
      *   └                   ┘         └                             ┘
      * }
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation performs the following steps for each dimension <var>dim</var>,
      * where the number of dimension is determined by {@link #getTranslationDimensions()}.
      *
@@ -516,7 +516,7 @@
      *   └                   ┘         └                                                        ┘
      * }
      *
-     * <div class="section">Extrapolations</div>
+     * <h4>Extrapolations</h4>
      * Derivatives must be consistent with {@link #interpolateInCell(double, double, double[])} even when the
      * given coordinates are outside the grid. The {@code interpolateInCell(…)} contract in such cases is to
      * compute the translation vector at the closest position in the grid. A consequence of this contract is
@@ -596,7 +596,7 @@
      * Those average values shall provide a good "first guess" before to interpolate the actual translation value
      * at the (<var>x</var>,<var>y</var>) coordinate. This "first guess" is needed for inverse transform.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation computes the average of all values returned by
      * {@link #getCellValue getCellValue(dim, …)}, but subclasses may override with more specific values.
      *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
index f8f75d3..4e6031c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
@@ -68,7 +68,7 @@
  *   <li>{@linkplain #getEccentricity() eccentricity}</li>
  * </ul>
  *
- * <div class="section">Creating new ellipsoid instances</div>
+ * <h2>Creating new ellipsoid instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * In particular, the <a href="http://www.epsg.org">EPSG</a> database provides definitions for many ellipsoids,
@@ -97,7 +97,7 @@
  *     Ellipsoid e = CommonCRS.WGS84.ellipsoid();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructors are also immutable. Unless otherwise noted in the javadoc, this condition holds if all
  * components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEngineeringDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEngineeringDatum.java
index 4ab27fe..464b0e7 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEngineeringDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEngineeringDatum.java
@@ -33,7 +33,7 @@
  * This origin can be fixed with respect to the earth (such as a defined point at a construction site),
  * or be a defined point on a moving vehicle (such as on a ship or satellite).
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if all
  * components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultGeodeticDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultGeodeticDatum.java
index 009a028..7c6f601 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultGeodeticDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultGeodeticDatum.java
@@ -58,7 +58,7 @@
  * Geodetic datum are used together with ellipsoidal coordinate system, and also with Cartesian
  * coordinate system centered in the ellipsoid (or sphere).
  *
- * <div class="section">Bursa-Wolf parameters</div>
+ * <h2>Bursa-Wolf parameters</h2>
  * One or many {@link BursaWolfParameters} can optionally be associated to each {@code DefaultGeodeticDatum} instance.
  * This association is not part of the ISO 19111 model, but still a common practice (especially in older standards).
  * Associating Bursa-Wolf parameters to geodetic datum is known as the <cite>early-binding</cite> approach.
@@ -92,7 +92,7 @@
  *   </li>
  * </ol>
  *
- * <div class="section">Creating new geodetic datum instances</div>
+ * <h2>Creating new geodetic datum instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * Choice 1 in the following list is the easiest but most restrictive way to get a geodetic datum.
@@ -115,7 +115,7 @@
  *     GeodeticDatum datum = CommonCRS.WGS84.datum();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself),
  * the {@link Ellipsoid} and the {@link PrimeMeridian} given to the constructor are also immutable. Unless otherwise
  * noted in the javadoc, this condition holds if all components were created using only SIS factories and static
@@ -384,7 +384,7 @@
      * in EPSG dataset version 8.9, all datum shifts that can be represented by this method use Greenwich as the
      * prime meridian, both in source and target datum.</div>
      *
-     * <div class="section">Search criterion</div>
+     * <h4>Search criterion</h4>
      * If the given {@code areaOfInterest} is non-null and contains at least one geographic bounding box, then this
      * method ignores any Bursa-Wolf parameters having a {@linkplain BursaWolfParameters#getDomainOfValidity() domain
      * of validity} that does not intersect the given geographic extent.
@@ -398,13 +398,13 @@
      *       and {@linkplain org.apache.sis.referencing.operation.matrix.MatrixSIS#inverse() inverted}.</li>
      * </ol>
      *
-     * <div class="section">Multi-occurrences resolution</div>
+     * <h4>Multi-occurrences resolution</h4>
      * If more than one {@code BursaWolfParameters} instance is found in any of the above steps, then the one having
      * the largest intersection between its {@linkplain BursaWolfParameters#getDomainOfValidity() domain of validity}
      * and the given extent will be selected. If more than one instance have the same intersection, then the first
      * occurrence is selected.
      *
-     * <div class="section">Time-dependent parameters</div>
+     * <h4>Time-dependent parameters</h4>
      * If the given extent contains a {@linkplain org.opengis.metadata.extent.TemporalExtent temporal extent},
      * then the instant located midway between start and end time will be taken as the date where to evaluate the
      * Bursa-Wolf parameters. This is relevant only to {@linkplain TimeDependentBWP time-dependent parameters}.
@@ -496,7 +496,7 @@
      * <cite>"Paris"</cite>, then this method compares only the <cite>"Nouvelle Triangulation Française"</cite> part.
      * </div>
      *
-     * <div class="section">Future evolutions</div>
+     * <h4>Future evolutions</h4>
      * This method implements heuristic rules learned from experience while trying to provide inter-operability
      * with different data producers. Those rules may be adjusted in any future SIS version according experience
      * gained while working with more data producers.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultImageDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultImageDatum.java
index 3303204..e46bb6e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultImageDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultImageDatum.java
@@ -40,7 +40,7 @@
  * context only. For an image datum, the anchor point is usually either the centre of the image
  * or the corner of the image.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultParametricDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultParametricDatum.java
index e44753f..7bddff4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultParametricDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultParametricDatum.java
@@ -27,7 +27,7 @@
 /**
  * Defines the origin of a parametric coordinate reference system.
  *
- * <div class="section">Creating new parametric datum instances</div>
+ * <h2>Creating new parametric datum instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 2
  * and 3 below), or indirectly by specifying the identifier of an entry in a database (choices 1 below).
  *
@@ -40,7 +40,7 @@
  *       {@linkplain #DefaultParametricDatum(Map) constructor}.</li>
  * </ol>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultPrimeMeridian.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultPrimeMeridian.java
index 9661d04..873f540 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultPrimeMeridian.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultPrimeMeridian.java
@@ -48,7 +48,7 @@
 /**
  * Defines the origin from which longitude values are determined.
  *
- * <div class="section">Creating new prime meridian instances</div>
+ * <h2>Creating new prime meridian instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * In particular, the <a href="http://www.epsg.org">EPSG</a> database provides definitions for many prime meridians,
@@ -75,7 +75,7 @@
  *     PrimeMeridian pm = CommonCRS.WGS84.primeMeridian();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
@@ -339,7 +339,7 @@
      * Returns {@code true} if {@link #formatTo(Formatter)} should conservatively format the angular unit
      * even if it would be legal to omit it.
      *
-     * <div class="section">Rational</div>
+     * <h4>Rational</h4>
      * According the ISO 19162 standard, it is legal to omit the {@code PrimeMeridian} angular unit when
      * that unit is the same than the unit of the axes of the enclosing {@code GeographicCRS}. However the
      * relationship between the CRS axes and the prime meridian is less obvious in WKT2 than it was in WKT1,
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultTemporalDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
index 4aa5851..ac8a5e8 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
@@ -41,7 +41,7 @@
 /**
  * Defines the origin of a temporal coordinate reference system.
  *
- * <div class="section">Creating new temporal datum instances</div>
+ * <h2>Creating new temporal datum instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * Choice 1 in the following list is the easiest but most restrictive way to get a temporal datum.
@@ -64,7 +64,7 @@
  *     TemporalDatum datum = CommonCRS.Temporal.JULIAN.datum();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
index e6cc41a..237c68d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
@@ -43,7 +43,7 @@
  * {@linkplain org.opengis.referencing.cs.CoordinateSystemAxis coordinate system axis} with which
  * it is combined to create a {@linkplain org.opengis.referencing.crs.VerticalCRS vertical CRS}.
  *
- * <div class="section">Creating new vertical datum instances</div>
+ * <h2>Creating new vertical datum instances</h2>
  * New instances can be created either directly by specifying all information to a factory method (choices 3
  * and 4 below), or indirectly by specifying the identifier of an entry in a database (choices 1 and 2 below).
  * Choice 1 in the following list is the easiest but most restrictive way to get a vertical datum.
@@ -66,7 +66,7 @@
  *     VerticalDatum datum = CommonCRS.Vertical.GEOID.datum();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/Sphere.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/Sphere.java
index 4fbfb8b..0d7cebe 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/Sphere.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/Sphere.java
@@ -28,7 +28,7 @@
 /**
  * A ellipsoid which is spherical.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Unless otherwise noted in the javadoc, this condition holds if
  * all components were created using only SIS factories and static constants.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
index f67a13e..7c84d11 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
@@ -39,7 +39,7 @@
  *       DefaultGeodeticDatum.getPositionVectorTransformation(GeodeticDatum, Extent)}</li>
  * </ul>
  *
- * <div class="section">Datum shifts</div>
+ * <h2>Datum shifts</h2>
  * Three classes are provided in support of coordinate transformations between different datums:
  * <ul>
  *   <li>{@link org.apache.sis.referencing.datum.BursaWolfParameters} performs an approximation
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
index 01b001f..bb9a9c3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
@@ -159,7 +159,7 @@
  *   </tr>
  * </table>
  *
- * <div class="section">Note on codes in CRS namespace</div>
+ * <h2>Note on codes in CRS namespace</h2>
  * The format is usually "{@code CRS:}<var>n</var>" where <var>n</var> is a number like 27, 83 or 84.
  * However this factory is lenient and allows the {@code CRS} part to be repeated as in {@code "CRS:CRS84"}.
  * It also accepts {@code "OGC"} as a synonymous of the {@code "CRS"} namespace.
@@ -167,7 +167,7 @@
  * <div class="note"><b>Examples:</b>
  * {@code "CRS:27"}, {@code "CRS:83"}, {@code "CRS:84"}, {@code "CRS:CRS84"}, {@code "OGC:CRS84"}.</div>
  *
- * <div class="section">Note on codes in AUTO(2) namespace</div>
+ * <h2>Note on codes in AUTO(2) namespace</h2>
  * The format is usually "{@code AUTO2:}<var>n</var>,<var>factor</var>,<var>λ₀</var>,<var>φ₀</var>"
  * where <var>n</var> is a number between 42001 and 42005 inclusive, <var>factor</var> is a conversion
  * factor from the CRS units to metres (e.g. 0.3048 for a CRS with axes in feet) and (<var>λ₀</var>,<var>φ₀</var>)
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
index ad00040..0cb4656 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
@@ -75,21 +75,21 @@
  * (DAO) after some timeout. This approach allows to establish a connection to a database (for example)
  * and keep it only for a relatively short amount of time.</p>
  *
- * <div class="section">Caching strategy</div>
+ * <h2>Caching strategy</h2>
  * Objects are cached by strong references, up to the amount of objects specified at construction time.
  * If a greater amount of objects are cached, then the oldest ones will be retained through a
  * {@linkplain WeakReference weak reference} instead of a strong one.
  * This means that this caching factory will continue to return those objects as long as they are in use somewhere
  * else in the Java virtual machine, but will be discarded (and recreated on the fly if needed) otherwise.
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * The cache managed by this class is concurrent. However the Data Access Objects (DAO) are assumed non-concurrent.
  * If two or more threads are accessing this factory in same time, then two or more Data Access Object instances
  * may be created. The maximal amount of instances to create is specified at {@code ConcurrentAuthorityFactory}
  * construction time. If more Data Access Object instances are needed, some of the threads will block until an
  * instance become available.
  *
- * <div class="section">Note for subclasses</div>
+ * <h2>Note for subclasses</h2>
  * This abstract class does not implement any of the {@link DatumAuthorityFactory}, {@link CSAuthorityFactory},
  * {@link CRSAuthorityFactory} and {@link CoordinateOperationAuthorityFactory} interfaces.
  * Subclasses should select the interfaces that they choose to implement.
@@ -335,7 +335,7 @@
      * It may also be invoked again if additional factories are needed in different threads,
      * or if all factories have been closed after the timeout.
      *
-     * <div class="section">Multi-threading</div>
+     * <h4>Multi-threading</h4>
      * This method (but not necessarily the returned factory) needs to be thread-safe;
      * {@code ConcurrentAuthorityFactory} does not hold any lock when invoking this method.
      * Subclasses are responsible to apply their own synchronization if needed,
@@ -1749,7 +1749,7 @@
      * An implementation of {@link IdentifiedObjectFinder} which delegates
      * the work to the underlying Data Access Object and caches the result.
      *
-     * <div class="section">Synchronization note</div>
+     * <h4>Synchronization note</h4>
      * our public API claims that {@link IdentifiedObjectFinder}s are not thread-safe.
      * Nevertheless we synchronize this particular implementation for safety, because the consequence of misuse
      * are more dangerous than other implementations. Furthermore this is also a way to assert that no code path
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
index a4b4888..ce78d94 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
@@ -151,7 +151,7 @@
      * Returns a description of the object corresponding to a code.
      * The description can be used for example in a combo box in a graphical user interface.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation invokes {@link #createObject(String)} for the given code
      * and returns the {@linkplain AbstractIdentifiedObject#getName() object name}.
      * This may be costly since it involves a full object creation.
@@ -175,7 +175,7 @@
      * But it is recommended to invoke the most specific {@code createFoo(String)} method when
      * the desired type is known, both for performance reason and for avoiding ambiguity.
      *
-     * <div class="section">Note for subclasses</div>
+     * <h4>Note for subclasses</h4>
      * In default {@code GeodeticAuthorityFactory} implementation, all {@code createFoo(String)} methods ultimately
      * delegate to this {@code createObject(String)} method and verify if the created object is of the desired type.
      * Overriding this method is sufficient for supporting the more specific {@code createFoo(String)} methods,
@@ -219,7 +219,7 @@
      *   <tr><td>EPSG:5800</td> <td>Engineering</td>   <td>Astra Minas Grid</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -265,7 +265,7 @@
      *   <tr><td>EPSG:4047</td> <td>Geographic</td>    <td>GRS 1980 Authalic Sphere</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -300,7 +300,7 @@
      *   <tr><td>EPSG:4984</td> <td>World Geodetic System 1972</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -336,7 +336,7 @@
      *   <tr><td>EPSG:6350</td> <td>NAD83(2011) / Conus Albers Equal Area</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -368,7 +368,7 @@
      *   <tr><td>EPSG:5714</td> <td>Mean Sea Level height</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -387,7 +387,7 @@
     /**
      * Creates a 1-dimensional coordinate reference system used for the recording of time.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -406,7 +406,7 @@
     /**
      * Creates a 1-dimensional parametric coordinate reference system.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -439,7 +439,7 @@
      *   <tr><td>EPSG:7423</td> <td>ETRS89 + EVRF2007 height</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -458,7 +458,7 @@
      * Creates a CRS that is defined by its coordinate conversion from another CRS (not by a datum).
      * {@code DerivedCRS} can not be {@code ProjectedCRS} themselves, but may be derived from a projected CRS.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -487,7 +487,7 @@
      *   <tr><td>EPSG:5800</td> <td>Astra Minas Grid</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -507,7 +507,7 @@
      * Image coordinate reference systems are treated as a separate sub-type because a separate
      * user community exists for images with its own terms of reference.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -542,7 +542,7 @@
      *   <tr><td>EPSG:9315</td> <td>Engineering</td> <td>Seismic bin grid datum</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -576,7 +576,7 @@
      *   <tr><td>EPSG:6258</td> <td>European Terrestrial Reference System 1989</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -611,7 +611,7 @@
      *   <tr><td>EPSG:5215</td> <td>European Vertical Reference Frame 2007</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -630,7 +630,7 @@
     /**
      * Creates a datum defining the origin of a temporal coordinate reference system.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -649,7 +649,7 @@
     /**
      * Creates a datum defining the origin of a parametric coordinate reference system.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -684,7 +684,7 @@
      *   <tr><td>EPSG:9300</td> <td>Astra Minas</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -704,7 +704,7 @@
      * An image datum is used in a local context only.
      * For an image datum, the anchor point is usually either the centre of the image or the corner of the image.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createDatum(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -736,7 +736,7 @@
      *   <tr><td>EPSG:7048</td> <td>GRS 1980 Authalic Sphere</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -770,7 +770,7 @@
      *   <tr><td>EPSG:8906</td> <td>Rome</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -801,7 +801,7 @@
      *   <tr><td>EPSG:3391</td> <td>World - between 80°S and 84°N</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -837,7 +837,7 @@
      *   <tr><td>EPSG:6499</td> <td>Vertical CS</td>       <td>height (H)</td>                              <td>up</td>              <td>metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -871,7 +871,7 @@
      *   <tr><td>EPSG:6423</td> <td>latitude, longitude, ellipsoidal height</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -901,7 +901,7 @@
      *   <tr><td>EPSG:6499</td> <td>height (H)</td> <td>up</td>           <td>metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -920,7 +920,7 @@
      * Creates a 1-dimensional coordinate system for time elapsed in the specified time units
      * from a specified time origin.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -938,7 +938,7 @@
     /**
      * Creates a 1-dimensional parametric coordinate system.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -974,7 +974,7 @@
      *   <tr><td>EPSG:4491</td> <td>westing, northing (W,N)</td> <td>west, north</td>  <td>metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1004,7 +1004,7 @@
      *   <tr><td>EPSG:6404</td> <td>latitude, longitude, radius</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1023,7 +1023,7 @@
      * Creates a 3-dimensional coordinate system made of a polar coordinate system
      * extended by a straight perpendicular axis.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1042,7 +1042,7 @@
      * Creates a 2-dimensional coordinate system for coordinates represented by a distance from the origin
      * and an angle from a fixed direction.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1074,7 +1074,7 @@
      *   <tr><td>EPSG:2</td>    <td>Northing (N)</td>  <td>metre</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1111,7 +1111,7 @@
      *
      * See {@link org.apache.sis.measure.Units#valueOfEPSG(int)} for a more complete list of codes.</div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1144,7 +1144,7 @@
      *   <tr><td>EPSG:8807</td> <td>False northing</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1172,7 +1172,7 @@
      * In order to be supported, an operation method must have its formulas coded in the Java programming language.
      * See {@link org.apache.sis.referencing.operation.transform.MathTransformProvider} for more information.</p>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1207,7 +1207,7 @@
      *   <tr><td>EPSG:6326</td> <td>NAD83(2011) to NAVD88 height (1)</td></tr>
      * </table></div>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation delegates to {@link #createObject(String)} and casts the result.
      * If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
      *
@@ -1229,7 +1229,7 @@
      * This method should only extract the information explicitly declared in a database like EPSG.
      * This method should not attempt to infer by itself operations that are not explicitly recorded in the database.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation returns an empty set.
      *
      * @param  sourceCRS  coded value of source coordinate reference system.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticObjectFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticObjectFactory.java
index 5605a36..163a2e9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticObjectFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/GeodeticObjectFactory.java
@@ -85,7 +85,7 @@
  * (or the {@link org.apache.sis.referencing.CRS#forCode(String)} convenience method)
  * when the CRS object to construct can be identified by a code in the namespace of an authority (typically EPSG).
  *
- * <div class="section">Object properties</div>
+ * <h2>Object properties</h2>
  * Most factory methods expect a {@link Map Map&lt;String,?&gt;} argument, often followed by explicit arguments.
  * Unless otherwise noticed, information provided in the {@code properties} map are considered ignorable metadata
  * while information provided in explicit arguments have an impact on coordinate transformation results.
@@ -179,7 +179,7 @@
  *   </tr>
  * </table>
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * All localizable attributes like {@code "remarks"} may have a language and country code suffix.
  * For example the {@code "remarks_fr"} property stands for remarks in {@linkplain Locale#FRENCH French} and
  * the {@code "remarks_fr_CA"} property stands for remarks in {@linkplain Locale#CANADA_FRENCH French Canadian}.
@@ -1630,7 +1630,7 @@
      * since this geodetic object factory is not an {@linkplain GeodeticAuthorityFactory authority factory}.
      * For such verification, see the {@link org.apache.sis.referencing.CRS#fromWKT(String)} convenience method.
      *
-     * <div class="section">Usage and performance considerations</div>
+     * <h4>Usage and performance considerations</h4>
      * The default implementation uses a shared instance of {@link org.apache.sis.io.wkt.WKTFormat}
      * with the addition of thread-safety. This is okay for occasional use,
      * but is sub-optimal if this method is extensively used in a multi-thread environment.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
index d7e603b..6182293 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectFinder.java
@@ -53,7 +53,7 @@
  *   <li>The same {@code IdentifiedObjectFinder} instance can be reused for consecutive searches.</li>
  * </ol>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * {@code IdentifiedObjectFinder} are <strong>not</strong> guaranteed to be thread-safe even if the underlying factory
  * is thread-safe. If concurrent searches are desired, then a new instance should be created for each thread.
  *
@@ -545,7 +545,7 @@
      * The iteration stops as soon as a match is found (in other words, if more than one object is equals
      * to the specified one, then the {@code find(…)} method selects the first one in iteration order).</p>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation returns the same set than
      * <code>{@linkplain GeodeticAuthorityFactory#getAuthorityCodes(Class) getAuthorityCodes}(type)</code>
      * where {@code type} is the interface specified at construction type.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectSet.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
index f373906..174cf6c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/IdentifiedObjectSet.java
@@ -58,21 +58,21 @@
  *
  * <p>Iterations over elements in this collection preserve insertion order.</p>
  *
- * <div class="section">Purpose</div>
+ * <h2>Purpose</h2>
  * {@code IdentifiedObjectSet} can be used as the set returned by implementations of the
  * {@link GeodeticAuthorityFactory#createFromCoordinateReferenceSystemCodes(String, String)} method.
  * Deferred creation can have great performance impact since some set may contain as much as 40 entries
  * (e.g. transformations from <cite>"ED50"</cite> (EPSG:4230) to <cite>"WGS 84"</cite> (EPSG:4326))
  * while some users only want to look for the first entry.
  *
- * <div class="section">Exception handling</div>
+ * <h2>Exception handling</h2>
  * If the underlying factory failed to creates an object because of an unsupported operation method
  * ({@link NoSuchIdentifierException}), the exception is logged at {@link Level#WARNING} and the iteration continue.
  * If the operation creation failed for any other kind of reason ({@link FactoryException}), then the exception is
  * re-thrown as an unchecked {@link BackingStoreException}. This default behavior can be changed by overriding
  * the {@link #isRecoverableFailure(FactoryException)} method.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is thread-safe is the underlying {@linkplain #factory} is also thread-safe.
  * However, implementers are encouraged to wrap in {@linkplain java.util.Collections#unmodifiableSet unmodifiable set}
  * if they intent to cache {@code IdentifiedObjectSet} instances.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MissingFactoryResourceException.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MissingFactoryResourceException.java
index f4742af..de02282 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MissingFactoryResourceException.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MissingFactoryResourceException.java
@@ -24,7 +24,7 @@
  * The most common case is a NADCON or NTv2 datum shift operation requested while the
  * datum shift grids was not found in the {@code $SIS_DATA/DatumChanges} directory.
  *
- * <div class="section">Relationship with other exceptions</div>
+ * <h2>Relationship with other exceptions</h2>
  * This exception means that the factory failed to create a particular object.
  * However the factory may succeed in creating other objects.
  * By contrast, {@link UnavailableFactoryException} means that the whole factory can not be used at all.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
index 2252d85..0000450 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
@@ -78,7 +78,7 @@
  * for the <var>code</var> part.  If a factory is found in the list of factories given at construction time,
  * then the work is delegated to that factory. Otherwise a {@link NoSuchAuthorityFactoryException} is thrown.</p>
  *
- * <div class="section">URI syntax</div>
+ * <h2>URI syntax</h2>
  * This factory can also parse URNs or URLs of the following forms:
  *
  * <ul>
@@ -123,7 +123,7 @@
  * {@linkplain org.apache.sis.referencing.operation.AbstractCoordinateOperation coordinate operations}
  * for creating a concatenated operation.
  *
- * <div class="section">Multiple versions for the same authority</div>
+ * <h2>Multiple versions for the same authority</h2>
  * {@code MultiAuthoritiesFactory} accepts an arbitrary amount of factories for the same authority, provided that
  * those factories have different version numbers. If a {@code createFoo(String)} method is invoked with a URN
  * containing a version number different than zero, then {@code MultiAuthoritiesFactory} will search for a factory
@@ -140,7 +140,7 @@
  * then the first EPSG factory in iteration order is used regardless of its version number.
  * </div>
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * This class is thread-safe if all delegate factories are themselves thread-safe.
  * However the factory <em>providers</em>, which are given to the constructor as {@link Iterable} instances,
  * do not need to be thread-safe. See constructor Javadoc for more information.
@@ -209,7 +209,7 @@
      * Calls to {@code createFoo(String)} methods will scan the supplied factories in their iteration order when first needed.
      * The first factory having the requested {@linkplain GeodeticAuthorityFactory#getCodeSpaces() namespace} will be used.
      *
-     * <div class="section">Requirements</div>
+     * <h4>Requirements</h4>
      * {@code MultiAuthoritiesFactory} may iterate over the same {@code Iterable} more than once.
      * Each iteration <strong>shall</strong> return the same instances than previous iterations,
      * unless {@link #reload()} has been invoked.
@@ -218,12 +218,12 @@
      * {@code MultiAuthoritiesFactory} will use them only in blocks synchronized on the {@code Iterable} instance.
      * For example all usages of {@code crsFactory} will be done inside a {@code synchronized(crsFactory)} block.</p>
      *
-     * <div class="section">Name collision</div>
+     * <h4>Name collision</h4>
      * If an {@code Iterable} contains more than one factory for the same namespace and version,
      * then only the first occurrence will be used. All additional factories for the same namespace
      * and version will be ignored, after a warning has been logged.
      *
-     * <div class="section">Caching</div>
+     * <h4>Caching</h4>
      * {@code MultiAuthoritiesFactory} caches the factories found from the given {@code Iterable}s,
      * but does not cache the objects created by those factories.
      * This constructor assumes that the given factories already do their own caching.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/UnavailableFactoryException.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/UnavailableFactoryException.java
index d84d683..38cbb4e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/UnavailableFactoryException.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/UnavailableFactoryException.java
@@ -24,7 +24,7 @@
  * The most common case is when the {@link org.apache.sis.referencing.factory.sql.EPSGFactory}
  * has no connection to an EPSG database.
  *
- * <div class="section">Relationship with other exceptions</div>
+ * <h2>Relationship with other exceptions</h2>
  * This exception means that the whole factory is unusable.
  * By contrast, {@link MissingFactoryResourceException} means that at least one particular object
  * can not be created, but other objects may be okay.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGCodeFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGCodeFinder.java
index 0463fcf..6fde6fb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGCodeFinder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGCodeFinder.java
@@ -109,7 +109,7 @@
      * Returns a description of the condition to put in a {@code WHERE} clause for an object having
      * the given dependency.
      *
-     * <div class="section"><b>Implementation note:</b>
+     * <div class="note"><b>Implementation note:</b>
      * The {@code super.find(…)} method performs a check (not documented in public API) for detecting
      * when it is invoked recursively, which is the case here. Consequently the {@code super.find(…)}
      * behavior below is slightly different than usual: since invoked recursively, {@code super.find(…)}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index c2e730c..c7cdea5 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@ -130,7 +130,7 @@
  * The EPSG database is freely available at <a href="http://www.epsg.org">http://www.epsg.org</a>.
  * Current version of this class requires EPSG database version 6.6 or above.
  *
- * <div class="section">Object identifier (code or name)</div>
+ * <h2>Object identifier (code or name)</h2>
  * EPSG codes are numerical identifiers. For example code 3395 stands for <cite>"WGS 84 / World Mercator"</cite>.
  * Coordinate Reference Objects are normally created from their numerical codes, but this factory accepts also names.
  * For example {@code createProjectedCRS("3395")} and {@code createProjectedCRS("WGS 84 / World Mercator")} both fetch
@@ -139,7 +139,7 @@
  * This is the case of <cite>"WGS 84"</cite> for instance.
  * If such an ambiguity is found, an exception will be thrown.
  *
- * <div class="section">Life cycle and caching</div>
+ * <h2>Life cycle and caching</h2>
  * {@code EPSGDataAccess} instances should be short-lived since they may hold a significant amount of JDBC resources.
  * {@code EPSGDataAccess} instances are created on the fly by {@link EPSGFactory} and closed after a relatively short
  * {@linkplain EPSGFactory#getTimeout timeout}.
@@ -148,7 +148,7 @@
  * in the common case where only a few EPSG codes are used by an application.
  * {@code EPSGDataAccess.createFoo(String)} methods do not cache by themselves and query the database on every invocation.
  *
- * <div class="section">SQL dialects</div>
+ * <h2>SQL dialects</h2>
  * Because the primary distribution format for the EPSG dataset is MS-Access, this class uses SQL statements formatted
  * for the MS-Access dialect. For usage with other database software products like PostgreSQL or Derby,
  * a {@link SQLTranslator} instance is provided to the constructor.
@@ -509,7 +509,7 @@
      * JDBC resources. If the set of codes is needed for a long time, their values should be copied in another
      * collection object.
      *
-     * <div class="section">Handling of deprecated objects</div>
+     * <h4>Handling of deprecated objects</h4>
      * The collection returned by this method gives an enumeration of EPSG codes for valid objects only.
      * The EPSG codes of deprecated objects are not included in iterations, computation of {@code Set.size()} value,
      * {@code Set.toString()} result, <i>etc.</i> with one exception:
@@ -646,7 +646,7 @@
      * In such case, an appropriate exception will be thrown in {@code createFoo(String)} methods
      * if the code is not found in the primary key column.</p>
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation returns {@code true} if all characters are decimal digits 0 to 9.
      *
      * @param  code  the code the inspect.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
index fb79be5..fecb9c1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
@@ -63,14 +63,14 @@
  * or in the directory given by the {@code "derby​.system​.home"} property, in that order.
  * See the {@linkplain org.apache.sis.referencing.factory.sql package documentation} for more information.</p>
  *
- * <div class="section">EPSG dataset installation</div>
+ * <h2>EPSG dataset installation</h2>
  * This class tries to automatically detect the schema that contains the EPSG tables
  * (see {@link SQLTranslator} for examples of tables to look for). If the tables are not found,
  * then the {@link #install(Connection)} method will be invoked for creating the EPSG schema.
  * The {@code install(…)} method can perform its work only if the definition files are reachable
  * on the classpath, or if the directory containing the files have been specified.
  *
- * <div class="section">Data Access Object (DAO)</div>
+ * <h2>Data Access Object (DAO)</h2>
  * If there is no cached object for a given code, then {@code EPSGFactory} creates an {@link EPSGDataAccess} instance
  * for performing the actual creation work. Developers who need to customize the geodetic object creation can override
  * the {@link #newDataAccess(Connection, SQLTranslator)} method in order to return their own {@link EPSGDataAccess}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/InstallationScriptProvider.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/InstallationScriptProvider.java
index eba272a..8b794d2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/InstallationScriptProvider.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/InstallationScriptProvider.java
@@ -53,7 +53,7 @@
  *     META-INF/services/org.apache.sis.setup.InstallationResources
  * }
  *
- * <div class="section">How this class is used</div>
+ * <h2>How this class is used</h2>
  * The first time that an {@link EPSGDataAccess} needs to be instantiated,
  * {@link EPSGFactory} verifies if the EPSG database exists. If it does not, then:
  * <ol>
@@ -178,7 +178,7 @@
      * or from resources in a JAR file, or from entries in a ZIP file, or any other means at implementer choice.
      * The {@link BufferedReader} instances shall be closed by the caller.
      *
-     * <div class="section">EPSG case</div>
+     * <h4>EPSG case</h4>
      * In the EPSG dataset case, the iterator should return {@code BufferedReader} instances for the following files
      * (replace {@code <version>} by the EPSG version number and {@code <product>} by the target database) in same order.
      * The first and last files are provided by Apache SIS.
@@ -194,7 +194,7 @@
      *
      * Implementers are free to return a different set of scripts with equivalent content.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * The default implementation invokes {@link #openStream(String)} – except for {@link #PREPARE} and {@link #FINISH}
      * in which case an Apache SIS build-in script is used – and wrap the result in a {@link LineNumberReader}.
      * The file encoding is UTF-8 (the encoding used in the scripts distributed by EPSG since version 9.4).
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java
index 642df50..f8f4ed8 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java
@@ -93,7 +93,7 @@
  * the ones used by EPSG in the MS-Access version or the PostgreSQL, MySQL or Oracle version of the database.
  * Consequently it is legal to use the MS-Access table names, which are more readable, in a PostgreSQL database.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * All {@code SQLTranslator} instances given to the {@link EPSGFactory} constructor
  * <strong>shall</strong> be immutable and thread-safe.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/package-info.java
index b925fc5..6ff2f51 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/package-info.java
@@ -23,7 +23,7 @@
  * which requires a {@link javax.sql.DataSource} providing connections to an EPSG database.
  *
  *
- * <div class="section">Connection to the database</div>
+ * <h2>Connection to the database</h2>
  * By default Apache SIS uses Apache Derby,
  * but the database can also be PostgreSQL or MS-Access.
  * The database connection is obtained by the first of the following data sources which is found:
@@ -43,7 +43,7 @@
  * With other choices, an Apache Derby driver should be available on the classpath.
  *
  *
- * <div class="section">The EPSG dataset</div>
+ * <h2>The EPSG dataset</h2>
  * A widely-used factory is the <a href="http://www.epsg.org">EPSG geodetic dataset</a>.
  * EPSG codes are numerical identifiers.
  * For example {@code "EPSG:4326"} is the EPSG identifier for the <cite>"WGS 84"</cite> geographic CRS.
@@ -60,7 +60,7 @@
  * For more determinism, the numerical codes are preferred.</div>
  *
  *
- * <div class="section">How deprecated entries are handled</div>
+ * <h2>How deprecated entries are handled</h2>
  * When an error is discovered in a Coordinate Reference System (CRS) definition, the EPSG group does not apply the
  * correction directly on the erroneous object (unless the correction is very minor).
  * Instead, the erroneous object is deprecated and a new one is created.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
index 1b6183b..a8edbed 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
@@ -89,12 +89,12 @@
  *   <li>An estimation of the {@linkplain #getCoordinateOperationAccuracy() operation accuracy}.</li>
  * </ul>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * This class is conceptually <cite>abstract</cite>, even if it is technically possible to instantiate it.
  * Typical applications should create instances of the most specific subclass prefixed by {@code Default} instead.
  * An exception to this rule may occur when it is not possible to identify the exact operation type.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar
  * conditions. This means that unless otherwise noted in the javadoc, {@code CoordinateOperation} instances created
@@ -308,7 +308,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Constraints</div>
+     * <h4>Constraints</h4>
      * All arguments except {@code properties} can be {@code null}.
      * If non-null, the dimension of CRS arguments shall be related to the {@code transform} argument as below:
      *
@@ -597,7 +597,7 @@
      * The default implementation tries to infer a value from the metadata returned by
      * {@link #getCoordinateOperationAccuracy()} using SIS-specific heuristics.
      *
-     * <div class="section">Current implementation</div>
+     * <h4>Current implementation</h4>
      * The current implementation uses the heuristic rules listed below.
      * Note that those rules may change in any future SIS version.
      *
@@ -661,7 +661,7 @@
      * Returns the object for transforming coordinates in the {@linkplain #getSourceCRS() source CRS}
      * to coordinates in the {@linkplain #getTargetCRS() target CRS}.
      *
-     * <div class="section">Use with interpolation CRS</div>
+     * <h4>Use with interpolation CRS</h4>
      * If the {@linkplain #getInterpolationCRS() interpolation CRS} is non-null, then the math transform
      * input coordinates shall by (<var>interpolation</var>, <var>source</var>) tuples: for each value
      * to transform, the interpolation point coordinates shall be first, followed by the source coordinates.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
index 2445907..dd64de3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
@@ -99,13 +99,13 @@
  *   </li>
  * </ol>
  *
- * <div class="section">Customization</div>
+ * <h2>Customization</h2>
  * Instances of this class are created by {@link DefaultCoordinateOperationFactory}.
  * The only public method is {@link #createOperation(CoordinateReferenceSystem, CoordinateReferenceSystem)},
  * which dispatches its work to the {@code createOperationStep(…)} protected methods.
  * Developers can override those protected methods if they want to alter the way some operations are created.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Each instance of this class shall be used only once.</li>
  *   <li>This class is not thread-safe. A new instance shall be created for each coordinate operation to infer.</li>
@@ -1054,7 +1054,7 @@
      * Concatenates two operation steps.
      * The new concatenated operation gets an automatically generated name.
      *
-     * <div class="section">Special case</div>
+     * <h4>Special case</h4>
      * If one of the given operation steps performs a change of axis order or units,
      * then that change will be merged with the other operation instead of creating an {@link ConcatenatedOperation}.
      *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
index 43106fd..a83bd09 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java
@@ -161,7 +161,7 @@
      * This method invokes itself recursively if there is nested {@code ConcatenatedOperation} instances
      * in the given list. This should not happen according ISO 19111 standard, but we try to be safe.
      *
-     * <div class="section">How coordinate operation accuracy is determined</div>
+     * <h4>How coordinate operation accuracy is determined</h4>
      * If {@code setAccuracy} is {@code true}, then this method copies accuracy information found in the single
      * {@link Transformation} instance. This method ignores instances of other kinds for the following reason:
      * some {@link Conversion} instances declare an accuracy, which is typically close to zero. If a concatenated
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
index 4e1ebd0..85a3653 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConversion.java
@@ -54,7 +54,7 @@
  * {@linkplain org.apache.sis.referencing.operation.transform.AbstractMathTransform math transform}
  * or explicitly provided at construction time in a <cite>defining conversion</cite> (see below).</p>
  *
- * <div class="section">Defining conversions</div>
+ * <h2>Defining conversions</h2>
  * {@code OperationMethod} instances are generally created for a pair of existing {@linkplain #getSourceCRS() source}
  * and {@linkplain #getTargetCRS() target CRS}. But {@code Conversion} instances without those information may exist
  * temporarily while creating a {@linkplain org.apache.sis.referencing.crs.DefaultDerivedCRS derived} or
@@ -71,7 +71,7 @@
  *  {@link org.opengis.referencing.operation.PlanarProjection}) if possible,
  * and assign the source and target CRS to it.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. This means that unless otherwise noted in the javadoc,
  * {@code Conversion} instances created using only SIS factories and static constants can be shared
@@ -124,7 +124,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Relationship between datum</div>
+     * <h4>Relationship between datum</h4>
      * By definition, coordinate <b>conversions</b> do not change the datum. Consequently the given {@code sourceCRS}
      * and {@code targetCRS} should use the same datum. If the datum is not the same, then the coordinate operation
      * should probably be a {@linkplain DefaultTransformation transformation} instead.
@@ -178,7 +178,7 @@
      * {@linkplain #DefaultConversion(Map, CoordinateReferenceSystem, CoordinateReferenceSystem,
      * CoordinateReferenceSystem, OperationMethod, MathTransform) above constructor}.</p>
      *
-     * <div class="section">Transform and parameters arguments</div>
+     * <h4>Transform and parameters arguments</h4>
      * At least one of the {@code transform} or {@code parameters} argument must be non-null.
      * If the caller supplies a {@code transform} argument, then it shall be a transform expecting
      * {@linkplain org.apache.sis.referencing.cs.AxesConvention#NORMALIZED normalized} input coordinates
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
index 4bcdfe7..f50d2a4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
@@ -86,7 +86,7 @@
  * recommended to provide also {@linkplain #getIdentifiers() identifiers} (e.g. “EPSG:9804” in the above example)
  * since names can sometime be ambiguous or be spelled in different ways.
  *
- * <div class="section">Departure from the ISO 19111 standard</div>
+ * <h2>Departure from the ISO 19111 standard</h2>
  * The following properties are mandatory according ISO 19111,
  * but may be missing under some conditions in Apache SIS:
  * <ul>
@@ -97,7 +97,7 @@
  *     constructor can not infer them.</li>
  * </ul>
  *
- * <div class="section">Relationship with other classes or interfaces</div>
+ * <h2>Relationship with other classes or interfaces</h2>
  * {@code OperationMethod} describes parameters without providing any value (except sometime default values).
  * When values have been assigned to parameters, the result is a {@link SingleOperation}.
  * Note that there is different kinds of {@code SingleOperation} depending on the nature and accuracy of the
@@ -110,7 +110,7 @@
  * {@code DefaultOperationMethod} subclasses should implement the
  * {@link org.apache.sis.referencing.operation.transform.MathTransformProvider} interface.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thread-safe if all properties given to the constructor are also immutable and thread-safe.
  * It is strongly recommended for all subclasses to be thread-safe, especially the
  * {@link org.apache.sis.referencing.operation.transform.MathTransformProvider} implementations to be used with
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultTransformation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultTransformation.java
index 293e0cc..b1af04b 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultTransformation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultTransformation.java
@@ -40,7 +40,7 @@
  * {@linkplain #getMathTransform() math transform}. Subclasses may have to override the {@link #getParameterValues()}
  * method if they need to provide a different set of parameters.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus thread-safe if the property <em>values</em> (not necessarily the map itself)
  * given to the constructor are also immutable. This means that unless otherwise noted in the javadoc,
  * {@code Transformation} instances created using only SIS factories and static constants can be shared
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java
index 55b92ec..1abb8f0 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java
@@ -75,7 +75,7 @@
  * The transform coefficients are determined using a <cite>least squares</cite> estimation method,
  * with the assumption that source positions are exact and all the uncertainty is in the target positions.</p>
  *
- * <div class="section">Linearizers</div>
+ * <h2>Linearizers</h2>
  * Consider the following situation (commonly found with {@linkplain org.apache.sis.storage.netcdf netCDF files}):
  * the <i>sources</i> coordinates are pixel indices and the <i>targets</i> are (longitude, latitude) coordinates,
  * but we suspect that the <i>sources to targets</i> transform is some undetermined map projection, maybe Mercator.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
index 1fb0d22..8952f30 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
@@ -76,7 +76,7 @@
  * Builders are not thread-safe. Builders can be used only once;
  * points can not be added or modified after {@link #create(MathTransformFactory)} has been invoked.
  *
- * <div class="section">Linearizers</div>
+ * <h2>Linearizers</h2>
  * If the localization grid is not close enough to a linear transform, {@link InterpolatedTransform} may not converge.
  * To improve the speed and reliability of the transform, a non-linear step can be {@linkplain #addLinearizers specified}.
  * Many candidates can be specified in case the exact form of that non-linear step is unknown;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java
index c70ca74..38e0300 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java
@@ -29,7 +29,7 @@
 /**
  * A two dimensional array of numbers. Row and column numbering begins with zero.
  *
- * <div class="section">Support for extended precision</div>
+ * <h2>Support for extended precision</h2>
  * This class can optionally support extended precision using the <cite>double-double arithmetic</cite>.
  * In extended precision mode, the {@link #elements} array have twice its normal length. The first half
  * of the array contains the same value than in normal precision mode, while the second half contains
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
index 7132271..756d8d5 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
@@ -323,13 +323,13 @@
      * Actually this method is used more often for grid envelopes
      * (which have no CRS) than geodetic envelopes.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * If the given envelopes cross the date line, then this method requires their {@code getSpan(int)} method
      * to behave as documented in the {@link org.apache.sis.geometry.AbstractEnvelope#getSpan(int)} javadoc.
      * Furthermore the matrix created by this method will produce expected results only for source or destination
      * points before the date line, since the wrap around operation can not be represented by an affine transform.
      *
-     * <div class="section">Example</div>
+     * <h4>Example</h4>
      * Given a source envelope of size 100 × 200 (the units do not matter for this method) and a destination
      * envelope of size 300 × 500, and given {@linkplain Envelope#getLowerCorner() lower corner} translation
      * from (-20, -40) to (-10, -25), then the following method call:
@@ -408,7 +408,7 @@
      * (<i>easting</i>, <i>northing</i>) — this is the first above case — but illegal
      * to transform (<i>easting</i>, <i>northing</i>) to (<i>easting</i>, <i>up</i>).</div>
      *
-     * <div class="section">Example</div>
+     * <h4>Example</h4>
      * The following method call:
      *
      * {@preformat java
@@ -464,7 +464,7 @@
      * Actually this method is used more often for grid envelopes
      * (which have no CRS) than geodetic envelopes.
      *
-     * <div class="section">Spanning the anti-meridian of a Geographic CRS</div>
+     * <h4>Spanning the anti-meridian of a Geographic CRS</h4>
      * If the given envelopes cross the date line, then this method requires their {@code getSpan(int)} method
      * to behave as documented in the {@link org.apache.sis.geometry.AbstractEnvelope#getSpan(int)} javadoc.
      * Furthermore the matrix created by this method will produce expected results only for source or destination
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/MatrixSIS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/MatrixSIS.java
index d79cb8d..ccaf964 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/MatrixSIS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/MatrixSIS.java
@@ -452,7 +452,7 @@
      * given dimension. Converting a point with the resulting matrix is equivalent to first convert the point
      * with {@code coordinates[srcDim] = coordinates[srcDim] * scale + offset}, then apply the original matrix.
      *
-     * <div class="section">Equivalence between this method and Java2D {@code AffineTransform} methods</div>
+     * <h4>Equivalence between this method and Java2D {@code AffineTransform} methods</h4>
      * If this matrix was an instance of Java2D {@link AffineTransform}, then invoking this method would
      * be equivalent to invoke the following {@code AffineTransform} methods in the order shown below:
      *
@@ -539,7 +539,7 @@
      * Returns a new matrix which is the result of multiplying this matrix with the specified one.
      * In other words, returns {@code this} × {@code matrix}.
      *
-     * <div class="section">Relationship with coordinate operations</div>
+     * <h4>Relationship with coordinate operations</h4>
      * In the context of coordinate operations, {@code Matrix.multiply(other)} is equivalent to
      * <code>{@linkplain AffineTransform#concatenate AffineTransform.concatenate}(other)</code>:
      * first transforms by the supplied transform and then transform the result by the original transform.
@@ -563,7 +563,7 @@
      * equal to the number of columns in this matrix, and the length of the returned vector will be
      * equal to the number of rows in this matrix.
      *
-     * <div class="section">Relationship with coordinate operations</div>
+     * <h4>Relationship with coordinate operations</h4>
      * In the context of coordinate operations, {@code Matrix.multiply(vector)} is related to
      * <code>{@linkplain AffineTransform#transform(double[], int, double[], int, int) AffineTransform.transform}(…)</code>
      * except that the last {@code vector} number is implicitly 1 in {@code AffineTransform} operations.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/package-info.java
index 56a7c53..0005bb1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/package-info.java
@@ -45,7 +45,7 @@
  * <img src="doc-files/AffineTransform.png" alt="Matrix representation of an affine transform">
  * </div>
  *
- * <div class="section">Extended floating point precision</div>
+ * <h2>Extended floating point precision</h2>
  * This package uses extended floating point precision for most arithmetic operations like matrix multiplications and
  * inversions. SIS needs extended precision because <cite>affine transforms</cite> concatenations like conversion from
  * degrees to radians, followed by some operations, followed by conversion back from radians to degrees, are very frequent.
@@ -59,7 +59,7 @@
  * <a href="http://en.wikipedia.org/wiki/Double-double_%28arithmetic%29#Double-double_arithmetic">double-double
  * arithmetic</a>. However this may change in any future SIS version.</p>
  *
- * <div class="section">Related projects</div>
+ * <h2>Related projects</h2>
  * This package is <strong>not</strong> designed for large matrices, and is rooted in
  * {@code org.apache.sis.referencing} for making clearer that this is not a general-purpose library.
  * For computational intensive calculations, better guarantees on numerical stability, sparse matrices support
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/package-info.java
index 67b728a..d63d296 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/package-info.java
@@ -29,7 +29,7 @@
  *   <li>{@link org.apache.sis.referencing.operation.transform} — any transform other than map projections.</li>
  * </ul>
  *
- * <div class="section">Apache SIS extensions</div>
+ * <h2>Apache SIS extensions</h2>
  * Some SIS implementations provide additional methods that are not part of OGC/ISO specifications:
  *
  * <ul>
@@ -39,7 +39,7 @@
  *     — changes a <cite>defining conversion</cite> into a complete conversion.</li>
  * </ul>
  *
- * <div class="section">Apache SIS specific behavior</div>
+ * <h2>Apache SIS specific behavior</h2>
  * The following operations have a behavior in Apache SIS which may be different
  * than the behavior found in other software products. Those particularities apply only when the math transform is
  * {@linkplain org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory#createParameterizedTransform
@@ -53,7 +53,7 @@
  *     for converting the longitude axis of source and target CRS to degrees before this operation is applied.</li>
  * </ul>
  *
- * <div class="section"><cite>Early binding</cite> versus <cite>late binding</cite> implementations</div>
+ * <h2><cite>Early binding</cite> versus <cite>late binding</cite> implementations</h2>
  * There is sometime multiple ways of transforming coordinates for a given pair of source and target CRS.
  * For example the {@linkplain org.apache.sis.referencing.datum.BursaWolfParameters Bursa-Wolf parameters}
  * may vary depending on the area of interest, like in the transformations from NAD27 to WGS84.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ConformalProjection.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ConformalProjection.java
index 1e119ed..4093611 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ConformalProjection.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ConformalProjection.java
@@ -255,7 +255,7 @@
      * a function closely related to this method has the letter <var>t</var>.</p>
      *
      *
-     * <div class="section">Properties</div>
+     * <h4>Properties</h4>
      * This function is used with φ values in the [-π/2 … π/2] range and has a periodicity of 2π.
      * The result is always a positive number when the φ argument is inside the above-cited range.
      * If, after removal of any 2π periodicity, φ is still outside the [-π/2 … π/2] range, then the
@@ -272,7 +272,7 @@
      * </ul>
      *
      *
-     * <div class="section">The π/2 special case</div>
+     * <h4>The π/2 special case</h4>
      * The value at {@code Math.PI/2} is not exactly infinity because there is no exact representation of π/2.
      * However since the conversion of 90° to radians gives {@code Math.PI/2}, we can presume that the user was
      * expecting infinity. The caller should check for the PI/2 special case himself if desired, as this method
@@ -284,7 +284,7 @@
      * is not sufficient, the check needs to include at least the {@code nextUp(Math.PI/2)} case.</p>
      *
      *
-     * <div class="section">Relationship with Snyder</div>
+     * <h4>Relationship with Snyder</h4>
      * This function is related to the following functions from Snyder:
      *
      * <ul>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
index d9275af..bf57387 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
@@ -51,7 +51,7 @@
  *   <tr><td>Balthasart</td>                        <td>50°</td></tr>
  * </table>
  *
- * <div class="section">Description</div>
+ * <h2>Description</h2>
  * The parallels and the meridians are straight lines and cross at right angles.
  * The scale is true along standard parallels, but distortion increase greatly at other locations.
  * Distortions are so great that there is little use of this projection for world mapping purposes.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/LambertConicConformal.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/LambertConicConformal.java
index ea021fd..18e35a4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/LambertConicConformal.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/LambertConicConformal.java
@@ -48,7 +48,7 @@
  * See the <a href="http://mathworld.wolfram.com/LambertConformalConicProjection.html">Lambert conformal
  * conic projection on MathWorld</a> for an overview.
  *
- * <div class="section">Description</div>
+ * <h2>Description</h2>
  * Areas and shapes are deformed as one moves away from standard parallels.
  * The angles are true in a limited area.
  * This projection is used for the charts of North America and some European countries.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
index 9b40ec7..ee94c9e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
@@ -46,7 +46,7 @@
  * <cite>Mercator Cylindrical</cite> projection (EPSG codes 9804, 9805, 1026, 1024, 1044, <span class="deprecated">9841</span>).
  * See the <a href="http://mathworld.wolfram.com/MercatorProjection.html">Mercator projection on MathWorld</a> for an overview.
  *
- * <div class="section">Description</div>
+ * <h2>Description</h2>
  * The parallels and the meridians are straight lines and cross at right angles; this projection thus produces
  * rectangular charts. The scale is true along the equator (by default) or along two parallels equidistant of the
  * equator (if a scale factor other than 1 is used).
@@ -59,7 +59,7 @@
  * For <cite>Mercator (variant A)</cite> (EPSG code 9804), the line of contact is the equator.
  * For <cite>Mercator (variant B)</cite> (EPSG code 9805) lines of contact are symmetrical about the equator.</p>
  *
- * <div class="section">Behavior at poles</div>
+ * <h2>Behavior at poles</h2>
  * The projection of 90°N gives {@linkplain Double#POSITIVE_INFINITY positive infinity}.
  * The projection of 90°S gives {@linkplain Double#NEGATIVE_INFINITY negative infinity}.
  * Projection of a latitude outside the [-90 … 90]° range produces {@linkplain Double#NaN NaN}.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
index 866be40..5d127cc 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
@@ -118,7 +118,7 @@
  * in radians. This is the opposite of {@link Parameters} where all angles are in CRS-dependent units,
  * typically decimal degrees.</p>
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialization of this class is appropriate for short-term storage or RMI use, but may not be compatible
  * with future versions. For long term storage, WKT (Well Know Text) or XML are more appropriate.
  *
@@ -401,7 +401,7 @@
      *   </tr>
      * </table>
      *
-     * <div class="section">Which parameters are considered</div>
+     * <h4>Which parameters are considered</h4>
      * The {@code roles} map specifies which parameters to look for <cite>central meridian</cite>,
      * <cite>scale factor</cite>, <cite>false easting</cite>, <cite>false northing</cite> and other values.
      * All entries in the {@code roles} map are optional.
@@ -651,7 +651,7 @@
      * in {@code dstPts} at the given offset. In addition, opportunistically computes the
      * transform derivative if requested.
      *
-     * <div class="section">Normalization</div>
+     * <h4>Normalization</h4>
      * The input coordinates are (<var>λ</var>,<var>φ</var>) (the variable names for <var>longitude</var> and
      * <var>latitude</var> respectively) angles in radians, eventually pre-multiplied by projection-specific factors.
      * Input coordinate shall have the <cite>central meridian</cite> removed from the longitude by the caller
@@ -671,7 +671,7 @@
      * <div class="note"><b>Note 2:</b> in <a href="https://proj4.org/">Proj.4</a>, the same standardization,
      * described above, is handled by {@code pj_fwd.c}, except for the projection-specific additional factors.</div>
      *
-     * <div class="section">Argument checks</div>
+     * <h4>Argument checks</h4>
      * The input longitude and latitude are usually (but not always) in the range [-π … π] and [-π/2 … π/2] respectively.
      * However values outside those ranges are accepted on the assumption that most implementations use those values
      * only in trigonometric functions like {@linkplain Math#sin(double) sine} and {@linkplain Math#cos(double) cosine}.
@@ -698,7 +698,7 @@
      * {@code ptDst} at the given offset. The output coordinates are (<var>longitude</var>, <var>latitude</var>)
      * angles in radians, usually (but not necessarily) in the range [-π … π] and [-π/2 … π/2] respectively.
      *
-     * <div class="section">Normalization</div>
+     * <h4>Normalization</h4>
      * Input coordinate shall have the (<cite>false easting</cite>, <cite>false northing</cite>) removed
      * by the caller and the result divided by the global <cite>scale factor</cite> before this method is invoked.
      * After this method is invoked, the caller will need to add the <cite>central meridian</cite> to the longitude
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueStereographic.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueStereographic.java
index f6da1fa..ddcf04c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueStereographic.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueStereographic.java
@@ -41,7 +41,7 @@
  * See the <a href="http://mathworld.wolfram.com/StereographicProjection.html">Stereographic projection
  * on MathWorld</a> for an overview.
  *
- * <div class="section">Description</div>
+ * <h2>Description</h2>
  * The directions starting from the central point are true, but the areas and the lengths become
  * increasingly deformed as one moves away from the center. This projection is frequently used
  * for mapping polar areas, but can also be used for other limited areas centered on a point.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
index bf18b14..9299856 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionException.java
@@ -22,7 +22,7 @@
 /**
  * Thrown by {@link NormalizedProjection} when a map projection failed.
  *
- * <div class="section">When this exception is thrown</div>
+ * <h2>When this exception is thrown</h2>
  * Apache SIS implementations of map projections return a {@linkplain Double#isFinite(double) finite} number
  * under normal conditions, but may also return an {@linkplain Double#isInfinite(double) infinite} number or
  * {@linkplain Double#isNaN(double) NaN} value, or throw this exception.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/SatelliteTracking.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/SatelliteTracking.java
index cbd9a5a..a941896 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/SatelliteTracking.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/SatelliteTracking.java
@@ -51,11 +51,11 @@
  *       on the conical form and along both on the cylindrical form.</li>
  * </ul>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * This map projection supports only circular orbits. The Earth is assumed spherical.
  * Areas close to poles can not be mapped.
  *
- * <div class="section">References</div>
+ * <h2>References</h2>
  * John P. Snyder., 1987. <u>Map Projections - A Working Manual</u>
  * chapter 28: <cite>Satellite-tracking projections</cite>.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java
index cb6e414..78c08ab 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/TransverseMercator.java
@@ -44,7 +44,7 @@
  * This class implements the "JHS formulas" reproduced in
  * IOGP Publication 373-7-2 – Geomatics Guidance Note number 7, part 2 – April 2015.
  *
- * <div class="section">Description</div>
+ * <h2>Description</h2>
  * This is a cylindrical projection, in which the cylinder has been rotated 90°.
  * Instead of being tangent to the equator (or to an other standard latitude), it is tangent to a central meridian.
  * Deformation are more important as we are going further from the central meridian.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/package-info.java
index d57f0c0..189180d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/package-info.java
@@ -40,7 +40,7 @@
  * Only users interested in the <em>implementation</em> of those projections should look at this package.</p>
  *
  *
- * <div class="section">Definition of terms</div>
+ * <h2>Definition of terms</h2>
  * <ul class="verbose">
  *   <li><b>Coordinate operation</b><br>
  *       In the particular case of this package, the conversion of geographic coordinates in any
@@ -58,7 +58,7 @@
  * </ul>
  *
  *
- * <div class="section">Axis units and orientation</div>
+ * <h2>Axis units and orientation</h2>
  * Many {@linkplain org.apache.sis.referencing.crs.DefaultGeographicCRS geographic coordinate reference systems}
  * use axis in (<var>latitude</var>, <var>longitude</var>) order, but not all. Axis order, orientation and units
  * are CRS-dependent. For example some CRS use longitude values increasing toward
@@ -96,7 +96,7 @@
  * must be ({@linkplain org.opengis.referencing.cs.AxisDirection#EAST East},
  * {@linkplain org.opengis.referencing.cs.AxisDirection#NORTH North}) oriented.
  *
- * <div class="note"><b>Implications on South oriented projections</b><br>
+ * <h3>Implications on South oriented projections</h3>
  * The above rule implies a non-intuitive behavior for the <cite>Transverse Mercator (South Orientated)</cite>
  * projection, which still projects coordinates with <var>y</var> values increasing toward North.
  * The real axis flip is performed outside this projection package, upon
@@ -106,15 +106,14 @@
  * {@link org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory#createBaseToDerived
  * createBaseToDerived(…)} method defined in the {@code MathTransformFactory} interface.
  * The same rule applies to the <cite>Krovak</cite> projection as well (at the opposite of what ESRI does).
- * </div>
  *
- * In order to reduce the risk of confusion, this package never defines south oriented map projection.
+ * <p>In order to reduce the risk of confusion, this package never defines south oriented map projection.
  * This rule removes ambiguity when reading a transform in <cite>Well Known Text</cite> (WKT) format,
  * since only the north-oriented variant is used and the affine transform coefficients tell exactly
- * which axis flips are applied.
+ * which axis flips are applied.</p>
  *
  *
- * <div class="section">Projection on unit ellipse</div>
+ * <h2>Projection on unit ellipse</h2>
  * A map projection in this package is actually the concatenation of the following transforms, in that order
  * (ignoring {@linkplain org.apache.sis.referencing.cs.CoordinateSystems#swapAndScaleAxes axis order changes}
  * and conversions from/to units other then degrees and metres, which are not the purpose of this package):
@@ -148,7 +147,7 @@
  * This normalization makes the equations closer to the ones published in Snyder's book, where the
  * <cite>false easting</cite>, <cite>false northing</cite> and <cite>scale factor</cite> are usually not given.</div>
  *
- * <div class="section">References</div>
+ * <h2>References</h2>
  * <ul>
  *   <li>IOGP. <u>Coordinate Conversions and Transformations including Formulas.</u><br>
  *       Geomatics Guidance Note Number 7, part 2, Version 49.</li>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform.java
index fe320c8..06735cf 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform.java
@@ -65,13 +65,13 @@
  *
  * However more performance may be gained by overriding the other {@code transform(…)} methods as well.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * All Apache SIS implementations of {@code MathTransform} are immutable and thread-safe.
  * It is highly recommended that third-party implementations be immutable and thread-safe too.
  * This means that unless otherwise noted in the javadoc, {@code MathTransform} instances can
  * be shared by many objects and passed between threads without synchronization.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * {@code MathTransform} may or may not be serializable, at implementation choices.
  * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
  * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
@@ -175,7 +175,7 @@
      * This is not necessarily the parameters that the user specified at construction time,
      * since implementations may have applied normalizations.
      *
-     * <div class="section">Normalized and contextual parameters</div>
+     * <h4>Normalized and contextual parameters</h4>
      * Most Apache SIS implementations of map projections perform their calculations on an ellipsoid
      * having a semi-major axis length of 1. In such cases, the group returned by this method contains
      * a {@code "semi_major"} parameter with a value of 1. If the real axis length is desired, we need
@@ -333,7 +333,7 @@
      *   the same. Computing those two information in a single step can help to reduce redundant calculation.</li>
      * </ul>
      *
-     * <div class="section">Note for implementers</div>
+     * <h4>Note for implementers</h4>
      * The source and destination may overlap. Consequently, implementers must read all source
      * coordinate values before to start writing the transformed coordinates in the destination array.
      *
@@ -1024,7 +1024,7 @@
      * Base class for implementations of inverse math transforms.
      * Subclasses need to implement the {@link #inverse()} method.
      *
-     * <div class="section">Serialization</div>
+     * <h2>Serialization</h2>
      * This object may or may not be serializable, at implementation choices.
      * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
      * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform1D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform1D.java
index 320b400..c220732 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform1D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform1D.java
@@ -39,13 +39,13 @@
  *   <li>{@link #derivative(double)}</li>
  * </ul>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * All Apache SIS implementations of {@code MathTransform1D} are immutable and thread-safe.
  * It is highly recommended that third-party implementations be immutable and thread-safe too.
  * This means that unless otherwise noted in the javadoc, {@code MathTransform1D} instances can
  * be shared by many objects and passed between threads without synchronization.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * {@code MathTransform1D} may or may not be serializable, at implementation choices.
  * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
  * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
@@ -155,7 +155,7 @@
      * Base class for implementation of inverse math transforms.
      * This inner class is the inverse of the enclosing {@link AbstractMathTransform1D}.
      *
-     * <div class="section">Serialization</div>
+     * <h2>Serialization</h2>
      * This object may or may not be serializable, at implementation choices.
      * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
      * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform2D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform2D.java
index c0ed690..2590c11 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform2D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractMathTransform2D.java
@@ -45,13 +45,13 @@
  *
  * However more performance may be gained by overriding the other {@code transform} methods as well.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * All Apache SIS implementations of {@code MathTransform2D} are immutable and thread-safe.
  * It is highly recommended that third-party implementations be immutable and thread-safe too.
  * This means that unless otherwise noted in the javadoc, {@code MathTransform2D} instances can
  * be shared by many objects and passed between threads without synchronization.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * {@code MathTransform2D} may or may not be serializable, at implementation choices.
  * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
  * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
@@ -331,7 +331,7 @@
      * Base class for implementation of inverse math transforms.
      * This inner class is the inverse of the enclosing {@link AbstractMathTransform2D}.
      *
-     * <div class="section">Serialization</div>
+     * <h2>Serialization</h2>
      * This object may or may not be serializable, at implementation choices.
      * Most Apache SIS implementations are serializable, but the serialized objects are not guaranteed to be compatible
      * with future SIS versions. Serialization should be used only for short term storage or RMI between applications
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java
index 5180095..d7743a9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java
@@ -71,7 +71,7 @@
  * only normalized parameters (e.g. a map projection on an ellipsoid having a <cite>semi-major</cite> axis length of 1),
  * Apache SIS needs contextual information for reconstructing the parameters of the complete transforms chain.</p>
  *
- * <div class="section">Usage in map projections</div>
+ * <h2>Usage in map projections</h2>
  * This object is used mostly for Apache SIS implementation of map projections, where the non-linear kernel is a
  * {@linkplain org.apache.sis.referencing.operation.projection.NormalizedProjection normalized projection}.
  * The {@linkplain #completeTransform(MathTransformFactory, MathTransform) complete map projection}
@@ -116,7 +116,7 @@
  *   </li>
  * </ol>
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the same SIS version.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DatumShiftTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DatumShiftTransform.java
index 1a978be..f1115b6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DatumShiftTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DatumShiftTransform.java
@@ -51,7 +51,7 @@
  * More complex methods are subclasses of this {@code DatumShiftTransform} base class, but users should not assume
  * that this is the case of every transforms performing a datum shift.</p>
  *
- * <div class="section">Datum shift methods overview</div>
+ * <h2>Datum shift methods overview</h2>
  * The two CRS's ellipsoids have slightly different scale and rotation in space, and their center are located in
  * a slightly different position. Consequently geodetic datum shifts are often approximated by a constant scale,
  * rotation and translation applied on geocentric coordinates. Those approximations are handled in SIS
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
index 28b2589..cfc7ecd 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
@@ -93,7 +93,7 @@
  * or {@link MathTransforms} classes instead.
  *
  *
- * <div class="section">Standard parameters</div>
+ * <h2>Standard parameters</h2>
  * {@code MathTransform} instances are created from {@linkplain DefaultParameterValueGroup parameter values}.
  * The parameters expected by each operation available in a default Apache SIS installation is
  * <a href="http://sis.apache.org/tables/CoordinateOperationMethods.html">listed here</a>.
@@ -111,7 +111,7 @@
  * by OGC, while EPSG uses various names like <cite>"False easting"</cite> or <cite>"Easting at
  * false origin"</cite>.</p>
  *
- * <div class="section">Dynamic parameters</div>
+ * <h2>Dynamic parameters</h2>
  * A few non-standard parameters are defined for compatibility reasons,
  * but delegates their work to standard parameters. Those dynamic parameters are not listed in the
  * {@linkplain DefaultParameterValueGroup#values() parameter values}.
@@ -132,7 +132,7 @@
  * files for example, which often use spherical models instead than ellipsoidal ones.</p>
  *
  *
- * <div class="section"><a id="Obligation">Mandatory and optional parameters</a></div>
+ * <h2><a id="Obligation">Mandatory and optional parameters</a></h2>
  * Parameters are flagged as either <cite>mandatory</cite> or <cite>optional</cite>.
  * A parameter may be mandatory and still have a default value. In the context of this package, "mandatory"
  * means that the parameter is an essential part of the projection defined by standards.
@@ -145,7 +145,7 @@
  * default value.</p>
  *
  *
- * <div class="section">Operation methods discovery</div>
+ * <h2>Operation methods discovery</h2>
  * {@link OperationMethod} describes all the parameters expected for instantiating a particular kind of
  * math transform. The set of operation methods known to this factory can be obtained in two ways:
  *
@@ -158,7 +158,7 @@
  * custom coordinate operation methods in a default Apache SIS installation.
  *
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is safe for multi-thread usage if all referenced {@code OperationMethod} instances are thread-safe.
  * There is typically only one {@code MathTransformFactory} instance for the whole application.
  *
@@ -1091,7 +1091,7 @@
      * both of them with ({@linkplain org.opengis.referencing.cs.AxisDirection#EAST East},
      * {@linkplain org.opengis.referencing.cs.AxisDirection#NORTH North}) axis orientations.</div>
      *
-     * <div class="section">Controlling the normalization process</div>
+     * <h4>Controlling the normalization process</h4>
      * Users who need a different normalized space than the default one way find more convenient to
      * override the {@link Context#getMatrix Context.getMatrix(ContextualParameters.MatrixRole)} method.
      *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
index 5e6c8d9..a49ad6d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
@@ -237,7 +237,7 @@
      *   <li>distance from Earth center on the Z axis (toward North pole).</li>
      * </ol>
      *
-     * <div class="section">Geographic to geocentric conversions</div>
+     * <h4>Geographic to geocentric conversions</h4>
      * For converting geographic coordinates to geocentric coordinates, {@code EllipsoidToCentricTransform}
      * instances need to be concatenated with the following affine transforms:
      *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ExponentialTransform1D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ExponentialTransform1D.java
index 7ef09b1..8886b40 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ExponentialTransform1D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ExponentialTransform1D.java
@@ -45,7 +45,7 @@
  * }
  * </div>
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the
  * same SIS version.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedGeocentricTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedGeocentricTransform.java
index 0b3d4fe..71b22e1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedGeocentricTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedGeocentricTransform.java
@@ -43,7 +43,7 @@
  * This transform is used mainly for <cite>"France geocentric interpolation"</cite> (ESPG:9655) datum shifts,
  * but Apache SIS implementation allows the use for other regions.
  *
- * <div class="section">Algorithm</div>
+ * <h2>Algorithm</h2>
  * This class transforms two- or three- dimensional coordinates from a geographic CRS to another geographic CRS.
  * The changes between source and target coordinates are small (usually less than 400 metres), but vary for every
  * position. Those changes are provided in a {@linkplain DatumShiftGrid datum shift grid}, usually loaded from one
@@ -72,7 +72,7 @@
  * because the {@code DatumShiftGrid} inputs are geographic coordinates even if the interpolated
  * grid values are in geocentric space.</p></div>
  *
- * <div class="section">Performance consideration</div>
+ * <h2>Performance consideration</h2>
  * {@link InterpolatedMolodenskyTransform} performs the same calculation more efficiently at the cost of
  * a few centimetres error. Both classes are instantiated in the same way and expect the same inputs.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedMolodenskyTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedMolodenskyTransform.java
index 8ef89da..4fdb7fb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedMolodenskyTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedMolodenskyTransform.java
@@ -48,7 +48,7 @@
  * Errors are less than 3 centimetres for the <cite>"France geocentric interpolation"</cite> (ESPG:9655).
  * By comparison, the finest accuracy reported in the grid file for France is 5 centimetres.
  *
- * <div class="section">Algorithm</div>
+ * <h2>Algorithm</h2>
  * This class transforms two- or three- dimensional coordinates from a geographic CRS to another geographic CRS.
  * The changes between source and target coordinates are small (usually less than 400 metres), but vary for every
  * position. Those changes are provided in a {@linkplain DatumShiftGrid datum shift grid}, usually loaded from one
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
index b6bc7a8..4700441 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
@@ -48,7 +48,7 @@
  * <div class="note"><b>Example:</b>
  * this transform is used for example with NADCON and NTv2 datum shift grids.</div>
  *
- * <div class="section">Input and output coordinates</div>
+ * <h2>Input and output coordinates</h2>
  * First, <cite>"real world"</cite> input coordinates (<var>x</var>,<var>y</var>) are converted to
  * <cite>grid</cite> coordinates (<var>gridX</var>, <var>gridY</var>), which are zero-based indices
  * in the two-dimensional grid. This conversion is applied by an affine transform <em>before</em>
@@ -192,7 +192,7 @@
      * {@code InterpolatedTransform} instance with the steps needed for converting values between
      * geodetic and grid coordinates.
      *
-     * <div class="section">Unit of measurement</div>
+     * <h4>Unit of measurement</h4>
      * The unit of measurement is determined by {@link DatumShiftGrid#getCoordinateUnit()}:
      * <ul>
      *   <li>If the datum shift unit {@linkplain Units#isAngular(Unit) is angular}, then the transform
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/IterationStrategy.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/IterationStrategy.java
index 77e1d62..e750c54 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/IterationStrategy.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/IterationStrategy.java
@@ -27,7 +27,7 @@
  * The {@link #suggest(int, int, int, int, int)  suggest(…)} method in this class returns a strategy
  * suitable to the {@code transform} arguments.
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * The following code gives a skeleton for a {@code AbstractMathTransform} implementation
  * capable to transform an array of {@code double} coordinates:
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
index 2e310b4..e1c318e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
@@ -39,7 +39,7 @@
  * <p>If desired values in decreasing order can be supported by inverting the sign of all values,
  * then concatenating this transform with a transform that multiply all output values by -1.</p>
  *
- * <div class="section">Extrapolation</div>
+ * <h2>Extrapolation</h2>
  * If an input value is outside the expected range of values, this class extrapolates using the
  * slope defined by the two first points if the requested value is before, or the slope defined
  * by the two last points if the requested value is after.   In other words, extrapolations are
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearTransform.java
index 9f5f1fd..9cac821 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearTransform.java
@@ -38,7 +38,7 @@
  *       the number of {@linkplain #getTargetDimensions() target dimensions} plus 1.</li>
  * </ul>
  *
- * <div class="section">Affine transform</div>
+ * <h2>Affine transform</h2>
  * In most cases the transform in affine. For such transforms, the last matrix row contains only zero values
  * except in the last column, which contains 1. For example a conversion from projected coordinates (metres)
  * to display coordinates (pixel) can be done as below:
@@ -47,7 +47,7 @@
  * <img src="../matrix/doc-files/AffineTransform.png" alt="Matrix representation of an affine transform">
  * </div>
  *
- * <div class="section">Projective transform</div>
+ * <h2>Projective transform</h2>
  * If the last matrix row does not met the above constraints, then the transform is not affine.
  * A <cite>projective</cite> transform can be used as a generalization of affine transforms.
  * In such case the computation performed by SIS is similar to {@code PerspectiveTransform}
@@ -57,7 +57,7 @@
  *
  * <div style="text-align:center">{@include formulas.html#ProjectiveTransform}</div>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * The easiest way to instantiate a {@code LinearTransform} is to use the {@link MathTransforms#linear(Matrix)}
  * convenience method.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LogarithmicTransform1D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LogarithmicTransform1D.java
index 0be0bb5..65c4e3f 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LogarithmicTransform1D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LogarithmicTransform1D.java
@@ -37,7 +37,7 @@
  *
  * <blockquote>log<sub>base</sub>(<var>x</var>) = ln(<var>x</var>) / ln(base)</blockquote>
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the
  * same SIS version.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
index 5f464b1..d852ed4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
@@ -41,7 +41,7 @@
  * Alternative, one can also use a {@linkplain DefaultMathTransformFactory math transform factory}</p>
  *
  *
- * <div class="section">How to add custom coordinate operations to Apache SIS</div>
+ * <h2>How to add custom coordinate operations to Apache SIS</h2>
  * {@link DefaultMathTransformFactory} can discover automatically new coordinate operations
  * (including map projections) by scanning the classpath. To define a custom coordinate operation,
  * one needs to define a <strong>thread-safe</strong> class implementing <strong>both</strong> this
@@ -104,7 +104,7 @@
      * }
      * </div>
      *
-     * <div class="section">Purpose of the factory argument</div>
+     * <h4>Purpose of the factory argument</h4>
      * Some math transforms may actually be implemented as a chain of operation steps, for example a
      * {@linkplain DefaultMathTransformFactory#createConcatenatedTransform(MathTransform, MathTransform)
      * concatenation} of {@linkplain DefaultMathTransformFactory#createAffineTransform affine transforms}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MolodenskyTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MolodenskyTransform.java
index 657cfa5..e8992a2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MolodenskyTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MolodenskyTransform.java
@@ -69,7 +69,7 @@
  *       axes (usually metres).</li>
  * </ul>
  *
- * <div class="section">Comparison of Molodensky and geocentric translation</div>
+ * <h2>Comparison of Molodensky and geocentric translation</h2>
  * Compared to the <cite>"Geocentric translation (geographic domain)"</cite> method,
  * the Molodensky method has errors usually within a few centimetres.
  * The Abridged Molodensky method has more noticeable errors, of a few tenths of centimetres.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/OperationMethodSet.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/OperationMethodSet.java
index 59de6e7..c5d6f61 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/OperationMethodSet.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/OperationMethodSet.java
@@ -32,12 +32,12 @@
  * An immutable and thread-safe set containing the operation methods given by an {@link Iterable}.
  * Initial iteration is synchronized on the given {@code Iterable} and the result is cached.
  *
- * <div class="section">Rational</div>
+ * <h2>Rational</h2>
  * We use this class instead than copying the {@link OperationMethod} instances in a {@link java.util.HashSet}
  * in order to allow deferred {@code OperationMethod} instantiation, for example in the usual case where the
  * iterable is a {@link java.util.ServiceLoader}: we do not invoke {@link Iterator#next()} before needed.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * The usual {@link Set} methods like {@code contains(Object)} are inefficient as they may require a traversal
  * of all elements in this set.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PassThroughTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PassThroughTransform.java
index 1782e41..42a144e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PassThroughTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PassThroughTransform.java
@@ -54,11 +54,11 @@
  * }
  * </div>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * {@code PassThroughTransform} is immutable and thread-safe if its {@linkplain #subTransform} is also
  * immutable and thread-safe.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the same SIS version.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PowerTransform1D.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PowerTransform1D.java
index 1c0f6cf..064402e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PowerTransform1D.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PowerTransform1D.java
@@ -33,7 +33,7 @@
  * <p>Before to make this class public (if we do), we need to revisit the class name, define parameters
  * and improve the {@link #tryConcatenate(boolean, MathTransform, MathTransformFactory)} method.</p>
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the
  * same SIS version.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
index 1bd7676..47d80b6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
@@ -46,13 +46,13 @@
  *       <td><var>y</var> = scale⋅base<sup><var>x</var></sup> + offset</td></tr>
  * </table>
  *
- * <div class="section">Missing values</div>
+ * <h2>Missing values</h2>
  * This {@code TransferFunction} class handles only the continuous part of transfer functions.
  * This class does <strong>not</strong> handle missing values other than {@code NaN}.
  * For a more complete class with support for non-NaN missing values,
  * see {@code org.apache.sis.coverage.SampleDimension}.
  *
- * <div class="section">Serialization</div>
+ * <h2>Serialization</h2>
  * Serialized instances of this class are not guaranteed to be compatible with future SIS versions.
  * Serialization should be used only for short term storage or RMI between applications running the
  * same SIS version.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/package-info.java
index cacb140..72a4164 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/package-info.java
@@ -38,7 +38,7 @@
  * in their own {@linkplain org.apache.sis.referencing.operation.projection projection} package.</p>
  *
  *
- * <div class="section">Creating math transforms</div>
+ * <h2>Creating math transforms</h2>
  * {@code MathTransform} instances can be created either directly or indirectly.
  * The recommended way is the indirect one: first
  * {@linkplain org.apache.sis.referencing.CRS#findOperation find the coordinate operation}
@@ -49,7 +49,7 @@
  * transform factory}.
  *
  *
- * <div class="section">Non-spatial coordinates</div>
+ * <h2>Non-spatial coordinates</h2>
  * {@code MathTransform} usually performs conversions or transformations from points given in a
  * {@linkplain org.apache.sis.referencing.operation.AbstractCoordinateOperation#getSourceCRS()
  * source coordinate reference system} to coordinate values for the same points in the
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
index 973fcd9..63c72bc 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
@@ -31,7 +31,7 @@
  *       (ISO 19112), together with the linking from geographic identifiers to coordinates.</li>
  * </ul>
  *
- * <div class="section">Fetching geodetic object instances</div>
+ * <h2>Fetching geodetic object instances</h2>
  * Geodetic objects can be instantiated either
  * {@linkplain org.apache.sis.referencing.factory.GeodeticObjectFactory directly by specifying all information to a factory method or constructor}, or
  * {@linkplain org.apache.sis.referencing.factory.GeodeticAuthorityFactory indirectly by specifying the identifier of an entry in a database}.
@@ -42,7 +42,7 @@
  * {@link org.apache.sis.referencing.CRS#fromWKT(String)} and
  * {@link org.apache.sis.referencing.CRS#fromXML(String)}
  *
- * <div class="section">Usage example</div>
+ * <h2>Usage example</h2>
  * The following example projects a (<var>latitude</var>, <var>longitude</var>) coordinate to
  * a <cite>Universal Transverse Mercator</cite> projection in the zone of the coordinate:
  *
@@ -60,7 +60,7 @@
  *   System.out.println(position);
  * }
  *
- * <div class="section">The EPSG database</div>
+ * <h2>The EPSG database</h2>
  * The EPSG geodetic parameter dataset is a structured database required to:
  *
  * <ul>
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/geometry/CoordinateFormatTest.java b/core/sis-referencing/src/test/java/org/apache/sis/geometry/CoordinateFormatTest.java
index e97ff9a..c225e3b 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/geometry/CoordinateFormatTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/geometry/CoordinateFormatTest.java
@@ -151,7 +151,6 @@
         position.setCoordinateReferenceSystem(null);
         assertEquals("getPattern(Angle)", anglePattern, format.getPattern(Angle.class));
         assertEquals("getPattern(Date)",   datePattern, format.getPattern(Date .class));
-        if (false)  // TODO remove this line if we can require JDK13 at build time.
         assertEquals("23,78 -12,74 127,9 54 000,25",    format.format(position));
         /*
          * Try again with the original CRS, but different separator.
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/NTv2Test.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/NTv2Test.java
index 0d6c4b4..c87ef93 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/NTv2Test.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/NTv2Test.java
@@ -183,7 +183,7 @@
      * This ensure that the grid indices (75.7432814, 78.4451225) is included in the test file.
      * Those grid indices is the location of the (2°25′32.4187″N 48°50′40.2441″W) test point to interpolate.
      *
-     * <div class="section">Limitations</div>
+     * <h4>Limitations</h4>
      * This method assumes that bounding box and increments have integer values, and that any fractional part
      * is rounding errors. This is usually the case when using the {@code "SECONDS"} unit of measurement.
      * This assumption does not apply to the shift values.
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java
index 66c289a..f0726d7 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java
@@ -133,7 +133,7 @@
     /**
      * Tests WKT 2 formatting.
      *
-     * <div class="section">Note on axis names</div>
+     * <h4>Note on axis names</h4>
      * ISO 19162 said: “For geodetic CRSs having a geocentric Cartesian coordinate system,
      * the axis name should be omitted as it is given through the mandatory axis direction,
      * but the axis abbreviation, respectively ‘X’, 'Y' and ‘Z’, shall be given.”
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/MatrixTestCase.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/MatrixTestCase.java
index d2a270c..81173bc 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/MatrixTestCase.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/MatrixTestCase.java
@@ -68,7 +68,7 @@
      * which is {@value}. Note that the matrix element values used in this class vary between 0 and 100,
      * and the {@code StrictMath.ulp(100.0)} value is approximately 1.4E-14.
      *
-     * <div class="section">How this value is determined</div>
+     * <h4>How this value is determined</h4>
      * Experience (by looking at {@link #statistics}) shows that the differences are usually smaller than 1E-12.
      * However when using non-determinist sequence of random values ({@link #DETERMINIST} sets to {@code false}),
      * we do have from time-to-time a difference around 1E-9.
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/SolverTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/SolverTest.java
index 08dce2b..0e4d59e 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/SolverTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/matrix/SolverTest.java
@@ -33,7 +33,7 @@
  * Tests the {@link Solver} class using <a href="http://math.nist.gov/javanumerics/jama">JAMA</a>
  * as the reference implementation.
  *
- * <div class="section">Cyclic dependency</div>
+ * <h2>Cyclic dependency</h2>
  * There is a cyclic test dependency since {@link GeneralMatrix} needs {@link Solver} for some operations,
  * and conversely. To be more specific the dependency order is:
  *
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/LambertConicConformalTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/LambertConicConformalTest.java
index a5ab6c0..31155dd 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/LambertConicConformalTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/LambertConicConformalTest.java
@@ -96,7 +96,7 @@
      * Tests the WKT formatting of {@link NormalizedProjection}. For the Lambert Conformal projection, we expect
      * the internal {@code n} parameter in addition to the eccentricity.
      *
-     * <div class="section">Note on accuracy</div>
+     * <h4>Note on accuracy</h4>
      * The value of the eccentricity parameter should be fully accurate because it is calculated using only the
      * {@link Math#sqrt(double)} function (ignoring basic algebraic operations) which, according javadoc, must
      * give the result closest to the true mathematical result. But the functions involved in the calculation of
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/test/widget/package-info.java b/core/sis-referencing/src/test/java/org/apache/sis/test/widget/package-info.java
index a774ab7..a1dc35b 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/test/widget/package-info.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/test/widget/package-info.java
@@ -22,7 +22,7 @@
  * This package may seem unused by code on the repository because it is often used only
  * temporarily during debugging phase.
  *
- * <div class="section">Other visualization tools</div>
+ * <h2>Other visualization tools</h2>
  * This package does not contains all visualization tools. Some debugging tools specific
  * to a particular class are provided in the package of that class. Examples:
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/AngleConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/AngleConverter.java
index 7ccd30e..bc43c82 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/AngleConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/AngleConverter.java
@@ -25,7 +25,7 @@
 /**
  * Handles conversions between {@link Angle} and {@link Double}.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  * The same {@link #INSTANCE} can be passed between threads without synchronization.
  *
@@ -97,7 +97,7 @@
     /**
      * The inverse of {@link AngleConverter}.
      *
-     * <div class="section">Thread safety</div>
+     * <h2>Thread safety</h2>
      * This class is immutable, and thus inherently thread-safe.
      */
     public static final class Inverse extends SystemConverter<Double,Angle> {
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ArrayConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ArrayConverter.java
index 00a3196..1a4dac1 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ArrayConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ArrayConverter.java
@@ -31,7 +31,7 @@
  * the source and target types of the element converter shall be {@code <? super S>} and {@code <? extends T>}
  * respectively.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable, and thus inherently thread-safe,
  * if the converter given to the constructor is also immutable.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CharSequenceConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CharSequenceConverter.java
index 41f57a8..6f40c6f 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CharSequenceConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CharSequenceConverter.java
@@ -32,7 +32,7 @@
  * <p>The main purpose of this class is to support the conversion of
  * {@link org.opengis.util.InternationalString}.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable, and thus inherently thread-safe,
  * if the converter given to the constructor is also immutable.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ClassPair.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ClassPair.java
index 50defc1..dc1519d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ClassPair.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ClassPair.java
@@ -28,7 +28,7 @@
  * <strong>No other direct subtype shall exist</strong>.
  * See {@link #equals(Object)} for an explanation.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus inherently thread-safe. {@code ClassPair} immutability is necessary
  * for {@link ConverterRegistry}. Subclasses should also be immutable, but this requirement is not as strong
  * as for {@code ClassPair} (because subclasses are not used as keys in hash map).
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CollectionConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CollectionConverter.java
index 9b762d8..bb4ede6 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CollectionConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/CollectionConverter.java
@@ -28,7 +28,7 @@
  * The source class is fixed to {@code Collection}. The target class is determined
  * by the inner class which extends this {@code CollectionConverter} class.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable, and thus inherently thread-safe. Subclasses should be immutable
  * and thread-safe too if they are intended to be cached in {@link ConverterRegistry}.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ConverterRegistry.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ConverterRegistry.java
index 92247aa..a29f262 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ConverterRegistry.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ConverterRegistry.java
@@ -38,12 +38,12 @@
  * explicitly {@linkplain #register(ObjectConverter) registered}. However a system-wide registry
  * initialized with default converters is provided by the {@link SystemRegistry#INSTANCE} constant.</p>
  *
- * <div class="section">Note about conversions from interfaces</div>
+ * <h2>Note about conversions from interfaces</h2>
  * {@code ConverterRegistry} is primarily designed for handling converters from classes to other classes.
  * Handling of interfaces are not prohibited (and actually sometime supported), but their behavior may be
  * more ambiguous than in the case of classes because of multi-inheritance in interface hierarchy.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This base class is thread-safe. Subclasses shall make sure that any overridden methods remain safe to call
  * from multiple threads.
  *
@@ -64,7 +64,7 @@
      * then the key and the value may be the same instance (in order to save object
      * allocations).</p>
      *
-     * <div class="section">Synchronization note</div>
+     * <h4>Synchronization note</h4>
      * Synchronization if performed by {@code synchronized(converters)} statements. We tried
      * {@code ReadWriteLock}, but this is not very convenient because read operations may be
      * followed by write operations at any time if the requested converter is not in the cache.
@@ -210,7 +210,7 @@
      * For example a converter producing {@link Double} can be used for clients that just ask
      * for a {@link Number}.</p>
      *
-     * <div class="section">Which super-classes of the target class are registered</div>
+     * <h4>Which super-classes of the target class are registered</h4>
      * Consider a converter from class {@code S} to class {@code T} where the two classes
      * are related in a hierarchy as below:
      *
@@ -233,7 +233,7 @@
      * No {@code S} → {@code C2} or {@code S} → {@code C1} converter will be registered,
      * because an identity converter would be sufficient for those cases.
      *
-     * <div class="section">Which sub-classes of the source class are registered</div>
+     * <h4>Which sub-classes of the source class are registered</h4>
      * Sub-classes of the source class will be registered on a case-by-case basis when the
      * {@link #find(Class, Class)} is invoked, because we can not know the set of all
      * sub-classes in advance (and would not necessarily want to register all of them anyway).
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/DateConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/DateConverter.java
index 7ce856c..f93b650 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/DateConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/DateConverter.java
@@ -26,15 +26,15 @@
 /**
  * Handles conversions from {@link Date} to various objects.
  *
- * <div class="section">String representation</div>
+ * <h2>String representation</h2>
  * There is currently no converter between {@link String} and {@link java.util.Date} because the
  * date format is not yet defined (we are considering the ISO format for a future SIS version).
  *
- * <div class="section">Special cases</div>
+ * <h2>Special cases</h2>
  * The converter from dates to timestamps is not injective, because the same date could be mapped
  * to many timestamps since timestamps have an additional nanoseconds field.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/FallbackConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/FallbackConverter.java
index 9e23225..048e840 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/FallbackConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/FallbackConverter.java
@@ -46,7 +46,7 @@
  * It is invoked when a new converter is {@linkplain ConverterRegistry#register(ObjectConverter)
  * registered} for the same source and target class than an existing converter.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable, and thus inherently thread-safe,
  * if the converters given to the static factory method are also immutable.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/IdentityConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/IdentityConverter.java
index c09d6bc..8d17c83 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/IdentityConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/IdentityConverter.java
@@ -25,7 +25,7 @@
 /**
  * An object converter which returns the source unchanged.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/NumberConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/NumberConverter.java
index 6d4d7b8..539ba81 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/NumberConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/NumberConverter.java
@@ -29,7 +29,7 @@
  * Handles conversions from {@link java.lang.Number} to other kind of numbers.
  * This class supports only the type supported by {@link Numbers}.
  *
- * <div class="section">Performance note</div>
+ * <h2>Performance note</h2>
  * We provide a single class for all supported kinds of {@code Number} and delegate the actual
  * work to the {@code Numbers} static methods. This is not a very efficient way to do the work.
  * For example it may be more efficient to provide specialized subclasses for each target class,
@@ -41,7 +41,7 @@
  * {@code d73a10558dda4b41723d4f5652a792ae9c24f69e} (subversion: 1455255) of this class,
  * which was using one subclass per target type as described above.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ObjectToString.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ObjectToString.java
index ebfdce4..1fc665a 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ObjectToString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/ObjectToString.java
@@ -34,7 +34,7 @@
  *     ObjectConverter<S,String> c = StringConverter.getInstance(sourceClass).inverse();
  * }
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/PathConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/PathConverter.java
index 9f80192..15c1648 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/PathConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/PathConverter.java
@@ -33,7 +33,7 @@
 /**
  * Handles conversions between {@link Path}, {@link File}, {@link URI} and {@link URL} objects.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/StringConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/StringConverter.java
index 0b069c4..2b02b49 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/StringConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/StringConverter.java
@@ -45,7 +45,7 @@
  * completely bijective because various path separators ({@code '/'} and {@code '\'})
  * produce the same {@code File} object.</p>
  *
- * <div class="section">Special cases</div>
+ * <h2>Special cases</h2>
  * Conversion table from {@link String} to {@link java.lang.Boolean}:
  *
  * <table class="sis">
@@ -61,7 +61,7 @@
  *   <tr><td>{@code "0"}     </td><td>{@link java.lang.Boolean#FALSE} </td></tr>
  * </table>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemConverter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemConverter.java
index e368ddc..bab75d6 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemConverter.java
@@ -28,7 +28,7 @@
  * Base class of all converters defined in the {@code org.apache.sis.internal} package.
  * Those converters are returned by system-wide {@link ConverterRegistry}, and cached for reuse.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable, and thus inherently thread-safe. Subclasses should be immutable
  * and thread-safe too if they are intended to be cached in {@link ConverterRegistry}.
  *
@@ -102,7 +102,7 @@
      * requires the two objects to be of the same class. We do that in order to differentiate the
      * "ordinary" converters from the {@link FallbackConverter}.
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * This is admittedly a little bit convolved. A cleaner approach would have been to not allow
      * the {@code ConverterRegister} hash map to contain anything else than {@code ClassPair} keys,
      * but the current strategy of using the same instance for keys and values reduces a little bit
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java
index 3239de5..471755d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java
@@ -45,7 +45,7 @@
  * of the above-cited heuristic rules. This differs from the {@link ConverterRegistry} behavior,
  * where only registered converters are used.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@link #INSTANCE} can be safely used by many threads without synchronization on the part of the caller.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/package-info.java
index df6c29b..9a4e383 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/converter/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/converter/package-info.java
@@ -22,7 +22,7 @@
  * A system-wide instance of {@code ConverterRegistry} with a default set of conversions
  * is available as {@link org.apache.sis.internal.converter.SystemRegistry#INSTANCE}.
  *
- * <div class="section">Adding system-wide converters</div>
+ * <h2>Adding system-wide converters</h2>
  * Applications can add system-wide custom converters either by explicit calls to the
  * {@code SystemRegistry.INSTANCE.register(ObjectConverter)} method, or by listing the
  * fully qualified classnames of their {@link org.apache.sis.util.ObjectConverter} instances
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java
index cf26ccc..f5e2911 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedExecutor.java
@@ -33,7 +33,7 @@
  *   <li>{@link #schedule(DelayedRunnable)}</li>
  * </ul>
  *
- * <div class="section">Comparison with {@code java.util.concurrent}</div>
+ * <h2>Comparison with {@code java.util.concurrent}</h2>
  * We tried to use {@link java.util.concurrent.ScheduledThreadPoolExecutor} in a previous SIS version,
  * but its "fixed-sized pool" design forces us to use only one thread if we do not want to waste resources
  * (profiling shows that even a single thread has very low activity), which reduces the interest of that class.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedRunnable.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedRunnable.java
index 816a9e3..744d660 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedRunnable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DelayedRunnable.java
@@ -24,7 +24,7 @@
 /**
  * A task to be submitted to {@link DelayedExecutor} for later execution.
  *
- * <div class="section">Future evolution</div>
+ * <h2>Future evolution</h2>
  * This interface may be removed in a future SIS version if we choose to use a library-wide executor
  * instead of {@code DelayedExecutor}. See <a href="https://issues.apache.org/jira/browse/SIS-76">SIS-76</a>
  * for more information.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/Threads.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/Threads.java
index 9566b6d..71b8848 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/Threads.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/system/Threads.java
@@ -25,7 +25,7 @@
  * Their intent is to bring some order in debugger information, by grouping the threads created by SIS together
  * under the same parent tree node.
  *
- * <div class="section">Note on dependencies</div>
+ * <h2>Note on dependencies</h2>
  * This class shall not depend on {@link ReferenceQueueConsumer} or {@link DelayedExecutor},
  * because initialization of those classes create new threads. However it is okay to have
  * dependencies the other way around.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java
index dd31509..3a21884 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Constants.java
@@ -23,7 +23,7 @@
  * Hard coded values (typically identifiers).
  * The set of constants defined in this class may change in any SIS version - do not rely on them.
  *
- * <div class="section">When to use</div>
+ * <h2>When to use</h2>
  * Those constants should be used mostly for names, aliases or identifiers. They should generally
  * not be used for abbreviations for instance, even if the abbreviation result in the same string.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
index 9d12ae7..064e8d0 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
@@ -48,7 +48,7 @@
  *   <li>{@code http://www.opengis.net/def/uom/SI/0/m%2Fs}</li>
  * </ul>
  *
- * <div class="section">Parts of URN</div>
+ * <h2>Parts of URN</h2>
  * URN begins with {@code "urn:ogc:def:"} (formerly {@code "urn:x-ogc:def:"}) followed by:
  * <ul>
  *   <li>an object {@linkplain #type}</li>
@@ -100,7 +100,7 @@
  *   <tr><td>{@code "UCUM"}</td> <td>Unified Code for Units of Measure.</td></tr>
  * </table>
  *
- * <div class="section">Combined URNs</div>
+ * <h2>Combined URNs</h2>
  * This implementation does not handle combined URNs. An example of combined URN would be
  * {@code "urn:ogc:def:crs,crs:EPSG:6.3:27700,crs:EPSG:6.3:5701"}.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java
index c4dd082..65498a5 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DoubleDouble.java
@@ -46,7 +46,7 @@
  *     BigDecimal decimal = new BigDecimal(dd.value).add(new BigDecimal(dd.error));
  * }
  *
- * <div class="section">Impact of availability of FMA instructions</div>
+ * <h2>Impact of availability of FMA instructions</h2>
  * When allowed to use <cite>fused multiply-add</cite> (FMA) instruction added in JDK9
  * (see <a href="https://issues.apache.org/jira/browse/SIS-136">SIS-136</a> on Apache SIS JIRA),
  * then the following methods should be revisited:
@@ -351,7 +351,7 @@
      * is defined in base 10 (e.g. many unit conversion factors) and tries to compute an error term with
      * {@link DecimalFunctions#deltaForDoubleToDecimal(double)}.
      *
-     * <div class="section">Rational</div>
+     * <h4>Rational</h4>
      * SIS often creates matrices for unit conversions, and most conversion factors are defined precisely in base 10.
      * For example the conversion from feet to metres is defined by a factor of exactly 0.3048, which can not be
      * represented precisely as a {@code double}. Consequently if a value of 0.3048 is given, we can assume that
@@ -609,7 +609,7 @@
      * Adds an other double-double value to this {@code DoubleDouble}.
      * The result is stored in this instance.
      *
-     * <div class="section">Implementation</div>
+     * <h4>Implementation</h4>
      * If <var>a</var> and <var>b</var> are {@code DoubleDouble} instances, then:
      *
      *   <blockquote>(a + b)</blockquote>
@@ -825,7 +825,7 @@
      * Multiplies this {@code DoubleDouble} by an other double-double value.
      * The result is stored in this instance.
      *
-     * <div class="section">Implementation</div>
+     * <h4>Implementation</h4>
      * If <var>a</var> and <var>b</var> are {@code DoubleDouble} instances, then:
      *
      *   <blockquote>(a * b)</blockquote>
@@ -1039,7 +1039,7 @@
      * Divides the given double-double value by this {@code DoubleDouble}.
      * The result is stored in this instance.
      *
-     * <div class="section">Implementation</div>
+     * <h4>Implementation</h4>
      * If <var>a</var> and <var>b</var> are {@code DoubleDouble} instances, then we estimate:
      *
      *   <blockquote>(a / b) = (a.value / b.value) + remainder / b</blockquote>
@@ -1115,7 +1115,7 @@
     /**
      * Sets this double-double value to its square root.
      *
-     * <div class="section">Implementation</div>
+     * <h4>Implementation</h4>
      * This method searches for a {@code (r + ε)} value where:
      *
      * <blockquote>(r + ε)²  =  {@linkplain #value} + {@linkplain #error}</blockquote>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
index c6aaa2d..296d78c 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
@@ -413,7 +413,7 @@
      * for the range of {@code double} exponents. We do not put this method in public API because it
      * does not check the argument validity.
      *
-     * <div class="section">Arithmetic notes</div>
+     * <h4>Arithmetic notes</h4>
      * {@code toExp10(getExponent(10ⁿ))} returns <var>n</var> only for {@code n == 0}, and <var>n</var>-1 in all other
      * cases. This is because 10ⁿ == m × 2<sup>exp2</sup> where the <var>m</var> significand is always greater than 1,
      * which must be compensated by a smaller {@code exp2} value such as {@code toExp10(exp2) < n}. Note that if the
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Strings.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Strings.java
index be132c9..9558156 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Strings.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Strings.java
@@ -58,7 +58,7 @@
      * The given separator character is append before the given {@code text} only if the buffer
      * is not empty and at least one {@code text} character is valid.
      *
-     * <div class="section">Relationship with {@code gml:id}</div>
+     * <h4>Relationship with {@code gml:id}</h4>
      * This method may be invoked for building {@code gml:id} values. Strictly speaking this is not appropriate
      * since the {@code xs:ID} type defines valid identifiers as containing only letters, digits, underscores,
      * hyphens, and periods. This differ from Unicode identifier in two ways:
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/UnmodifiableArrayList.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/UnmodifiableArrayList.java
index 00fd659..5de4ced 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/UnmodifiableArrayList.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/UnmodifiableArrayList.java
@@ -43,7 +43,7 @@
  * unmodifiable lists are extensively used in SIS) and implements the {@link CheckedContainer}
  * interface.
  *
- * <div class="section">WARNING! Type safety hole</div>
+ * <h2>WARNING! Type safety hole</h2>
  * The {@link #getElementType()} return type is {@code Class<E>}, but its implementation actually
  * returns {@code Class<? extends E>}. This contract violation is possible because Java arrays are
  * covariant (at the contrary of collections). In order to avoid such contract violation, callers
@@ -85,7 +85,7 @@
      * the caller to instantiate the array explicitly, in order to make sure that the array type is
      * the intended one.</p>
      *
-     * <div class="section">WARNING! Type safety hole</div>
+     * <h4>WARNING! Type safety hole</h4>
      * Callers <strong>must</strong> ensure that the type of array elements in exactly {@code E},
      * not a subtype of {@code E}. See class javadoc for more information.
      *
@@ -100,7 +100,7 @@
      * retained (i.e. the array is <strong>not</strong> cloned). Consequently the given array
      * shall not be modified after construction if the returned list is intended to be immutable.
      *
-     * <div class="section">WARNING! Type safety hole</div>
+     * <h4>WARNING! Type safety hole</h4>
      * Callers <strong>must</strong> ensure that the type of array elements in exactly {@code E},
      * not a subtype of {@code E}. If the caller is okay with {@code List<? extends E>}, then (s)he
      * should use {@link org.apache.sis.util.collection.Containers#unmodifiableList(Object[])} instead.
@@ -127,7 +127,7 @@
      * <p>This method does not check the validity of the given index.
      * The check must be done by the caller.</p>
      *
-     * <div class="section">WARNING! Type safety hole</div>
+     * <h4>WARNING! Type safety hole</h4>
      * Callers <strong>must</strong> ensure that the type of array elements in exactly {@code E},
      * not a subtype of {@code E}. If the caller is okay with {@code List<? extends E>}, then (s)he
      * should use {@link org.apache.sis.util.collection.Containers#unmodifiableList(Object[])} instead.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/package-info.java
index 0daa8cb..8faba8f 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/package-info.java
@@ -23,7 +23,7 @@
  * This package is for internal use by SIS only. Classes in this package
  * may change in incompatible ways in any future version without notice.
  *
- * <div class="section">Note on serialization</div>
+ * <h2>Note on serialization</h2>
  * Developers should avoid putting serializable classes in this package as much as possible,
  * since the serialization forms may be considered as a kind of API contract (depending how
  * much strict we want to be regarding compatibility). This is not always practical however,
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/Appender.java b/core/sis-utility/src/main/java/org/apache/sis/io/Appender.java
index 7525425..249f5f2 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/Appender.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/Appender.java
@@ -37,7 +37,7 @@
  * If needed, this {@code Appender} can be viewed as a synchronized
  * {@link java.io.Writer} by invoking the {@link IO#asWriter(Appendable)} method.
  *
- * <div class="section">Flushing and closing the stream</div>
+ * <h2>Flushing and closing the stream</h2>
  * Subclasses implement the {@link java.io.Flushable} interface only if they
  * hold data in an internal buffer before to send them to the wrapped {@code Appendable}.
  * This is the case of {@link TableAppender} and {@link LineAppender} for instance.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/ClassFormat.java b/core/sis-utility/src/main/java/org/apache/sis/io/ClassFormat.java
index e448655..97d07a3 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/ClassFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/ClassFormat.java
@@ -26,7 +26,7 @@
 /**
  * Used by {@link CompoundFormat} for formatting the name of objects of type {@link Class}.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@link #INSTANCE} can be safely used by many threads without synchronization on the part of the caller.
  * Note that this is specific to {@code ClassFormat} and generally not true for arbitrary {@code Format} classes.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/CompoundFormat.java b/core/sis-utility/src/main/java/org/apache/sis/io/CompoundFormat.java
index 56c8cf3..02b107d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/CompoundFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/CompoundFormat.java
@@ -72,13 +72,13 @@
  *   <tr><td>{@link Class}</td>           <td>(internal)</td>                                       <td></td></tr>
  * </table>
  *
- * <div class="section">Sources and destinations</div>
+ * <h2>Sources and destinations</h2>
  * Since {@code CompoundFormat} may work on larger texts than the usual {@code Format} classes,
  * it defines {@code parse} and {@code format} methods working with arbitrary {@link CharSequence}
  * and {@link Appendable} instances. The standard {@code Format} methods redirect to the above-cited
  * methods.
  *
- * <div class="section">Sub-classing</div>
+ * <h2>Sub-classing</h2>
  * The abstract methods to be defined by subclasses are:
  * <ul>
  *   <li>{@link #getValueType()}</li>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/DefaultFormat.java b/core/sis-utility/src/main/java/org/apache/sis/io/DefaultFormat.java
index 15fe160..cc90aee 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/DefaultFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/DefaultFormat.java
@@ -32,7 +32,7 @@
  * than the {@link java.text} package because the former provide the best guarantees
  * to format all significant digits.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@linkplain #getInstance instance} can be safely used by many threads without synchronization
  * on the part of the caller. Note that this is specific to {@code DefaultFormat} and generally not true
  * for arbitrary {@code Format} classes.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/LineAppender.java b/core/sis-utility/src/main/java/org/apache/sis/io/LineAppender.java
index 70c81d8..e70feff 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/LineAppender.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/LineAppender.java
@@ -42,7 +42,7 @@
  * In addition this class removes trailing {@linkplain Character#isWhitespace(int) whitespaces}
  * before end of lines.
  *
- * <div class="section">How line lengths are calculated</div>
+ * <h2>How line lengths are calculated</h2>
  * Line length are measured in unit of Unicode <cite>code points</cite>. This is usually the same
  * than the number of {@code char} primitive values, but not always. Combining characters are not
  * yet recognized by this class, but future versions may improve on that.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/TabularFormat.java b/core/sis-utility/src/main/java/org/apache/sis/io/TabularFormat.java
index 5df39bf..bbf262f 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/TabularFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/TabularFormat.java
@@ -37,7 +37,7 @@
  *   <li>{@link #setColumnSeparatorPattern(String)}</li>
  * </ul>
  *
- * <div class="section">Note for subclass implementions</div>
+ * <h2>Note for subclass implementions</h2>
  * This base class takes care of splitting a column separator pattern into its components
  * ({@link #beforeFill}, {@link #fillCharacter} and {@link #columnSeparator})
  * for easier usage in {@code format(…)} method implementations.
@@ -209,7 +209,7 @@
      *   <tr><td>{@code '\\'}</td> <td>Escape any of the characters listed in this table.</td></tr>
      * </table>
      *
-     * <div class="section">Restrictions</div>
+     * <h4>Restrictions</h4>
      * <ul>
      *   <li>If present, {@code '?'} shall be the first character in the pattern.</li>
      *   <li>The repeated character (specified inside the pair of brackets) is mandatory.</li>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/io/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/io/package-info.java
index 6a3c880..d830ac1 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/io/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/io/package-info.java
@@ -30,13 +30,13 @@
  * because it can format to an {@link java.lang.Appendable} and for consistency with the {@link org.apache.sis.io.wkt}
  * package.</div>
  *
- * <div class="section">Unicode characters</div>
+ * <h2>Unicode characters</h2>
  * Some formatters in this package make extensive use of Unicode characters. This may produce
  * unexpected results in a Windows console, unless the underlying output stream uses the correct
  * encoding (e.g. {@code new OutputStreamWriter(System.out, "Cp437")}). To display the appropriate
  * code page for a Windows console, type {@code chcp} on the command line.
  *
- * <div class="section">Supplementary Unicode characters</div>
+ * <h2>Supplementary Unicode characters</h2>
  * This package can handle the {@linkplain java.lang.Character#isSupplementaryCodePoint(int)
  * Unicode supplementary characters}.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/CompoundDirectPositions.java b/core/sis-utility/src/main/java/org/apache/sis/math/CompoundDirectPositions.java
index 9d64a43..98b0835 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/CompoundDirectPositions.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/CompoundDirectPositions.java
@@ -27,7 +27,7 @@
  * Each dimension is stored in a separated array. For example this class can view three
  * arrays (x[], y[], and z[]) as a sequence of three-dimensional {@code DirectPosition}.
  *
- * <div class="section">Limitation</div>
+ * <h2>Limitation</h2>
  * This class is also its own iterator. All calls to {@link #iterator()} return the same iterator,
  * and all calls to {@link #next()} return the same {@code DirectPosition} instance. Consequently
  * this class is not suitable for normal use where many objects may iterate over the sequence in
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/DecimalFunctions.java b/core/sis-utility/src/main/java/org/apache/sis/math/DecimalFunctions.java
index a7bc118..65a796e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/DecimalFunctions.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/DecimalFunctions.java
@@ -207,7 +207,7 @@
      * map projection parameters defined by national mapping agencies.
      * </div>
      *
-     * <div class="section">Domain of validity</div>
+     * <h4>Domain of validity</h4>
      * The current implementation can not compute delta for {@code abs(value) < 3E-8} approximately,
      * except for the 0 value which is supported. For any non-zero value closer to zero than the 3E-8
      * threshold, this method returns {@code NaN} because of insufficient algorithm accuracy.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java b/core/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
index bdc73ec..fe6e540 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
@@ -203,7 +203,7 @@
      *
      * If the given vector contains a NaN value, then the result is NaN.
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * In the special case where only one element is different than zero, this method
      * returns directly the {@linkplain Math#abs(double) absolute value} of that element
      * without computing {@code sqrt(v²)}, in order to avoid rounding error. This special case
@@ -271,7 +271,7 @@
      *   <li>If the argument is zero, then the result is -1075.</li>
      * </ul>
      *
-     * <div class="section">Identities</div>
+     * <h4>Identities</h4>
      * For any <var>p</var> values in the [-1075 … 1024] range and <var>value</var> = 2<sup>p</sup>:
      * <ul>
      *   <li><code>getExponent(Math.scalb(1.0, p)) == p</code></li>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/Statistics.java b/core/sis-utility/src/main/java/org/apache/sis/math/Statistics.java
index 5062949..bd5c14b 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/Statistics.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/Statistics.java
@@ -58,7 +58,7 @@
  * The statistics are updated every time an {@link #accept(double)} method is invoked with a non-NaN
  * value.</p>
  *
- * <div class="section">Examples</div>
+ * <h2>Examples</h2>
  * The following examples assume that a <var>y</var>=<var>f</var>(<var>x</var>) function
  * is defined. A simple usage is:
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java b/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
index 8f9dad0..05b4de5 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/Vector.java
@@ -47,7 +47,7 @@
  *   <li><var>y[i]</var> is the measurement of a phenomenon at time <var>x[i]</var>.</li>
  * </ul>
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * Instances of {@code Vector} are usually created by calls to the {@link #create(Object, boolean)} static method.
  * The supplied array is not cloned – changes to the primitive array are reflected in the vector, and vice-versa.
  * Vectors can be a view over a subsection of the given array, or can provide a view of the elements in reverse order,
@@ -59,7 +59,7 @@
  *     // At this point, v.doubleValue(0) is equivalent to (double) array[20].
  * }
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * The methods that are most often used after {@code Vector} creation are {@link #size()} and {@link #doubleValue(int)}
  * or {@link #intValue(int)}. Those methods make abstraction of the underlying data type. For example if the vector is
  * backed by an array of type {@code int[]}, then calls to {@code doubleValue(index)} will:
@@ -113,7 +113,7 @@
      * The given argument is not cloned.
      * Consequently changes in the underlying array are reflected in this vector, and vice-versa.
      *
-     * <div class="section">Unsigned integers</div>
+     * <h4>Unsigned integers</h4>
      * Java has no primitive support for unsigned integers. But some file formats use unsigned integers,
      * which can be simulated in Java by the use of bit masks or methods like {@link Integer#toUnsignedLong(int)}.
      * This {@code Vector} class applies automatically those masks (unless otherwise noticed in method Javadoc)
@@ -178,7 +178,7 @@
      * Note that despite the appearance, this is <strong>not</strong> more accurate than the normal cast,
      * because base 10 is not more privileged in nature than base 2.
      *
-     * <div class="section">When to use</div>
+     * <h4>When to use</h4>
      * This method can be used when there is good reasons to think that the {@code float} numbers were parsed
      * from decimal representations, for example an ASCII file. There is usually no reason to use this method
      * if the values are the result of some numerical computations.
@@ -1337,7 +1337,7 @@
      * or reference to the backing array after this method call (otherwise an unnecessary duplication of data may exist
      * in memory).
      *
-     * <div class="section">When to use</div>
+     * <h4>When to use</h4>
      * It is usually not worth to compress small arrays. Performance-critical arrays may not be compressed neither.
      * This method is best suited for vectors that may potentially be large and for which the cost of fetching
      * values in that vector is small compared to the calculation performed with the values.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Angle.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Angle.java
index a1ded31..36c6e61 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/Angle.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Angle.java
@@ -54,13 +54,13 @@
  *   <li>{@linkplain ElevationAngle Elevation angle} is the angular height from the horizontal plane to an object above the horizon.</li>
  * </ul>
  *
- * <div class="section">Formatting angles</div>
+ * <h2>Formatting angles</h2>
  * The recommended way to format angles is to instantiate an {@link AngleFormat} once, then to
  * reuse it many times. As a convenience, {@code Angle} objects can also be formatted by the
  * {@code "%s"} conversion specifier of {@link Formatter}, but this is less efficient for this
  * class.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class and the {@link Latitude} / {@link Longitude} subclasses are immutable, and thus
  * inherently thread-safe. Other subclasses may or may not be immutable, at implementation choice
  * (see {@link java.lang.Number} for an example of a similar in purpose class having mutable subclasses).
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/ElevationAngle.java b/core/sis-utility/src/main/java/org/apache/sis/measure/ElevationAngle.java
index cae2978..2a8c53e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/ElevationAngle.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/ElevationAngle.java
@@ -29,7 +29,7 @@
  * Both <cite>altitude</cite> and <cite>elevation</cite> words are also used to describe the
  * height in meters above sea level.</div>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/FormattedCharacterIterator.java b/core/sis-utility/src/main/java/org/apache/sis/measure/FormattedCharacterIterator.java
index 87281a6..e192fd6 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/FormattedCharacterIterator.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/FormattedCharacterIterator.java
@@ -35,7 +35,7 @@
  * The attributed character iterator to be returned by {@link Format}
  * implementations in the {@code org.apache.sis.measure} package.
  *
- * <div class="section">Implementation assumption</div>
+ * <h2>Implementation assumption</h2>
  * Every {@code getRunStart(…)} and {@code getRunLimit(…)} methods defined in this class check
  * only for attribute existence, ignoring the actual attribute value. This is a departure from
  * the {@link java.text.AttributedCharacterIterator} contract, but should be invisible to the
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Latitude.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Latitude.java
index 90b313d..ec61167 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/Latitude.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Latitude.java
@@ -45,7 +45,7 @@
  * {@linkplain org.apache.sis.referencing.crs.DefaultGeocentricCRS geocentric}.
  * If the context is unknown, then geodetic latitude can usually be assumed.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (MPO, IRD, Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Longitude.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Longitude.java
index 9a84754..ec19f87 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/Longitude.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Longitude.java
@@ -31,7 +31,7 @@
  * depends on the context, typically specified through the geodetic datum of a
  * {@linkplain org.apache.sis.referencing.crs.DefaultGeographicCRS geographic CRS}.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This final class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (MPO, IRD, Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/MeasurementRange.java b/core/sis-utility/src/main/java/org/apache/sis/measure/MeasurementRange.java
index 35bb207..722c69f 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/MeasurementRange.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/MeasurementRange.java
@@ -41,14 +41,14 @@
  *   <li>{@link #castTo(Class)} for casting the range values to an other type.</li>
  * </ul>
  *
- * <div class="section">Null unit of measurement</div>
+ * <h2>Null unit of measurement</h2>
  * The unit of measurement should not be null, otherwise a {@link NumberRange} should be used
  * instead than {@code MeasurementRange}. Nevertheless this class is tolerant to {@code null}
  * units in order to support situations where a unit of measurement <em>should</em> be specified,
  * but for some reason is unavailable. If the unit of measurement become known at a later stage,
  * it can be specified by a call to {@link #convertTo(Unit)}.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  * Subclasses may or may not be immutable, at implementation choice. But implementers are
  * encouraged to make sure that subclasses remain immutable for more predictable behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/NumberRange.java b/core/sis-utility/src/main/java/org/apache/sis/measure/NumberRange.java
index 80d9f37..733968d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/NumberRange.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/NumberRange.java
@@ -55,7 +55,7 @@
  *   <li>{@link #castTo(Class)} for casting the range values to an other type.</li>
  * </ul>
  *
- * <div class="section">Relationship with standards</div>
+ * <h2>Relationship with standards</h2>
  * {@code NumberRange} is the SIS class closest to the
  * <a href="http://en.wikipedia.org/wiki/Interval_%28mathematics%29">mathematical definition of interval</a>.
  * It is closely related, while not identical, to the ISO 19123 (<cite>Coverage geometry and functions</cite>)
@@ -63,12 +63,12 @@
  * discrete coverages, the {@code NumberRange} class can
  * also be used with continuous coverages.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class and the {@link MeasurementRange} subclasses are immutable, and thus inherently thread-safe.
  * Other subclasses may or may not be immutable, at implementation choice. But implementers are encouraged
  * to make sure that all subclasses remain immutable for more predictable behavior.
  *
- * <div class="section">Shared instances</div>
+ * <h2>Shared instances</h2>
  * <i><b>Note:</b> following is implementation details provided for information purpose.
  * The caching policy may change in any SIS version.</i>
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Range.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Range.java
index 86fe31a..579517d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/Range.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Range.java
@@ -45,7 +45,7 @@
  * Numeric ranges where both endpoints are exclusive are called <cite>open intervals</cite>
  * and are represented by parenthesis, for example "{@code (0 … 256)}".</p>
  *
- * <div class="section">Type and value of range elements</div>
+ * <h2>Type and value of range elements</h2>
  * To be a member of a {@code Range}, the {@code <E>} type defining the range must implement the
  * {@link Comparable} interface. All argument values given to the methods of this class shall be
  * or contain instances of that {@code <E>} type. The type is enforced by parameterized type,
@@ -54,7 +54,7 @@
  * may throw an {@link IllegalArgumentException} if a given argument does not met some constraint
  * beyond the type.
  *
- * <div class="section">Relationship with ISO 19123 definition of range</div>
+ * <h2>Relationship with ISO 19123 definition of range</h2>
  * The ISO 19123 standard (<cite>Coverage geometry and functions</cite>) defines the range as the set
  * (either finite or transfinite) of feature attribute
  * values associated by a function (the coverage) with the
@@ -71,7 +71,7 @@
  * discrete coverages, while typically only
  * numeric ranges can be associated to continuous coverages.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class and the {@link NumberRange} / {@link MeasurementRange} subclasses are immutable,
  * and thus inherently thread-safe. Other subclasses may or may not be immutable, at implementation choice.
  * But implementers are encouraged to make sure that all subclasses remain immutable for more predictable behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/RangeFormat.java b/core/sis-utility/src/main/java/org/apache/sis/measure/RangeFormat.java
index e468fc6..09f41a7 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/RangeFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/RangeFormat.java
@@ -67,7 +67,7 @@
  * If the range to format is an instance of {@link MeasurementRange}, then the
  * {@linkplain Unit unit of measurement} is appended except for empty ranges.
  *
- * <div class="section">Lenient parsing</div>
+ * <h2>Lenient parsing</h2>
  * At parsing time, the above formatting rules are relaxed as below:
  *
  * <ul>
@@ -77,7 +77,7 @@
  *       as well as "{@code {value}}".</li>
  * </ul>
  *
- * <div class="section">Range type and type of range elements</div>
+ * <h2>Range type and type of range elements</h2>
  * The kind of ranges created by the {@link #parse(String) parse(…)} methods is determined
  * by the type of range elements:
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/SexagesimalConverter.java b/core/sis-utility/src/main/java/org/apache/sis/measure/SexagesimalConverter.java
index 850f243..b8e6d27 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/SexagesimalConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/SexagesimalConverter.java
@@ -36,7 +36,7 @@
  * Sexagesimal angles are considered a string representation issue (handled by {@link AngleFormat}) rather than a
  * unit issue. Unfortunately, this pseudo-unit is extensively used in the EPSG database, so we have to support it.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class and all inner classes are immutable, and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
index c8903ae..81c3ac7 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
@@ -57,19 +57,19 @@
  * In addition to the symbols of the <cite>Système international</cite> (SI), this class is also capable to handle
  * some symbols found in <cite>Well Known Text</cite> (WKT) definitions or in XML files.
  *
- * <div class="section">Parsing authority codes</div>
+ * <h2>Parsing authority codes</h2>
  * As a special case, if a character sequence given to the {@link #parse(CharSequence)} method is of the
  * {@code "EPSG:####"} or {@code "urn:ogc:def:uom:EPSG::####"} form (ignoring case and whitespaces),
  * then {@code "####"} is parsed as an integer and forwarded to the {@link Units#valueOfEPSG(int)} method.
  *
- * <div class="section">NetCDF unit symbols</div>
+ * <h2>NetCDF unit symbols</h2>
  * The attributes in netCDF files often merge the axis direction with the angular unit,
  * as in {@code "degrees_east"}, {@code "degrees_north"} or {@code "Degrees North"}.
  * This class ignores those suffixes and unconditionally returns {@link Units#DEGREE} for all axis directions.
  * In particular, the units for {@code "degrees_west"} and {@code "degrees_east"} do <strong>not</strong> have
  * opposite sign. It is caller responsibility to handle the direction of axes associated to netCDF units.
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * {@code UnitFormat} is generally not thread-safe. If units need to be parsed or formatted in different threads,
  * each thread should have its own {@code UnitFormat} instance.
  *
@@ -153,7 +153,7 @@
          * Format unit symbols using a syntax close to the Unified Code for Units of Measure (UCUM) one.
          * The character set is restricted to ASCII. The multiplication operator is the period (“.”).
          *
-         * <div class="section">Modification to UCUM syntax rules</div>
+         * <h4>Modification to UCUM syntax rules</h4>
          * UCUM does not allow floating point numbers in unit terms, so the use of period as an operator
          * should not be ambiguous. However Apache SIS relaxes this restriction in order to support the
          * scale factors commonly found in angular units (e.g. π/180). The meaning of a period in a string
@@ -387,7 +387,7 @@
      * depending on the {@linkplain #getStyle() format style}.
      * If the specified label is already associated to another unit, then the previous association is discarded.
      *
-     * <div class="section">Restriction on character set</div>
+     * <h4>Restriction on character set</h4>
      * Current implementation accepts only {@linkplain Character#isLetter(int) letters},
      * {@linkplain Characters#isSubScript(int) subscripts}, {@linkplain Character#isSpaceChar(int) spaces}
      * (including non-breaking spaces but not CR/LF characters),
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
index d4800d1..0d3181e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
@@ -1656,12 +1656,12 @@
      * The list of symbols supported by this method is implementation-dependent
      * and may change in future SIS versions.
      *
-     * <div class="section">Parsing authority codes</div>
+     * <h4>Parsing authority codes</h4>
      * As a special case, if the given {@code uom} arguments is of the form {@code "EPSG:####"}
      * or {@code "urn:ogc:def:uom:EPSG:####"} (ignoring case and whitespaces), then {@code "####"}
      * is parsed as an integer and forwarded to the {@link #valueOfEPSG(int)} method.
      *
-     * <div class="section">NetCDF unit symbols</div>
+     * <h4>NetCDF unit symbols</h4>
      * The attributes in netCDF files often merge the axis direction with the angular unit,
      * as in {@code "degrees_east"} or {@code "degrees_north"}. This {@code valueOf} method
      * ignores those suffixes and unconditionally returns {@link #DEGREE} for all axis directions.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/setup/OptionKey.java b/core/sis-utility/src/main/java/org/apache/sis/setup/OptionKey.java
index 4e632e1..a76b230 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/setup/OptionKey.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/setup/OptionKey.java
@@ -46,7 +46,7 @@
  * <p>Options are <em>transitive</em>: if a service uses others services for its internal working, the given options
  * may also be given to those dependencies, at implementation choice.</p>
  *
- * <div class="section">Defining new options</div>
+ * <h2>Defining new options</h2>
  * Developers who wish to define their own options can define static constants in a subclass,
  * as in the following example:
  *
@@ -94,8 +94,8 @@
      * If this option is not provided, then the default value is format specific.
      * That default is often, but not necessarily, the {@linkplain TimeZone#getDefault() platform default}.
      *
-     * <div class="warning"><b>Upcoming API change — Java time API</b><br>
-     * The type may be changed to {@link java.time.ZoneId} when Apache SIS will target Java 8.
+     * <div class="warning"><b>Upcoming API change — Java time API</b>:
+     * the type may be changed to {@link java.time.ZoneId} when Apache SIS will target Java 8.
      * This change may be applied in synchronization with GeoAPI 4.0.
      * </div>
      *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/ArgumentChecks.java b/core/sis-utility/src/main/java/org/apache/sis/util/ArgumentChecks.java
index b53c6bf..8fa5fef 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/ArgumentChecks.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/ArgumentChecks.java
@@ -75,7 +75,7 @@
  *       {@link org.apache.sis.measure.Units#ensureScale    ensureScale}.</li>
  * </ul>
  *
- * <div class="section">Method Arguments</div>
+ * <h2>Method Arguments</h2>
  * By convention, the value to check is always the last parameter given to every methods
  * in this class. The other parameters may include the programmatic name of the argument
  * being checked. This programmatic name is used for building an error message localized
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/ArraysExt.java b/core/sis-utility/src/main/java/org/apache/sis/util/ArraysExt.java
index 018b439..bb8d743 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/ArraysExt.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/ArraysExt.java
@@ -38,14 +38,14 @@
  *       if an array is sorted, strictly or not.</li>
  * </ul>
  *
- * <div class="section">Handling of null values</div>
+ * <h2>Handling of null values</h2>
  * Many (but not all) methods in this class are tolerant to null parameter values,
  * sometime under certain conditions. See the method javadoc for details.
  *
  * <p>All methods in this class are tolerant to null elements in arrays.
  * Null and {@linkplain Double#NaN NaN} elements are ignored.</p>
  *
- * <div class="section">Performance consideration</div>
+ * <h2>Performance consideration</h2>
  * The methods listed below are provided as convenience for <strong>casual</strong> use on
  * <strong>small</strong> arrays. For large arrays or for frequent use, consider using the
  * Java collection framework instead.
@@ -2199,7 +2199,7 @@
      * The output array is the union of the input arrays without duplicated values,
      * with elements sorted in strictly increasing order.
      *
-     * <div class="section">Recommended assertions</div>
+     * <h4>Recommended assertions</h4>
      * Callers are encouraged to place the following assertions before calls to this method,
      * using the {@link #isSorted(int[], boolean)} and {@link Arrays#toString(int[])} methods:
      *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java b/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java
index 1e2739f..7b0d8b5 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/CharSequences.java
@@ -29,12 +29,12 @@
  * class duplicate the functionalities already provided in the standard {@link String} class,
  * but works on a generic {@code CharSequence} instance instead than {@code String}.
  *
- * <div class="section">Unicode support</div>
+ * <h2>Unicode support</h2>
  * Every methods defined in this class work on <cite>code points</cite> instead than characters
  * when appropriate. Consequently those methods should behave correctly with characters outside
  * the <cite>Basic Multilingual Plane</cite> (BMP).
  *
- * <div class="section">Policy on space characters</div>
+ * <h2>Policy on space characters</h2>
  * Java defines two methods for testing if a character is a white space:
  * {@link Character#isWhitespace(int)} and {@link Character#isSpaceChar(int)}.
  * Those two methods differ in the way they handle {@linkplain Characters#NO_BREAK_SPACE
@@ -66,7 +66,7 @@
  * distinction about whether the characters are space or not, and ignore all Unicode spaces.
  * The {@link #trimWhitespaces(String)} method defined in this class can be used as an alternative.</p>
  *
- * <div class="section">Handling of null values</div>
+ * <h2>Handling of null values</h2>
  * Most methods in this class accept a {@code null} {@code CharSequence} argument. In such cases
  * the method return value is either a {@code null} {@code CharSequence}, an empty array, or a
  * {@code 0} or {@code false} primitive type calculated as if the input was an empty string.
@@ -112,7 +112,7 @@
     /**
      * Returns a character sequence of the specified length filled with white spaces.
      *
-     * <div class="section">Use case</div>
+     * <h4>Use case</h4>
      * This method is typically invoked for performing right-alignment of text on the
      * {@linkplain java.io.Console console} or other device using monospaced font.
      * Callers compute a value for the {@code length} argument by (<var>desired width</var> - <var>used width</var>).
@@ -1030,12 +1030,12 @@
      * method returns the text unchanged. This is a <cite>"all or nothing"</cite> method:
      * either the fractional part is completely removed, or either it is left unchanged.</p>
      *
-     * <div class="section">Examples</div>
+     * <h4>Examples</h4>
      * This method returns {@code "4"} if the given value is {@code "4."}, {@code "4.0"} or
      * {@code "4.00"}, but returns {@code "4.10"} unchanged (including the trailing {@code '0'}
      * character) if the input is {@code "4.10"}.
      *
-     * <div class="section">Use case</div>
+     * <h4>Use case</h4>
      * This method is useful before to {@linkplain Integer#parseInt(String) parse a number}
      * if that number should preferably be parsed as an integer before attempting to parse
      * it as a floating point number.
@@ -1212,7 +1212,7 @@
      *   <li>Finally ensure that the first character is upper-case.</li>
      * </ol>
      *
-     * <div class="section">Exception to the above rules</div>
+     * <h4>Exception to the above rules</h4>
      * If the given identifier contains only upper-case letters, digits and the {@code '_'} character,
      * then the identifier is returned "as is" except for the {@code '_'} characters which are replaced by {@code '-'}.
      * This work well for identifiers like {@code "UTF-8"} or {@code "ISO-LATIN-1"} for instance.
@@ -1510,7 +1510,7 @@
      * Unicode identifier start} and all remaining characters (if any) are
      * {@linkplain Character#isUnicodeIdentifierPart(int) Unicode identifier parts}.
      *
-     * <div class="section">Relationship with legal XML identifiers</div>
+     * <h4>Relationship with legal XML identifiers</h4>
      * Most legal Unicode identifiers are also legal XML identifiers, but the converse is not true.
      * The most noticeable differences are the ‘{@code :}’, ‘{@code -}’ and ‘{@code .}’ characters,
      * which are legal in XML identifiers but not in Unicode.
@@ -1531,7 +1531,7 @@
      * Note that the ‘{@code _}’ (underscore) character is legal according both Unicode and XML, while spaces,
      * ‘{@code !}’, ‘{@code #}’, ‘{@code *}’, ‘{@code /}’, ‘{@code ?}’ and most other punctuation characters are not.
      *
-     * <div class="section">Usage in Apache SIS</div>
+     * <h4>Usage in Apache SIS</h4>
      * In its handling of {@linkplain org.apache.sis.referencing.ImmutableIdentifier identifiers}, Apache SIS favors
      * Unicode identifiers without {@linkplain Character#isIdentifierIgnorable(int) ignorable} characters since those
      * identifiers are legal XML identifiers except for the above-cited rarely used characters. As a side effect,
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Characters.java b/core/sis-utility/src/main/java/org/apache/sis/util/Characters.java
index f157899..b515a06 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/Characters.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/Characters.java
@@ -305,7 +305,7 @@
      * in this class. Then, Unicode characters can be tested for inclusion in the subset by
      * calling the {@link #contains(int)} method.</p>
      *
-     * <div class="section">Relationship with international standards</div>
+     * <h2>Relationship with international standards</h2>
      * ISO 19162:2015 §B.5.2 recommends to ignore spaces, case and the following characters when comparing two
      * {@linkplain org.apache.sis.referencing.AbstractIdentifiedObject#getName() identified object names}:
      * “{@code _}” (underscore), “{@code -}” (minus sign), “{@code /}” (solidus),
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Classes.java b/core/sis-utility/src/main/java/org/apache/sis/util/Classes.java
index 06a62bb..66d0163 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/Classes.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/Classes.java
@@ -380,7 +380,7 @@
      * implements both the {@link Set} and {@link Collection} interfaces, then the returned
      * array contains only the {@code Set} interface.
      *
-     * <div class="section">Example</div>
+     * <h4>Example</h4>
      * {@code getLeafInterfaces(ArrayList.class, Collection.class)} returns an array of length 1
      * containing {@code List.class}.
      *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java b/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java
index c409796..69168e5 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/ComparisonMode.java
@@ -57,7 +57,7 @@
      * consistent with {@link Object#hashCode()} and be symmetric ({@code A.equals(B)} implies
      * {@code B.equals(A)}).
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * In the SIS implementation, this comparison mode usually have the following
      * characteristics (not always, this is only typical):
      *
@@ -78,7 +78,7 @@
      * consistency, neither comparison symmetry (i.e. {@code A.equals(B)} and {@code B.equals(A)} may
      * return different results if the {@code equals} methods are implemented differently).</p>
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * In the SIS implementation, this comparison mode usually have the following
      * characteristics (not always, this is only typical):
      *
@@ -94,14 +94,14 @@
      * are only informative can be ignored. This comparison mode is typically less strict than
      * {@link #BY_CONTRACT}.
      *
-     * <div class="section">Application to coordinate reference systems</div>
+     * <h4>Application to coordinate reference systems</h4>
      * If the objects being compared are {@link org.opengis.referencing.crs.CoordinateReferenceSystem} instances,
      * then only the properties relevant to the coordinate localization shall be compared.
      * Metadata like the {@linkplain org.apache.sis.referencing.crs.AbstractCRS#getIdentifiers() identifiers}
      * or the {@linkplain org.apache.sis.referencing.crs.AbstractCRS#getDomainOfValidity() domain of validity},
      * which have no impact on the coordinates being calculated, shall be ignored.
      *
-     * <div class="section">Application to coordinate operations</div>
+     * <h4>Application to coordinate operations</h4>
      * If the objects being compared are {@link org.opengis.referencing.operation.MathTransform} instances,
      * then two transforms defined in a different way may be considered equivalent. For example it is possible
      * to define a {@linkplain org.apache.sis.referencing.operation.projection.Mercator Mercator} projection in
@@ -125,7 +125,7 @@
      * Only the attributes relevant to the object functionality are compared, with some tolerance
      * threshold on numerical values.
      *
-     * <div class="section">Application to coordinate operations</div>
+     * <h4>Application to coordinate operations</h4>
      * If two {@link org.opengis.referencing.operation.MathTransform} objects are considered equal according this mode,
      * then for any given identical source position, the two compared transforms shall compute at least approximately
      * the same target position.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/CorruptedObjectException.java b/core/sis-utility/src/main/java/org/apache/sis/util/CorruptedObjectException.java
index e120cf1..c895e51 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/CorruptedObjectException.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/CorruptedObjectException.java
@@ -52,7 +52,7 @@
  *   inconsistency, it may throw this {@code CorruptedObjectException}.</li>
  * </ul>
  *
- * <div class="section">Exception cause</div>
+ * <h2>Exception cause</h2>
  * Since this exception may be thrown an undetermined amount of time after the data corruption, the root cause is
  * often unknown at this point. Sometime a more descriptive exception has been thrown earlier, but may have been
  * ignored by the user.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Disposable.java b/core/sis-utility/src/main/java/org/apache/sis/util/Disposable.java
index 4e560ad..38216ef 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/Disposable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/Disposable.java
@@ -27,7 +27,7 @@
  * or {@linkplain java.sql.Connection#commit() committed to a database},
  * then a {@code close()} method should be used instead.</p>
  *
- * <div class="section">Relationship with {@code Closeable}</div>
+ * <h2>Relationship with {@code Closeable}</h2>
  * Some classes may implement both the {@code Disposeable} and {@link java.io.Closeable} interfaces.
  * While very similar, those two interfaces serve slightly different purposes. The {@code Closeable}
  * interface closes a stream or a connection, but some classes allow the object to be reused with a
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/LenientComparable.java b/core/sis-utility/src/main/java/org/apache/sis/util/LenientComparable.java
index 5c5534b..393b0aa 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/LenientComparable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/LenientComparable.java
@@ -23,7 +23,7 @@
  * compared ignoring some properties (remarks, <i>etc.</i>) that are not relevant to the
  * coordinates calculation.
  *
- * <div class="section">Conditions for equality</div>
+ * <h2>Conditions for equality</h2>
  * <ul>
  *   <li>{@link org.apache.sis.metadata.iso.ISOMetadata} subclasses
  *     <ol>
@@ -123,7 +123,7 @@
      *        <td>Special mode for figuring out why two objects expected to be equal are not.</td></tr>
      * </table>
      *
-     * <div class="section">Conformance to the {@code equals(Object)} method contract</div>
+     * <h4>Conformance to the {@code equals(Object)} method contract</h4>
      * {@link ComparisonMode#STRICT} is the only mode compliant with the {@link Object#equals(Object)} contract.
      * For all other modes <var>m</var>, the comparison is not guaranteed to be <cite>symmetric</cite> neither
      * <cite>transitive</cite>:
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/ObjectConverter.java b/core/sis-utility/src/main/java/org/apache/sis/util/ObjectConverter.java
index 8c9382a..ef57970 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/ObjectConverter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/ObjectConverter.java
@@ -31,7 +31,7 @@
  * {@code apply(S)} does not throw {@link UnconvertibleObjectException} is called the <cite>domain</cite>
  * of this function, regardless of whether the <var>T</var> result is {@code null} or not.</p>
  *
- * <div class="section">Function properties</div>
+ * <h2>Function properties</h2>
  * Some characteristics about the <var>S</var> to <var>T</var> mapping are given by the
  * {@link #properties()} enumeration, together with the {@link #getSourceClass()} and
  * {@link #getTargetClass()} methods. Some possible function properties are:
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/StringBuilders.java b/core/sis-utility/src/main/java/org/apache/sis/util/StringBuilders.java
index b50cdcc..fdce3f6 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/StringBuilders.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/StringBuilders.java
@@ -28,7 +28,7 @@
  * modify directly the content of the provided {@code StringBuilder} instead than creating
  * new objects.
  *
- * <div class="section">Unicode support</div>
+ * <h2>Unicode support</h2>
  * Every methods defined in this class work on <cite>code points</cite> instead than characters
  * when appropriate. Consequently those methods should behave correctly with characters outside
  * the <cite>Basic Multilingual Plane</cite> (BMP).
@@ -262,7 +262,7 @@
      * method does nothing. This is a <cite>"all or nothing"</cite> method: either the fractional
      * part is completely removed, or either it is left unchanged.</p>
      *
-     * <div class="section">Use case</div>
+     * <h4>Use case</h4>
      * This method is useful after a {@linkplain StringBuilder#append(double) double value has
      * been appended to the buffer}, in order to make it appears like an integer when possible.
      *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java b/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java
index 8adf5b4..e502424 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/Utilities.java
@@ -60,7 +60,7 @@
      * If a more lenient comparison allowing slight differences in numerical values is wanted,
      * then {@link #equalsApproximately(Object, Object)} can be used instead.
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * This is a convenience method for the following method call:
      *
      * {@preformat java
@@ -94,7 +94,7 @@
      *       will return an operation close to identity.</li>
      * </ul>
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * This is a convenience method for the following method call:
      *
      * {@preformat java
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Version.java b/core/sis-utility/src/main/java/org/apache/sis/util/Version.java
index 571e9d7..500417b 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/Version.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/Version.java
@@ -34,7 +34,7 @@
  * <p>This class provides methods for performing comparisons of {@code Version} objects where major,
  * minor and revision parts are compared as numbers when possible, or as strings otherwise.</p>
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  * Subclasses may or may not be immutable, at implementation choice. But implementers are
  * encouraged to make sure that subclasses remain immutable for more predictable behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java
index 297c4f5..e453faf 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java
@@ -41,7 +41,7 @@
  *     }
  * }
  *
- * <div class="section">Relationship with {@code java.io.UncheckedIOException}</div>
+ * <h2>Relationship with {@code java.io.UncheckedIOException}</h2>
  * JDK8 provides a {@link java.io.UncheckedIOException} which partially overlaps
  * the purpose of this {@code BackingStoreException}. While Apache SIS still uses
  * {@code BackingStoreException} as a general mechanism for any kind of checked exceptions,
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
index 3342adf..a2b464e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/Cache.java
@@ -101,7 +101,7 @@
  * }
  *
  *
- * <div class="section">Eviction of eldest values</div>
+ * <h2>Eviction of eldest values</h2>
  *
  * <ul>
  *   <li>The <cite>cost</cite> of a value is the value returned by {@link #cost}. The default
@@ -120,7 +120,7 @@
  * overridden, then the total cost is the maximal amount of values to keep by strong references.
  *
  *
- * <div class="section">Circular dependencies</div>
+ * <h2>Circular dependencies</h2>
  *
  * This implementation assumes that there is no circular dependencies (or cyclic graph) between
  * the values in the cache. For example if creating <var>A</var> implies creating <var>B</var>,
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/CacheEntries.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/CacheEntries.java
index edea7ea..2a60f1a 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/CacheEntries.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/CacheEntries.java
@@ -32,7 +32,7 @@
  * <p>This class is not needed for the normal working of {@link Cache}. it is used only if
  * the user wants to see the cache entries through the standard Java collection API.</p>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This class is thread-safe if and only if the {@code Set} given to the constructor is thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/CodeListSet.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/CodeListSet.java
index 61865fd..2dd59bc 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/CodeListSet.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/CodeListSet.java
@@ -36,12 +36,12 @@
  * which must be final. Iterators traverse the elements in the order in which the
  * code list constants are declared.
  *
- * <div class="section">Implementation note</div>
+ * <h2>Implementation note</h2>
  * {@code CodeListSet} is implemented internally by bit vectors for compact and efficient storage.
  * All bulk operations ({@code addAll}, {@code removeAll}, {@code containsAll}) are very quick if
  * their argument is also a {@code CodeListSet} instance.
  *
- * <div class="section">Usage example</div>
+ * <h2>Usage example</h2>
  * The following example creates a set of {@link org.opengis.referencing.cs.AxisDirection}s
  * for a (<var>x</var>,<var>y</var>,<var>z</var>) coordinate system:
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
index 70515fb..a2c36c1 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
@@ -307,7 +307,7 @@
      * A {@link TreeTable.Node} implementation which can store values for a pre-defined list of columns.
      * The list of columns is specified by a {@link TreeTable}, or inherited from a parent node.
      *
-     * <div class="section">Note on the parent node</div>
+     * <h2>Note on the parent node</h2>
      * The value returned by the {@link #getParent()} method is updated automatically when this node
      * is <em>added to</em> or <em>removed from</em> the {@linkplain #getChildren() list of children}
      * of another {@code Node} instance - there is no {@code setParent(Node)} method. Since the parent
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
index 532d73e..b7298cb 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
@@ -41,7 +41,7 @@
  *       inverse of the above converters.</li>
  * </ul>
  *
- * <div class="section">Constraints</div>
+ * <h2>Constraints</h2>
  * <ul>
  *   <li>This map does not support {@code null} keys, since {@code null} is used as a
  *       sentinel value when no mapping from {@linkplain #storage} to {@code this} exists.</li>
@@ -50,7 +50,7 @@
  *   <li>This class is not thread-safe.</li>
  * </ul>
  *
- * <div class="section">Performance considerations</div>
+ * <h2>Performance considerations</h2>
  * This class does not cache any value, since the {@linkplain #storage} map is presumed modifiable.
  * If the storage map is known to be immutable, then sub-classes may consider to cache some values,
  * especially the result of the {@link #size()} method.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
index a048157..8f0f53c 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
@@ -36,7 +36,7 @@
  *       obtain the storage values using the {@link Invertible#inverse} converter.</li>
  * </ul>
  *
- * <div class="section">Constraints</div>
+ * <h2>Constraints</h2>
  * <ul>
  *   <li>This set does not support {@code null} values, since {@code null} is used as a
  *       sentinel value when no mapping from {@linkplain #storage} to {@code this} exists.</li>
@@ -48,7 +48,7 @@
  *       are thread-safe.</li>
  * </ul>
  *
- * <div class="section">Performance considerations</div>
+ * <h2>Performance considerations</h2>
  * This class does not cache any value, since the {@linkplain #storage} set is presumed modifiable.
  * If the storage set is known to be immutable, then sub-classes may consider to cache some values,
  * especially the result of the {@link #size()} method.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/RangeSet.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/RangeSet.java
index 2be9891..6b80f8b 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/RangeSet.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/RangeSet.java
@@ -55,7 +55,7 @@
  *       ranges may in some circumstances <strong>increase</strong> the size of this set.</li>
  * </ul>
  *
- * <div class="section">Inclusive or exclusive endpoints</div>
+ * <h2>Inclusive or exclusive endpoints</h2>
  * {@code RangeSet} requires that {@link Range#isMinIncluded()} and {@link Range#isMaxIncluded()}
  * return the same values for all instances added to this set. Those values need to be specified
  * at construction time. If a user needs to store mixed kind of ranges, then he needs to subclass
@@ -67,7 +67,7 @@
  * or half-open. This limitation exists because supporting open intervals implies that the internal array
  * shall support duplicated values.</div>
  *
- * <div class="section">Extensions to <code>SortedSet</code> API</div>
+ * <h2>Extensions to <code>SortedSet</code> API</h2>
  * This class contains some methods not found in standard {@link SortedSet} API.
  * Some of those methods look like {@link java.util.List} API, in that they work
  * with the index of a {@code Range} instance in the sequence of ranges returned
@@ -88,7 +88,7 @@
  *   <li>{@link #trimToSize()} frees unused space.</li>
  * </ul>
  *
- * <div class="section">Implementation note</div>
+ * <h2>Implementation note</h2>
  * For efficiency reasons, this set stores the range values in a Java array of primitive type if
  * possible. The {@code Range} instances given in argument to the {@link #add(Range)} method are
  * not retained by this class. Ranges are recreated during iterations by calls to the
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
index 3f2da9d..3ae78bf 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
@@ -51,7 +51,7 @@
  *     }
  * }
  *
- * <div class="section">Identity comparisons and serialization</div>
+ * <h2>Identity comparisons and serialization</h2>
  * This base class relies on <cite>identity comparisons</cite> instead than defining the
  * {@code equals(Object)} method, because the {@linkplain #getElementType() element type}
  * is not a sufficient criterion for differentiating the columns (many columns have values
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeNodeList.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeNodeList.java
index 98071a3..ee6a520 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeNodeList.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeNodeList.java
@@ -41,7 +41,7 @@
  * <p>Subclasses need to define the {@link #setParentOf(TreeTable.Node, int)} method
  * because the way to set the parent is specific to the node implementation:</p>
  *
- * <div class="section">Implementation note</div>
+ * <h2>Implementation note</h2>
  * We do not extend {@link java.util.ArrayList} because:
  * <ul>
  *   <li>We want to use identity comparisons rather than {@link Object#equals(Object)}.</li>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTable.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTable.java
index 06fde02..c359a84 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTable.java
@@ -252,8 +252,8 @@
          * and for avoiding infinite recursivity when comparing the children.
          * A third reason is given in the <cite>purpose</cite> example below.
          *
-         * <div class="note"><b>Purpose of this method: example with ISO metadata</b><br>
-         * Consider the following tree made of ISO 19115 metadata objects: a platform containing a list of instruments,
+         * <div class="note"><b>Purpose of this method: example with ISO metadata</b>:
+         * consider the following tree made of ISO 19115 metadata objects: a platform containing a list of instruments,
          * and an instrument containing a reference to the platform on which the instrument is installed. In this example,
          * nodes 2 and 4 contain a reference to the same {@code Platform} instance, so we have a cyclic graph:
          *
@@ -279,7 +279,7 @@
          * including the list of children, is fully determined by those metadata. An identity comparison
          * (with {@code ==}) is sufficient for the purpose of avoiding infinite recursivity.</p></div>
          *
-         * <div class="section">Flexibility in implementations</div>
+         * <h4>Flexibility in implementations</h4>
          * The above list specifies minimal conditions that must be true when two nodes are considered equal.
          * Implementations should not relax those conditions, but are free to make them more restrictive.
          * In particular, many implementations will require that the two nodes are instances of the same class.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTableFormat.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTableFormat.java
index 1e2cd2f..b45177a 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTableFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTableFormat.java
@@ -86,7 +86,7 @@
  * This representation can be printed to the {@linkplain java.io.Console#writer() console output}
  * (for example) if the stream uses a monospaced font and supports Unicode characters.
  *
- * <div class="section">Customization</div>
+ * <h2>Customization</h2>
  * Some formatting characteristics (indentation width, column where to draw the vertical line
  * below nodes) can be modified by calls to the setter methods defined in this formatter.
  * In particular, the dots joining the node labels to their values can be specified by the
@@ -95,7 +95,7 @@
  * then insert the {@code "……"} string, repeat the {@code '…'} character as many time as needed
  * (may be zero), and finally insert a space"</cite>.
  *
- * <div class="section">Safety against infinite recursivity</div>
+ * <h2>Safety against infinite recursivity</h2>
  * Some {@code TreeTable} implementations generate the nodes dynamically as wrappers around Java objects.
  * Such Java objects may contain cyclic associations (<var>A</var> contains <var>B</var> contains <var>C</var>
  * contains <var>A</var>), which result in a tree of infinite depth. Some examples can been found in ISO 19115
@@ -386,7 +386,7 @@
      * This method can parse the trees created by the {@code format(…)} methods
      * defined in this class.
      *
-     * <div class="section">Parsing rules</div>
+     * <h4>Parsing rules</h4>
      * <ul>
      *   <li>Each node shall be represented by a single line made of two parts, in that order:
      *     <ol>
@@ -402,7 +402,7 @@
      *   <li>Parsing stops at first empty line (ignoring whitespaces), or at the end of the given text.</li>
      * </ul>
      *
-     * <div class="section">Error index</div>
+     * <h4>Error index</h4>
      * If the given text does not seem to be a tree table, then this method returns {@code null}.
      * Otherwise if parsing started but failed, then:
      *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTables.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTables.java
index 8d650b2..8c06159 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTables.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TreeTables.java
@@ -37,7 +37,7 @@
  * <p>The remaining of this class javadoc contains example codes placed in public domain.
  * Developers can copy and adapt those examples as they see fit.</p>
  *
- * <div class="section">Example 1: Reduce the depth of a tree</div>
+ * <h2>Example 1: Reduce the depth of a tree</h2>
  * For every branch containing exactly one child, the following method concatenates in-place
  * that branch and its child together. This method can be used for simplifying depth trees into
  * something less verbose. For example given the tree on the left side, this method transforms
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakHashSet.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakHashSet.java
index c4b404f..83e6566 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakHashSet.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakHashSet.java
@@ -43,7 +43,7 @@
  * the static {@code hashCode(a)} and {@code equals(a1, a2)} methods defined in the {@link Arrays}
  * class.</p>
  *
- * <div class="section">Optimizing memory use in factory implementations</div>
+ * <h2>Optimizing memory use in factory implementations</h2>
  * The {@code WeakHashSet} class has a {@link #get(Object)} method that is not part of the
  * {@link java.util.Set} interface. This {@code get} method retrieves an entry from this set
  * that is equals to the supplied object. The {@link #unique(Object)} method combines a
@@ -62,7 +62,7 @@
  *
  * Thus, {@code WeakHashSet} can be used inside a factory to prevent creating duplicate immutable objects.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code WeakHashSet} instance can be safely used by many threads without synchronization on the part of
  * the caller. But if a sequence of two or more method calls need to appear atomic from other threads perspective,
  * then the caller can synchronize on {@code this}.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakValueHashMap.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakValueHashMap.java
index 119bbd3..dbd511c 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakValueHashMap.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/WeakValueHashMap.java
@@ -68,7 +68,7 @@
  * <p>{@code WeakValueHashMap} works with array keys as one would expect. For example arrays of {@code int[]} are
  * compared using the {@link java.util.Arrays#equals(int[], int[])} method.</p>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code WeakValueHashMap} instance can be safely used by many threads without synchronization on the part
  * of the caller. But if a sequence of two or more method calls need to appear atomic from other threads perspective,
  * then the caller can synchronize on {@code this}.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java
index f2e333b..1600164 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java
@@ -34,7 +34,7 @@
  * is the string in the current {@linkplain Locale#getDefault() system-wide default locale}.
  * The {@linkplain Comparable natural ordering} is defined by the value returned by {@link #toString()}.</p>
  *
- * <div class="section">Substituting a free text by a code list</div>
+ * <h2>Substituting a free text by a code list</h2>
  * The ISO standard allows to substitute some character strings in the <cite>"free text"</cite> domain
  * by a {@link org.opengis.util.CodeList} value. This can be done with:
  *
@@ -56,12 +56,12 @@
      * if this string has not yet been determined. This is the default string returned by
      * {@link #toString()} and others methods from the {@link CharSequence} interface.
      *
-     * <div class="section">Thread safety</div>
+     * <h4>Thread safety</h4>
      * For thread safety this field shall either be read and written in a synchronized block,
      * or be fixed at construction time and never changed after than point. All other usages
      * are prohibited.
      *
-     * <div class="section">Serialization</div>
+     * <h4>Serialization</h4>
      * This field is not serialized because serialization is often used for data transmission
      * between a server and a client, and the client may not use the same locale than the server.
      * We want the locale to be examined again on the client side.
@@ -118,14 +118,14 @@
      * then some fallback locale is used. The fallback locale is implementation-dependent, and
      * is not necessarily the same than the default locale used by the {@link #toString()} method.
      *
-     * <div class="section">Handling of <code>Locale.ROOT</code> argument value</div>
+     * <h4>Handling of <code>Locale.ROOT</code> argument value</h4>
      * {@link Locale#ROOT} can be given to this method for requesting a "unlocalized" string,
      * typically some programmatic values like enumerations or identifiers. While identifiers
      * often look like English words, {@code Locale.ROOT} is not considered synonymous to
      * {@link Locale#ENGLISH} because the values may differ in the way numbers and dates are
      * formatted (e.g. using the ISO 8601 standard for dates instead than English conventions).
      *
-     * <div class="section">Handling of <code>null</code> argument value</div>
+     * <h4>Handling of <code>null</code> argument value</h4>
      * The {@code Locale.ROOT} constant is new in Java 6. Some other libraries designed for Java 5
      * use the {@code null} value for "unlocalized" strings. Apache SIS accepts {@code null} value
      * for inter-operability with those libraries. However the behavior is implementation dependent:
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultInternationalString.java
index 7c108c2..4514681 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultInternationalString.java
@@ -46,7 +46,7 @@
  * This behavior is a compromise between making constructions easier, and being suitable for
  * use in immutable objects.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * Instances of {@code DefaultInternationalString} are thread-safe. While those instances are not strictly immutable,
  * SIS typically references them as if they were immutable because of their <cite>add-only</cite> behavior.
  *
@@ -250,7 +250,7 @@
      * was requested but not found, then this method looks for the {@code "fr"} locale.
      * The {@linkplain Locale#ROOT root locale} is tried last.
      *
-     * <div class="section">Handling of {@code Locale.ROOT} argument value</div>
+     * <h4>Handling of {@code Locale.ROOT} argument value</h4>
      * {@link Locale#ROOT} can be given to this method for requesting a "unlocalized" string,
      * typically some programmatic values like enumerations or identifiers.
      * While identifiers often look like English words, {@code Locale.ROOT} is not considered
@@ -271,7 +271,7 @@
      *       an arbitrary string.</li>
      * </ul>
      *
-     * <div class="section">Handling of {@code null} argument value</div>
+     * <h4>Handling of {@code null} argument value</h4>
      * In the default implementation, the {@code null} locale is handled as a synonymous of
      * {@code Locale.ROOT}. However subclasses are free to use a different fallback. Client
      * code are encouraged to specify only non-null values for more determinist behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/iso/ResourceInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/iso/ResourceInternationalString.java
index 98a3d16..2cc2bda 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/iso/ResourceInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/iso/ResourceInternationalString.java
@@ -55,7 +55,7 @@
  * If needed, users can gain more control by overriding the {@link #getBundle(Locale)} method.
  * </div>
  *
- * <div class="section">Class loaders</div>
+ * <h2>Class loaders</h2>
  * Developers can specify explicitly the {@link ClassLoader} to use be overriding the
  * {@link #getBundle(Locale)} method. This is recommended if the running environment
  * loads modules in isolated class loaders, as OSGi does for instance.
@@ -64,14 +64,14 @@
  * We do not provide {@code ClassLoader} argument in the constructor of this class because class loaders
  * can often be hard-coded (thus avoiding the cost of an extra field) and are usually not serializable.</div>
  *
- * <div class="section">Apache SIS resources</div>
+ * <h2>Apache SIS resources</h2>
  * Apache SIS has its own resources mechanism, built on top of the standard {@code ResourceBundle}
  * with the addition of type safety and optional arguments to be formatted in the localized string.
  * Those resource bundles provide {@code formatInternational(int, …)} static methods for creating
  * international strings with the same functionality than this {@code ResourceInternationalString}.
  * See {@code org.apache.sis.util.resources} for more information.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe if the bundles created by {@link #getBundle(Locale)}
  * is also immutable. Subclasses may or may not be immutable, at implementation choice. But implementers are
  * encouraged to make sure that subclasses remain immutable for more predictable behavior.
@@ -123,7 +123,7 @@
      * bundle from the name given at {@linkplain #ResourceInternationalString construction time}.
      * Subclasses can override this method if they need to fetch the bundle in an other way.
      *
-     * <div class="section">Class loaders</div>
+     * <h4>Class loaders</h4>
      * By default, this method loads the resources using the caller's class loader.
      * Subclasses can override this method in order to specify a different class loader.
      * For example, the code below works well if {@code MyResource} is a class defined
@@ -152,7 +152,7 @@
      * {@code locale}, then this method searches for a string in an other locale as
      * specified in the {@link ResourceBundle} class description.
      *
-     * <div class="section">Handling of <code>null</code> argument value</div>
+     * <h4>Handling of <code>null</code> argument value</h4>
      * In the default implementation, the {@code null} locale is handled as a synonymous of
      * {@code Locale.ROOT}. However subclasses are free to use a different fallback. Client
      * code are encouraged to specify only non-null values for more determinist behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/iso/SimpleInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/iso/SimpleInternationalString.java
index 76c4c30..a6cb258 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/iso/SimpleInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/iso/SimpleInternationalString.java
@@ -29,12 +29,12 @@
  * For such a particular case, this implementation is more effective than
  * other implementations provided in this package.
  *
- * <div class="section">Instantiation</div>
+ * <h2>Instantiation</h2>
  * If the characters sequence to wrap is known to be a {@code String} instance, then
  * the {@link #SimpleInternationalString(String)} constructor is okay. Otherwise use
  * the {@link Types#toInternationalString(CharSequence)} method.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This class is immutable and thus inherently thread-safe.
  * Subclasses may or may not be immutable, at implementation choice. But implementers are
  * encouraged to make sure that subclasses remain immutable for more predictable behavior.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerAdapter.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerAdapter.java
index d46bc77..bd6359e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerAdapter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerAdapter.java
@@ -45,7 +45,7 @@
  * don't work with {@link LogRecord}, and sometime provides nothing else than convenience methods
  * equivalent to {@link #severe(String) severe} … {@link #finest(String) finest}.</p>
  *
- * <div class="section">Restrictions</div>
+ * <h2>Restrictions</h2>
  * Because the configuration is expected to be fully controlled by the external logging
  * framework, every configuration methods inherited from {@link Logger} are disabled:
  *
@@ -70,7 +70,7 @@
  * The adapters can be created, garbage-collected and recreated again while preserving their
  * behavior since their configuration is entirely contained in the external logging framework.
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * This logger is always created without resource bundles. Localizations shall be done through
  * explicit calls to {@code logrb} or {@link #log(LogRecord)} methods. This is sufficient for
  * SIS needs, which performs all localizations through the later. Note that those methods
@@ -78,7 +78,7 @@
  * adapter localizes and formats records immediately instead of letting the {@linkplain Handler}
  * performs this work only if needed.
  *
- * <div class="section">Logging levels</div>
+ * <h2>Logging levels</h2>
  * If a log record {@linkplain Level level} is not one of the predefined ones, then this class
  * maps to the first level below the specified one. For example if a log record has some level
  * between {@link Level#FINE FINE} and {@link Level#FINER FINER}, then the {@link #finer finer}
@@ -154,7 +154,7 @@
     /**
      * Returns {@code true} if the specified level is loggable.
      *
-     * <div class="section">Implementation tip</div>
+     * <h4>Implementation tip</h4>
      * Given that {@link Level#intValue} for all predefined levels are documented in the {@link Level}
      * specification and are multiple of 100, given that integer divisions are rounded toward zero and
      * given rule documented in this <a href="#skip-navbar_top">class javadoc</a>, then logging levels
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerFactory.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerFactory.java
index aacbf3e..7bdddfd 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerFactory.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/LoggerFactory.java
@@ -37,7 +37,7 @@
  * The {@link #getLogger(String)} method shall return some {@link Logger} subclass
  * (typically {@link LoggerAdapter}) which forwards directly all log methods to the other framework.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * This base class is safe for multi-threads usage. Subclasses registered in {@code META-INF/services/}
  * shall make sure that any overridden methods remain safe to call from multiple threads.
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
index 2fc3afd..6a9cd42 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
@@ -115,7 +115,7 @@
      * If the given {@code factory} argument is {@code null} (the default),
      * then the standard Logging framework will be used.
      *
-     * <div class="section">Limitation</div>
+     * <h4>Limitation</h4>
      * SIS classes typically declare a logger constant like below:
      *
      * {@preformat java
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java
index 78398e5..a473629 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/MonolineFormatter.java
@@ -75,7 +75,7 @@
  *       without package (e.g. {@code "NetcdfStore"}).</li>
  * </ul>
  *
- * <div class="section">Configuration from {@code logging.properties}</div>
+ * <h2>Configuration from {@code logging.properties}</h2>
  * The format can also be set from the {@code jre/lib/logging.properties} file.
  * For example, user can cut and paste the following properties into {@code logging.properties}:
  *
@@ -107,7 +107,7 @@
  *     java.util.logging.ConsoleHandler.level = FINE
  * }
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code MonolineFormatter} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses should make sure that any overridden methods remain safe to call
  * from multiple threads.
@@ -299,7 +299,7 @@
     /**
      * Constructs a {@code MonolineFormatter} configured for the given handler.
      *
-     * <div class="section">Auto-configuration from the handler</div>
+     * <h4>Auto-configuration from the handler</h4>
      * Formatters are often associated to a particular handler. If this handler is known, giving it at
      * construction time can help this formatter to configure itself. This handler is only a hint - it
      * will not be modified, and no reference to that handler will be kept by this constructor.
@@ -1012,7 +1012,7 @@
      * The current implementation does not check for duplicated {@code ConsoleHandler} instances,
      * and does not check if any child logger has a {@code ConsoleHandler}.</div>
      *
-     * <div class="section">Specifying a log level</div>
+     * <h4>Specifying a log level</h4>
      * This method can opportunistically set the handler level. If the given level is non-null,
      * then the {@link ConsoleHandler} using the {@code MonolineFormatter} will be set to that level.
      * This is mostly a convenience for temporary increase of logging verbosity for debugging purpose.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/PerformanceLevel.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/PerformanceLevel.java
index da6f43b..cd6a3b9 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/PerformanceLevel.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/PerformanceLevel.java
@@ -35,7 +35,7 @@
  * disabled by default, and enabling them imply enabling configuration logging too. This is
  * done that way because the configuration typically have a significant impact on performance.</p>
  *
- * <div class="section">Enabling performance logging</div>
+ * <h2>Enabling performance logging</h2>
  * Performance logging can be enabled in various ways. Among others:
  *
  * <ul>
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/package-info.java
index 31d6ac6..fd43f62 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/package-info.java
@@ -29,7 +29,7 @@
  *       records on single line with colors, for easier reading on the console output.</li>
  * </ul>
  *
- * <div class="section">Choosing a logging framework</div>
+ * <h2>Choosing a logging framework</h2>
  * The SIS project uses the standard {@link java.util.logging.Logger} API for its logging,
  * but this package allows redirection of logging messages to some other frameworks like
  * <a href="http://logging.apache.org/log4j/">Log4J</a>.
@@ -43,7 +43,7 @@
  *   <li>Any other JAR registering a {@link org.apache.sis.util.logging.LoggerFactory} implementation.</li>
  * </ul>
  *
- * <div class="section">Note for SIS developers</div>
+ * <h2>Note for SIS developers</h2>
  * All SIS code should fetch their logger through a call to our custom
  * {@link org.apache.sis.util.logging.Logging#getLogger(String)} method instead than
  * the standard {@link java.util.logging.Logger#getLogger(String)} method. This is necessary in
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
index 80a841c..520093d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors.java
@@ -27,7 +27,7 @@
 /**
  * Locale-dependent resources for error messages.
  *
- * <div class="section">Argument order convention</div>
+ * <h2>Argument order convention</h2>
  * This resource bundle applies the same convention than JUnit: for every {@code format(…)} method,
  * the first arguments provide information about the context in which the error occurred (e.g. the
  * name of a method argument or the range of valid values), while the erroneous values that caused
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java b/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java
index eeea184..4492e67 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java
@@ -68,7 +68,7 @@
  *   <li>{@link Class} and {@link Throwable} instances are summarized.</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code IndexedResourceBundle} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses should make sure that any overridden methods remain safe to call from
  * multiple threads.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/ResourceInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/resources/ResourceInternationalString.java
index e13d4b7..7d5d79a 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/ResourceInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/ResourceInternationalString.java
@@ -35,7 +35,7 @@
  * {@link IndexedResourceBundle}. Compared to the public class, this specialization works
  * with integer resource keys and accepts arguments.
  *
- * <div class="section">Immutability and thread safety</div>
+ * <h2>Immutability and thread safety</h2>
  * This base class is immutable and thus inherently thread-safe.
  *
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/util/resources/package-info.java
index 11bba0d..a147b2c 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/package-info.java
@@ -47,7 +47,7 @@
  * necessary. This avoid the unfortunate confusion documented in the warning section of
  * {@link java.text.MessageFormat} javadoc.
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * All {@link org.apache.sis.util.resources.IndexedResourceBundle} subclasses provide a
  * {@code getResources(Locale)} static method. It can be used for fetching localized strings
  * as below:
diff --git a/core/sis-utility/src/test/java/org/apache/sis/test/package-info.java b/core/sis-utility/src/test/java/org/apache/sis/test/package-info.java
index f7979ee..2899f39 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/test/package-info.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/test/package-info.java
@@ -22,7 +22,7 @@
  * {@link org.opengis.test.Assert} (which itself extends the JUnit {@link org.junit.Assert} class)
  * with the addition of assertion methods commonly used in SIS tests.
  *
- * <div class="section">Outputs configuration</div>
+ * <h2>Outputs configuration</h2>
  * By default, successful tests do not produce any output. However it is possible to ask for
  * verbose outputs, which is sometime useful for debugging purpose. This behavior is controlled
  * from the command line by defining {@linkplain java.lang.System#getProperties() system properties}
diff --git a/pom.xml b/pom.xml
index 87cb5af..c28b1e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -624,7 +624,7 @@
             <configuration>
               <rules>
                 <requireJavaVersion>
-                  <version>11</version>
+                  <version>13</version>
                 </requireJavaVersion>
               </rules>
             </configuration>
diff --git a/profiles/sis-french-profile/src/main/java/org/apache/sis/profile/france/package-info.java b/profiles/sis-french-profile/src/main/java/org/apache/sis/profile/france/package-info.java
index 75bdd84..b2c49e2 100644
--- a/profiles/sis-french-profile/src/main/java/org/apache/sis/profile/france/package-info.java
+++ b/profiles/sis-french-profile/src/main/java/org/apache/sis/profile/france/package-info.java
@@ -18,7 +18,7 @@
 /**
  * French extensions defined by the <cite>Association Française de Normalisation</cite> (AFNOR).
  *
- * <div class="section">Historical note</div>
+ * <h2>Historical note</h2>
  * The French profile also added two properties to the ISO 19115:2003 standard.
  * Equivalent properties have been added to the 2013 revision of ISO 19115,
  * so the French profile should not be needed anymore except for compatibility with oldest specifications.
diff --git a/src/main/javadoc/sis.css b/src/main/javadoc/sis.css
index 9323af4..1710847 100644
--- a/src/main/javadoc/sis.css
+++ b/src/main/javadoc/sis.css
@@ -139,12 +139,21 @@
  * Note or examples.
  */
 div.note {
-  color:     #353833;
-  font-size:   small;
-  margin-left:  40px;
-  margin-right: 40px;
-  margin-top:    9px;
-  margin-bottom: 9px;
+  color:      #353833;
+  margin-left:   40px;
+  margin-right:  40px;
+  margin-top:     9px;
+  margin-bottom:  9px;
+  text-align: justify;
+}
+
+div.note:before {
+  color:     green;
+  position:  relative;
+  float:     left;
+  left:      -28px;
+  width:     0;
+  content:   "🛈";
 }
 
 
@@ -173,21 +182,6 @@
 
 
 /*
- * Formatting of section headers
- */
-div.section {
-  font-size:    15px;
-  font-weight:  bold;
-  margin-top:   21px;
-  margin-bottom: 3px;
-}
-
-div.description div.section {
-  font-size:  18px;
-  margin-top: 30px;
-}
-
-/*
  * Bullet and ordered lists. Put some space before and after the list.
  * Lists of the "verbose" class also have some space betweem items.
  */
diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStoreProvider.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStoreProvider.java
index 18302ef..b54e628 100644
--- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStoreProvider.java
+++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStoreProvider.java
@@ -32,7 +32,7 @@
  * The provider of {@link LandsatStore} instances. Given a {@link StorageConnector} input,
  * this class tries to instantiate a {@code LandsatStore}.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code LandsatStoreProvider} instance can be safely used by many threads without synchronization on
  * the part of the caller. However the {@link LandsatStore} instances created by this factory are not thread-safe.
  *
diff --git a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
index ce1e8fb..684b5d4 100644
--- a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
+++ b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
@@ -530,7 +530,7 @@
      * Creates a new CRS from the given {@literal Proj.4} definition.
      * The {@code "Proj4:"} prefix (ignoring case), if present, is ignored.
      *
-     * <div class="section">Apache SIS extension</div>
+     * <h4>Apache SIS extension</h4>
      * Proj.4 unconditionally requires 3 letters for the {@code "+axis="} parameter — for example {@code "neu"} for
      * <cite>North</cite>, <cite>East</cite> and <cite>Up</cite> respectively — regardless the number of dimensions
      * in the CRS to create. Apache SIS makes the vertical direction optional:
diff --git a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java
index 960f532..2f3a633 100644
--- a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java
+++ b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java
@@ -51,7 +51,7 @@
  *     PARAMETER["dstdefn", "+proj=…"]]
  * }
  *
- * <div class="section">Note on Proj.4 definition strings</div>
+ * <h2>Note on Proj.4 definition strings</h2>
  * Proj.4 unconditionally requires 3 letters for the {@code "+axis="} parameter — for example {@code "neu"} for
  * <cite>North</cite>, <cite>East</cite> and <cite>Up</cite> respectively — regardless the number of dimensions
  * in the CRS to create. Apache SIS makes the vertical direction optional in order to specify whether the CRS to
@@ -75,7 +75,7 @@
  * syntax are not necessarily compliant with EPSG definitions. In particular, the axis order is often different.
  * Units of measurement may also differ.
  *
- * <div class="section">Installation</div>
+ * <h2>Installation</h2>
  * The Proj.4 library needs to be reachable on a platform-dependent library path.
  * For example the operating system may search in {@code /usr/lib}, {@code /opt/local/lib} and other directories.
  * One of those directories shall contain the {@code proj} or {@code libproj} file with platform-specific suffix
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStoreProvider.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStoreProvider.java
index 1bc4d5a..4d1881b 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStoreProvider.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStoreProvider.java
@@ -35,7 +35,7 @@
  * The provider of {@link GeoTiffStore} instances. Given a {@link StorageConnector} input,
  * this class tries to instantiate a {@code GeoTiffStore}.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code GeoTiffStoreProvider} instance can be safely used by many threads without synchronization on
  * the part of the caller. However the {@link GeoTiffStore} instances created by this factory are not thread-safe.
  *
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
index e2d9ab5..6c92d9e 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
@@ -45,7 +45,7 @@
  * Helper class for creating a {@link GridGeometry} from GeoTIFF data.
  * The coordinate reference system part is built by {@link CRSBuilder}.
  *
- * <div class="section">Pixel center versus pixel corner</div>
+ * <h2>Pixel center versus pixel corner</h2>
  * The policy about whether the conversion map pixel corner or pixel center if GeoTIFF files does not seem
  * totally clear. But the practice at least with GDAL seems to consider the following as equivalent:
  *
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
index 4e07595..5f55a92 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
@@ -127,7 +127,7 @@
      * <p><b>Note:</b>
      * the {@link #tileHeight} attribute is named {@code TileLength} in TIFF specification.</p>
      *
-     * <div class="section">Strips considered as tiles</div>
+     * <h4>Strips considered as tiles</h4>
      * The TIFF specification also defines a {@code RowsPerStrip} tag, which is equivalent to the
      * height of tiles having the same width than the image. While the TIFF specification handles
      * "tiles" and "strips" separately, Apache SIS handles strips as a special kind of tiles where
@@ -145,7 +145,7 @@
      * component plane are stored first, followed by all the offsets for the second component plane,
      * and so on.</p>
      *
-     * <div class="section">Strips considered as tiles</div>
+     * <h4>Strips considered as tiles</h4>
      * The TIFF specification also defines a {@code StripOffsets} tag, which contains the byte offset
      * of each strip. In Apache SIS implementation, strips are considered as a special kind of tiles
      * having a width equals to {@link #imageWidth}.
@@ -156,7 +156,7 @@
      * For each tile, the number of (compressed) bytes in that tile.
      * See {@link #tileOffsets} for a description of how the byte counts are ordered.
      *
-     * <div class="section">Strips considered as tiles</div>
+     * <h4>Strips considered as tiles</h4>
      * The TIFF specification also defines a {@code RowsPerStrip} tag, which is the number
      * of bytes in the strip after compression. In Apache SIS implementation, strips are
      * considered as a special kind of tiles having a width equals to {@link #imageWidth}.
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index ddb865c..1ad3631 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@ -98,7 +98,7 @@
  * {@linkplain AttributeNames#LONGITUDE longitude} and {@linkplain AttributeNames#LATITUDE latitude}
  * resolutions are often more accurate in that group.
  *
- * <div class="section">Known limitations</div>
+ * <h2>Known limitations</h2>
  * <ul>
  *   <li>{@code "degrees_west"} and {@code "degrees_south"} units not correctly handled.</li>
  *   <li>Units of measurement not yet declared in the {@link Band} elements.</li>
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java
index daee428..f383026 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStoreProvider.java
@@ -56,7 +56,7 @@
  * on the classpath, then this class tries to instantiate a {@code NetcdfStore} backed by
  * the UCAR library.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code NetcdfStoreProvider} instance can be safely used by many threads without synchronization on
  * the part of the caller. However the {@link NetcdfStore} instances created by this factory are not thread-safe.
  *
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/package-info.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/package-info.java
index fd04b6c..fc4605e 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/package-info.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/package-info.java
@@ -28,7 +28,7 @@
  * The netCDF attributes recognized by this package are listed in the
  * {@link org.apache.sis.storage.netcdf.AttributeNames} class.
  *
- * <div class="section">Note on the definition of terms</div>
+ * <h2>Note on the definition of terms</h2>
  * The UCAR library sometime uses the same words than the ISO/OGC standards for different things.
  * In particular the words <cite>"domain"</cite> and <cite>"range"</cite> can be applied to arbitrary functions,
  * and the UCAR library chooses to apply it to the function that converts grid indices to geodetic coordinates.
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/package-info.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/package-info.java
index 32e430c..a5f2dd8 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/package-info.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/package-info.java
@@ -31,7 +31,7 @@
  * be provided by the database (sometime through an extension, for example PostGIS on PostgreSQL databases).
  * This Java package uses those provided types and operations.</p>
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * <ul>
  *   <li>Current implementation does not scan the {@code "GEOMETRY_COLUMNS"} (from Simple Feature Access)
  *       or {@code "gpkg_content"} (from GeoPackage) tables for a default list of feature tables.</li>
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
index b685e9a..4d38cf7 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
@@ -40,7 +40,7 @@
  *   <li>{@link #features(boolean parallel)} (mandatory)</li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * Default methods of this abstract class are thread-safe.
  * Synchronization, when needed, uses {@code this} lock.
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
index 40f2f50..aa57fe1 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
@@ -42,7 +42,7 @@
  * This class extends {@link StoreListeners} for convenience reasons.
  * This implementation details may change in any future SIS version.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * Default methods of this abstract class are thread-safe.
  * Synchronization, when needed, uses {@code this} lock.
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
index 127b587..85b74e8 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
@@ -27,7 +27,7 @@
  * list the files that it uses. This is for informative purpose only and should not be used for
  * copying or deleting resources.
  *
- * <div class="section">Alternatives</div>
+ * <h2>Alternatives</h2>
  * <p>For copying data from one location to another, consider using
  * {@link org.apache.sis.storage.WritableAggregate#add(Resource)} instead.
  * The data store implementations may detect that some {@code add(…)} operations
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index a449d34..5903e0c 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@ -764,7 +764,7 @@
     /**
      * Extracts a substring from the given line and replaces double quotes by single quotes.
      *
-     * <div class="section">Departure from Moving Features specification</div>
+     * <h4>Departure from Moving Features specification</h4>
      * The Moving Features specification said:
      *
      *   <blockquote>Some characters may need to be escaped here. {@literal <} (less than), {@literal >}
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/StoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/StoreProvider.java
index 1d86c15..6569b98 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/StoreProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/StoreProvider.java
@@ -39,7 +39,7 @@
  * The provider of {@link Store} instances. Given a {@link StorageConnector} input,
  * this class tries to instantiate a CSV {@code Store}.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code StoreProvider} instance can be safely used by many threads without synchronization on
  * the part of the caller. However the {@link Store} instances created by this factory are not thread-safe.
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/package-info.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/package-info.java
index 43d69e4..07fdd10 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/package-info.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/package-info.java
@@ -38,7 +38,7 @@
  *   c,  10, 190, 12.0 1.0 10.0 2.0 11.0 3.0, vehicle, 1
  * }
  *
- * <div class="section">Departures from OGC specification</div>
+ * <h2>Departures from OGC specification</h2>
  * Current implementation is not strictly compliant with the Moving Features specification.
  * Departures are:
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelData.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelData.java
index 72d69b4..282dbb2 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelData.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelData.java
@@ -275,7 +275,7 @@
      * An {@code IOException} may be be thrown if the previous marked position lies in the
      * discarded portion of the stream.
      *
-     * <div class="section">Departure from Image I/O specification</div>
+     * <h4>Departure from Image I/O specification</h4>
      * The {@link javax.imageio.stream.ImageInputStream#reset()} contract specifies that if there is no matching mark,
      * then this method shall do nothing. This method throws {@link InvalidMarkException} instead; silently ignoring
      * the mismatch is considered too dangerous. However we may revisit this policy in the future if it appears to be
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataInput.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataInput.java
index 6e33098..63eb3d8 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataInput.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataInput.java
@@ -42,7 +42,7 @@
  * The channel and the buffer must be supplied by the caller. It is okay if they have already been used
  * before {@code ChannelDataInput} creation.
  *
- * <div class="section">Encapsulation</div>
+ * <h2>Encapsulation</h2>
  * This class exposes publicly the {@linkplain #channel} and the {@linkplain #buffer buffer} because this class
  * is not expected to perform all possible data manipulations that we can do with the buffers. This class is only
  * a helper tool, which often needs to be completed by specialized operations performed directly on the buffer.
@@ -52,7 +52,7 @@
  * <p>Since this class is only a helper tool, it does not "own" the channel and consequently does not provide
  * {@code close()} method. It is users responsibility to close the channel after usage.</p>
  *
- * <div class="section">Relationship with {@code DataInput}</div>
+ * <h2>Relationship with {@code DataInput}</h2>
  * This class API is compatibly with the {@link java.io.DataInput} interface, so subclasses can implement that
  * interface if they wish. This class does not implement {@code DataInput} itself because it is not needed for
  * SIS purposes, and because {@code DataInput} has undesirable methods ({@code readLine()} and {@code readUTF()}).
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataOutput.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataOutput.java
index 65d6272..c6ab4f0 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataOutput.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelDataOutput.java
@@ -40,7 +40,7 @@
  * The channel and the buffer must be supplied by the caller. It is okay if they have already been used
  * before {@code ChannelDataOutput} creation.
  *
- * <div class="section">Encapsulation</div>
+ * <h2>Encapsulation</h2>
  * This class exposes publicly the {@linkplain #channel} and the {@linkplain #buffer buffer} because this class
  * is not expected to perform all possible data manipulations that we can do with the buffers. This class is only
  * a helper tool, which often needs to be completed by specialized operations performed directly on the buffer.
@@ -50,7 +50,7 @@
  * <p>Since this class is only a helper tool, it does not "own" the channel and consequently does not provide
  * {@code close()} method. It is users responsibility to close the channel after usage.</p>
  *
- * <div class="section">Relationship with {@code DataOutput}</div>
+ * <h2>Relationship with {@code DataOutput}</h2>
  * This class API is compatibly with the {@link java.io.DataOutput} interface, so subclasses can implement that
  * interface if they wish. This class does not implement {@code DataOutput} itself because it is not needed for
  * SIS purposes.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
index a7aedfb..30d9ab7 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelFactory.java
@@ -61,7 +61,7 @@
  * In such case, only the first {@link #readable readable(…)} method invocation will succeed and all subsequent ones
  * will throw an exception.
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * This class is not thread-safe, except for the static {@link #prepare prepare(…)} method.
  * Callers are responsible for synchronizing their call to any member methods ({@link #readable readable(…)}, <i>etc</i>).
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelImageInputStream.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelImageInputStream.java
index 2a4c8b6..fa63a55 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelImageInputStream.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/ChannelImageInputStream.java
@@ -346,7 +346,7 @@
      * Closes the {@linkplain #channel}.
      * If the channel is backed by an {@link java.io.InputStream}, that stream will be closed too.
      *
-     * <div class="section">Departure from Image I/O standard implementation</div>
+     * <h4>Departure from Image I/O standard implementation</h4>
      * Java Image I/O wrappers around input/output streams do not close the underlying stream (see for example
      * {@link javax.imageio.stream.FileCacheImageInputStream#close()} specification). But Apache SIS needs the
      * underlying stream to be closed because we do not keep reference to the original input stream. Note that
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/IOUtilities.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/IOUtilities.java
index 9c582f8..0a2acc9 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/IOUtilities.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/IOUtilities.java
@@ -376,7 +376,7 @@
      * the URL is converted to a {@link File} object using the given {@code encoding} for decoding
      * the {@code "%XX"} sequences, if any.
      *
-     * <div class="section">Rational</div>
+     * <h4>Rational</h4>
      * A URL can represent a file, but {@link URL#openStream()} appears to return a {@code BufferedInputStream}
      * wrapping the {@link FileInputStream}, which is not a desirable feature when we want to obtain a channel.
      *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/InputStreamAdapter.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/InputStreamAdapter.java
index 0a4fd81..5cdb9c6 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/InputStreamAdapter.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/InputStreamAdapter.java
@@ -25,7 +25,7 @@
 /**
  * Wraps an {@link ImageInputStream} as a standard {@link InputStream}.
  *
- * <div class="section">Thread-safety</div>
+ * <h2>Thread-safety</h2>
  * This class is thread-safe only if the underlying {@link ImageInputStream} is itself thread-safe.
  * For performance reasons, this class does not synchronize the frequently invoked {@code read(…)}
  * methods since they do nothing else than delegating to {@code ImageInputStream}. This means that
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
index 4ba58c1..f4bc884 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/Aggregate.java
@@ -43,7 +43,7 @@
  * a <cite>production series</cite> and a <cite>transfer aggregate</cite>. In Apache SIS implementation,
  * those two kinds of aggregate will usually be implemented by different {@link DataStore} instances.
  *
- * <div class="section">Metadata</div>
+ * <h2>Metadata</h2>
  * Aggregates should have {@link #getMetadata() metadata} /
  * {@link org.apache.sis.metadata.iso.DefaultMetadata#getMetadataScopes() metadataScope} /
  * {@link org.apache.sis.metadata.iso.DefaultMetadataScope#getResourceScope() resourceScope} sets to
@@ -77,7 +77,7 @@
      * {@link org.apache.sis.metadata.iso.identification.AbstractIdentification#getCitation() citation} /
      * {@link org.apache.sis.metadata.iso.citation.DefaultCitation#getTitle() title}</blockquote>
      *
-     * <div class="section">Lazy resource instantiation</div>
+     * <h4>Lazy resource instantiation</h4>
      * If the collection instantiates components only when first needed, and if a checked exception occurs
      * during invocation of a {@link Collection} or {@link java.util.Iterator} method, then the collection
      * or the iterator should wrap the exception in a {@link org.apache.sis.util.collection.BackingStoreException}.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
index 898e322..3a136a8 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
@@ -33,7 +33,7 @@
  * attributes, and an arbitrary amount of {@code Feature} instances which contains the actual values for all bridges in
  * the dataset.</div>
  *
- * <div class="section">Metadata</div>
+ * <h2>Metadata</h2>
  * Datasets should have {@link #getMetadata() metadata} /
  * {@link org.apache.sis.metadata.iso.DefaultMetadata#getMetadataScopes() metadataScope} /
  * {@link org.apache.sis.metadata.iso.DefaultMetadataScope#getResourceScope() resourceScope} sets to
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
index 66a659d..dfa6f30 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
@@ -51,7 +51,7 @@
  * For example a {@code DataStore} for ShapeFiles will implement the {@link FeatureSet} interface,
  * while a {@code DataStore} for netCDF files will implement the {@link Aggregate} interface.</p>
  *
- * <div class="section">Thread safety policy</div>
+ * <h2>Thread safety policy</h2>
  * Data stores should be thread-safe, but their synchronization lock is implementation-dependent.
  * This base class uses only the {@code synchronized} keyword, applied on the following methods:
  *
@@ -287,7 +287,7 @@
      * Note that this identifier is not guaranteed to be unique between different {@code DataStore} instances;
      * it only needs to be unique among the resources provided by this data store instance.
      *
-     * <div class="section">Default implementation</div>
+     * <h4>Default implementation</h4>
      * <p>The default implementation searches for an identifier in the metadata,
      * at the location shown below, provided that conditions are met:</p>
      *
@@ -446,7 +446,7 @@
      * or unless this {@code DataStore} is itself garbage collected. However if the given type of events can never
      * happen with this data store, then this method is not required to keep a reference to the given listener.</p>
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is assignable from <code>{@linkplain org.apache.sis.storage.event.WarningEvent}.class</code>,
      * then registering that listener turns off logging of warning messages for this data store.
      * This side-effect is applied on the assumption that the registered listener will handle
@@ -474,7 +474,7 @@
      * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is <code>{@linkplain org.apache.sis.storage.event.WarningEvent}.class</code>
      * and if, after this method invocation, there is no remaining listener for warning events,
      * then this {@code DataStore} will send future warnings to the loggers.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreException.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreException.java
index ae3051a..a62a2bc 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreException.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreException.java
@@ -27,7 +27,7 @@
 /**
  * Thrown when a {@link DataStore} can not complete a read or write operation.
  *
- * <div class="section">Localization</div>
+ * <h2>Localization</h2>
  * The {@link #getMessage()} and {@link #getLocalizedMessage()} methods return the same message,
  * but sometime in different languages. The general policy is that {@link #getMessage()} returns
  * the message in the JVM {@linkplain Locale#getDefault() default locale} while {@link #getLocalizedMessage()}
@@ -160,7 +160,7 @@
      * but may in some occasions be different if {@link DataStore#setLocale(Locale)}
      * has been invoked with a different locale.
      *
-     * <div class="section">{@code getMessage()} versus {@code getLocalizedMessage()}</div>
+     * <h4>{@code getMessage()} versus {@code getLocalizedMessage()}</h4>
      * When {@code getMessage()} and {@code getLocalizedMessage()} are not equivalent, the Apache SIS policy
      * is that {@code getMessage()} returns the message in the {@linkplain Locale#getDefault() default locale}
      * while {@code getLocalizedMessage()} returns the message in a locale that depends on the context in which
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
index d8091d3..3e86208 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
@@ -42,7 +42,7 @@
  *       to open a given {@link StorageConnector}.</li>
  * </ul>
  *
- * <div class="section">Packaging data stores</div>
+ * <h2>Packaging data stores</h2>
  * JAR files that provide implementations of this class shall contain an entry with exactly the following path:
  *
  * {@preformat text
@@ -53,7 +53,7 @@
  * where each line is the fully qualified name of the implementation class.
  * See {@link java.util.ServiceLoader} for more general discussion about this lookup mechanism.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * All {@code DataStoreProvider} implementations shall be thread-safe.
  * However the {@code DataStore} instances created by the providers do not need to be thread-safe.
  *
@@ -245,8 +245,8 @@
      * {@link java.nio.ByteBuffer#mark()}, {@link java.io.InputStream#mark(int)} and
      * {@link javax.imageio.stream.ImageInputStream#mark()}.</p>
      *
-     * <div class="note"><b>Implementation example</b><br>
-     * Implementations will typically check the first bytes of the stream for a "magic number" associated
+     * <div class="note"><b>Implementation example</b>:
+     * implementations will typically check the first bytes of the stream for a "magic number" associated
      * with the format, as in the following example:
      *
      * {@preformat java
@@ -288,7 +288,7 @@
      * or when the input is not a type accepted by {@link #open(ParameterValueGroup)}
      * (for example an {@link java.io.InputStream}).
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * Implementers shall invoke {@link StorageConnector#closeAllExcept(Object)} after {@code DataStore}
      * creation, keeping open only the needed resource.
      *
@@ -315,7 +315,7 @@
      *     }
      * }
      *
-     * <div class="section">Implementation note</div>
+     * <h4>Implementation note</h4>
      * The default implementation gets the value of a parameter named {@value #LOCATION}.
      * That value (typically a path or URL) is given to {@link StorageConnector} constructor,
      * which is then passed to {@link #open(StorageConnector)}.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
index b6f4853..524880e 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
@@ -35,10 +35,10 @@
  * be any other objects documented in the {@link StorageConnector} class.
  *
  * <div class="note"><b>API note:</b>
- * This class is package-private for now in order to get more experience about what could be a good API.
+ * this class is package-private for now in order to get more experience about what could be a good API.
  * This class may become public in a future SIS version.</div>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code DataStoreRegistry} instance can be safely used by many threads without synchronization
  * on the part of the caller.
  *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStores.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStores.java
index d336702..6620069 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStores.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStores.java
@@ -37,7 +37,7 @@
     /**
      * The registry to use for searching for {@link DataStoreProvider} implementations.
      *
-     * <div class="section">Class loader</div>
+     * <h4>Class loader</h4>
      * In current implementation, this registry is instantiated when first needed using the
      * {@linkplain Thread#getContextClassLoader() context class loader}. This means that the set of
      * available formats may depend on the first thread that invoked a {@code DataStores} method.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureNaming.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureNaming.java
index f4c9e8d..eec19ef 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureNaming.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureNaming.java
@@ -61,7 +61,7 @@
  * can be established for the given name. This behavior allows {@code FeatureNaming} to produce an error message
  * telling why the operation can not succeed.
  *
- * <div class="section">Managing the list of generic names</div>
+ * <h2>Managing the list of generic names</h2>
  * This class does not memorize the list of {@linkplain #add added} {@code GenericName} instances. Instead this
  * class memorizes only their string representations, thus protecting the binding from any change in the original
  * {@code GenericName} instances. The list of feature names should instead be included in the ISO 19115 metadata
@@ -77,7 +77,7 @@
  * some feature information in different {@link org.opengis.metadata.content.FeatureCatalogueDescription} instances.
  * This is one reason why we let the data store manages {@code GenericName} lists itself.
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * A {@code FeatureNaming} instance is thread-safe only if constructed once and never modified after publication.
  * For example it is safe to initialize a {@code FeatureNaming} in a {@link DataStore} or {@link DataStoreProvider}
  * constructor if the result is stored in a private final field with no public accessor
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/ProbeResult.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/ProbeResult.java
index e4d8477..dca23f0 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/ProbeResult.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/ProbeResult.java
@@ -28,7 +28,7 @@
  * {@code ProbeResult} may also provide additional information, like file MIME type and the
  * format version.
  *
- * <div class="section">Usage</div>
+ * <h2>Usage</h2>
  * When a {@link DataStores#open DataStores.open(…)} method is invoked, SIS will iterate over the list of known
  * providers and invoke the {@link DataStoreProvider#probeContent(StorageConnector)} method for each of them.
  * The {@code ProbeResult} value returned by {@code probeContent(…)} tells to SIS whether a particular
@@ -38,7 +38,7 @@
  * Other properties like {@link #getVersion()} are sometime available for both supported and unsupported storages.
  * For example a file may be encoded in a known format, but may be using an unsupported version of that format.</p>
  *
- * <div class="section">Special values</div>
+ * <h2>Special values</h2>
  * In addition to the supported/unsupported information, {@code ProbeResult} defines two constants having
  * a special meaning: {@link #INSUFFICIENT_BYTES} and {@link #UNDETERMINED}, which indicate that the provider does
  * not have enough information for telling whether the storage can be opened.
@@ -182,7 +182,7 @@
      * The {@link DataStoreProvider} may (at implementation choice) inspect the storage content for
      * determining a more accurate MIME type.
      *
-     * <div class="section">XML types</div>
+     * <h4>XML types</h4>
      * A generic MIME type for XML documents is {@code "application/xml"}.
      * However many other MIME types exist for XML documents compliant to some particular shema.
      * Those types can be determined by inspecting the namespace of XML root element.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
index 250cd44..fd5152c 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
@@ -149,7 +149,7 @@
      * or unless this {@code Resource} is itself garbage collected. However if the given type of events can never
      * happen with this resource, then this method is not required to keep a reference to the given listener.</p>
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is assignable from <code>{@linkplain org.apache.sis.storage.event.WarningEvent}.class</code>,
      * then registering that listener turns off logging of warning messages for this resource.
      * This side-effect is applied on the assumption that the registered listener will handle
@@ -172,7 +172,7 @@
      * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is <code>{@linkplain org.apache.sis.storage.event.WarningEvent}.class</code>
      * and if, after this method invocation, there is no remaining listener for warning events,
      * then this {@code Resource} will send future warnings to the loggers.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
index 2eb6f12..039c60a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
@@ -43,7 +43,7 @@
  * <p>Observers can {@linkplain #addListener add listeners} for being notified about events,
  * and producers can invoke one of the {@code warning(…)} and other methods for emitting events.
  *
- * <div class="section">Warning events</div>
+ * <h2>Warning events</h2>
  * All warnings are given to the listeners as {@link LogRecord} instances (this allows localizable messages
  * and additional information like {@linkplain LogRecord#getThrown() stack trace}, timestamp, <i>etc.</i>).
  * This {@code StoreListeners} class provides convenience methods like {@link #warning(String, Exception)},
@@ -65,7 +65,7 @@
  *   </li>
  * </ul>
  *
- * <div class="section">Thread safety</div>
+ * <h2>Thread safety</h2>
  * The same {@code StoreListeners} instance can be safely used by many threads without synchronization
  * on the part of the caller. Subclasses should make sure that any overridden methods remain safe to call
  * from multiple threads.
@@ -384,7 +384,7 @@
      * At least one of {@code message} and {@code exception} arguments shall be non-null.
      * If both are non-null, then the exception message will be concatenated after the given message.
      *
-     * <div class="section">Stack trace omission</div>
+     * <h4>Stack trace omission</h4>
      * If there is no registered listener for the {@link WarningEvent} type, then the {@link #warning(LogRecord)}
      * method will send the record to a logger but <em>without</em> the stack trace.
      * This is done that way because stack traces consume lot of space in the logging files, while being considered
@@ -524,7 +524,7 @@
      * method will be invoked only once per event. This filtering applies even if the listener is registered
      * on different resources in the same tree, for example a parent and its children.
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is assignable from <code>{@linkplain WarningEvent}.class</code>,
      * then registering that listener turns off logging of warning messages for this manager.
      * This side-effect is applied on the assumption that the registered listener will handle
@@ -565,7 +565,7 @@
      * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
-     * <div class="section">Warning events</div>
+     * <h4>Warning events</h4>
      * If {@code eventType} is <code>{@linkplain WarningEvent}.class</code> and if, after this method invocation,
      * there is no remaining listener for warning events, then this {@code StoreListeners} will send future warnings
      * to the loggers.
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamIO.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamIO.java
index cc0c05c..9f5ebc4 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamIO.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamIO.java
@@ -31,7 +31,7 @@
  * Those {@code DataStore}s will typically manage {@code StaxStreamReader} and {@code StaxStreamWriter}
  * instances on which they delegate their read and write operations.
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * This class and subclasses are not tread-safe. Synchronization shall be done by the {@code DataStore}
  * that contains the {@code StaxStreamIO} instances.
  *
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
index 1a25e95..a0f68ed 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
@@ -96,7 +96,7 @@
  *     }
  * }
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * This class and subclasses are not tread-safe. Synchronization shall be done by the {@code DataStore}
  * that contains the {@code StaxStreamReader} instance.
  *
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamWriter.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamWriter.java
index bc51471..6638e32 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamWriter.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamWriter.java
@@ -79,7 +79,7 @@
  *     }
  * }
  *
- * <div class="section">Multi-threading</div>
+ * <h2>Multi-threading</h2>
  * This class and subclasses are not tread-safe. Synchronization shall be done by the {@code DataStore}
  * that contains the {@code StaxStreamIO} instances.
  *
@@ -259,7 +259,7 @@
      * Delegates to JAXB the marshalling of a part of XML document.
      * The XML content will be written in an element of the given name with no namespace (see below).
      *
-     * <div class="section">Hiding namespace</div>
+     * <h4>Hiding namespace</h4>
      * The {@code hideNS} argument, if non-null, gives a namespace to remove in the marshalling result.
      * There is two reasons why we may want to hide a namespace. The most straightforward reason is to
      * simplify the XML document when the {@linkplain javax.xml.bind.annotation.XmlElement#namespace()