sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 02/03: Remplace <div class="section"> HTML tags by <h2> or <h4> standard tags. We avoided those tags previously because it was not clear at which number we should start. But Java 13 now fix those numbers with implicit value depending on the context (whether we are documenting a class or a method), and the compiler verifies those numbers. Since those numbers are now clearly defined, we can rely on them and remove the previous conservative apprach.
Date Sat, 19 Oct 2019 12:37:35 GMT
This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 5913110034535471414cc1d321e147fcb2215cda
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Sat Oct 19 10:56:13 2019 +0200

    Remplace <div class="section"> HTML tags by <h2> or <h4> standard tags.
    We avoided those tags previously because it was not clear at which number we should start.
    But Java 13 now fix those numbers with implicit value depending on the context (whether we
    are documenting a class or a method), and the compiler verifies those numbers. Since those
    numbers are now clearly defined, we can rely on them and remove the previous conservative
    apprach.
---
 .../java/org/apache/sis/console/AboutCommand.java  |  2 +-
 .../main/java/org/apache/sis/console/Command.java  |  2 +-
 .../java/org/apache/sis/console/package-info.java  |  2 +-
 .../apache/sis/internal/unopkg/package-info.java   |  4 +-
 .../org/apache/sis/coverage/SampleDimension.java   |  2 +-
 .../org/apache/sis/coverage/grid/GridCoverage.java |  2 +-
 .../apache/sis/coverage/grid/ImageRenderer.java    |  2 +-
 .../apache/sis/feature/AbstractAssociation.java    |  4 +-
 .../org/apache/sis/feature/AbstractAttribute.java  |  8 +--
 .../org/apache/sis/feature/AbstractFeature.java    |  8 +--
 .../apache/sis/feature/AbstractIdentifiedType.java |  2 +-
 .../apache/sis/feature/CharacteristicTypeMap.java  |  2 +-
 .../apache/sis/feature/DefaultAssociationRole.java |  2 +-
 .../apache/sis/feature/DefaultAttributeType.java   |  6 +-
 .../org/apache/sis/feature/DefaultFeatureType.java | 10 +--
 .../org/apache/sis/feature/EnvelopeOperation.java  |  2 +-
 .../org/apache/sis/feature/FeatureOperations.java  | 10 +--
 .../apache/sis/feature/MultiValuedAssociation.java |  2 +-
 .../apache/sis/feature/MultiValuedAttribute.java   |  2 +-
 .../apache/sis/feature/SingletonAssociation.java   |  2 +-
 .../org/apache/sis/feature/SingletonAttribute.java |  2 +-
 .../apache/sis/feature/builder/TypeBuilder.java    |  2 +-
 .../java/org/apache/sis/feature/package-info.java  |  6 +-
 .../apache/sis/image/WritablePixelIterator.java    |  2 +-
 .../sis/internal/feature/AttributeConvention.java  |  2 +-
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |  8 +--
 .../sis/internal/jaxb/ModifiableIdentifierMap.java |  2 +-
 .../sis/internal/jaxb/PrimitiveTypeProperties.java |  6 +-
 .../apache/sis/internal/jaxb/gco/GO_DateTime.java  |  2 +-
 .../apache/sis/internal/jaxb/gco/GO_Decimal.java   |  2 +-
 .../org/apache/sis/internal/jaxb/gco/GO_Real.java  |  2 +-
 .../apache/sis/internal/jaxb/gco/PropertyType.java |  2 +-
 .../apache/sis/internal/jaxb/gco/package-info.java |  2 +-
 .../apache/sis/internal/jaxb/gml/GMLAdapter.java   |  2 +-
 .../org/apache/sis/internal/jaxb/gml/Measure.java  |  2 +-
 .../jaxb/metadata/replace/ServiceParameter.java    |  2 +-
 .../org/apache/sis/internal/jaxb/package-info.java |  2 +-
 .../sis/internal/metadata/sql/package-info.java    |  2 +-
 .../java/org/apache/sis/internal/xml/Schemas.java  |  2 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  | 18 ++---
 .../org/apache/sis/metadata/MetadataStandard.java  | 18 ++---
 .../org/apache/sis/metadata/MetadataVisitor.java   |  2 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |  6 +-
 .../org/apache/sis/metadata/PropertyAccessor.java  |  4 +-
 .../apache/sis/metadata/PropertyInformation.java   |  2 +-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |  6 +-
 .../apache/sis/metadata/ValueExistencePolicy.java  |  2 +-
 .../apache/sis/metadata/iso/DefaultIdentifier.java |  4 +-
 .../apache/sis/metadata/iso/DefaultMetadata.java   |  4 +-
 .../org/apache/sis/metadata/iso/ISOMetadata.java   |  2 +-
 .../metadata/iso/acquisition/DefaultObjective.java |  2 +-
 .../sis/metadata/iso/acquisition/package-info.java |  4 +-
 .../sis/metadata/iso/citation/Citations.java       | 32 ++++-----
 .../sis/metadata/iso/citation/DefaultCitation.java |  6 +-
 .../metadata/iso/citation/DefaultTelephone.java    |  4 +-
 .../sis/metadata/iso/citation/package-info.java    |  6 +-
 .../iso/constraint/DefaultLegalConstraints.java    |  2 +-
 .../sis/metadata/iso/constraint/package-info.java  |  4 +-
 .../sis/metadata/iso/content/package-info.java     |  4 +-
 .../distribution/DefaultStandardOrderProcess.java  |  4 +-
 .../metadata/iso/distribution/package-info.java    |  4 +-
 .../sis/metadata/iso/extent/DefaultExtent.java     |  2 +-
 .../iso/extent/DefaultGeographicBoundingBox.java   |  7 +-
 .../metadata/iso/extent/DefaultTemporalExtent.java |  2 +-
 .../metadata/iso/extent/DefaultVerticalExtent.java |  2 +-
 .../apache/sis/metadata/iso/extent/Extents.java    |  4 +-
 .../sis/metadata/iso/extent/package-info.java      |  4 +-
 .../DefaultAggregateInformation.java               |  2 +-
 .../identification/DefaultAssociatedResource.java  |  2 +-
 .../DefaultRepresentativeFraction.java             |  2 +-
 .../iso/identification/DefaultResolution.java      | 12 ++--
 .../metadata/iso/identification/package-info.java  |  4 +-
 .../sis/metadata/iso/lineage/DefaultLineage.java   |  2 +-
 .../sis/metadata/iso/lineage/DefaultSource.java    |  2 +-
 .../sis/metadata/iso/lineage/package-info.java     |  4 +-
 .../iso/maintenance/DefaultScopeDescription.java   | 22 +++----
 .../sis/metadata/iso/maintenance/package-info.java |  4 +-
 .../org/apache/sis/metadata/iso/package-info.java  |  6 +-
 .../metadata/iso/quality/DefaultDataQuality.java   |  2 +-
 .../iso/quality/DefaultQuantitativeResult.java     |  2 +-
 .../sis/metadata/iso/quality/package-info.java     |  4 +-
 .../metadata/iso/spatial/DefaultGeorectified.java  |  6 +-
 .../sis/metadata/iso/spatial/package-info.java     |  4 +-
 .../java/org/apache/sis/metadata/package-info.java |  8 +--
 .../apache/sis/metadata/sql/CachedStatement.java   |  8 +--
 .../sis/metadata/sql/IdentifierGenerator.java      |  2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  4 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |  2 +-
 .../java/org/apache/sis/util/iso/AbstractName.java |  4 +-
 .../org/apache/sis/util/iso/DefaultLocalName.java  |  4 +-
 .../org/apache/sis/util/iso/DefaultMemberName.java |  2 +-
 .../apache/sis/util/iso/DefaultNameFactory.java    |  2 +-
 .../org/apache/sis/util/iso/DefaultNameSpace.java  |  4 +-
 .../org/apache/sis/util/iso/DefaultRecord.java     |  2 +-
 .../apache/sis/util/iso/DefaultRecordSchema.java   |  4 +-
 .../org/apache/sis/util/iso/DefaultRecordType.java |  6 +-
 .../org/apache/sis/util/iso/DefaultScopedName.java |  2 +-
 .../org/apache/sis/util/iso/DefaultTypeName.java   |  4 +-
 .../org/apache/sis/util/iso/GlobalNameSpace.java   |  2 +-
 .../main/java/org/apache/sis/util/iso/Names.java   |  2 +-
 .../org/apache/sis/util/iso/RecordDefinition.java  |  4 +-
 .../main/java/org/apache/sis/util/iso/Types.java   |  2 +-
 .../java/org/apache/sis/util/iso/package-info.java |  2 +-
 .../java/org/apache/sis/xml/IdentifiedObject.java  |  2 +-
 .../java/org/apache/sis/xml/MarshalContext.java    |  6 +-
 .../java/org/apache/sis/xml/MarshallerPool.java    |  8 +--
 .../main/java/org/apache/sis/xml/Namespaces.java   |  2 +-
 .../main/java/org/apache/sis/xml/NilObject.java    |  2 +-
 .../main/java/org/apache/sis/xml/NilReason.java    |  4 +-
 .../main/java/org/apache/sis/xml/Transformer.java  |  2 +-
 .../src/main/java/org/apache/sis/xml/XML.java      | 12 ++--
 .../main/java/org/apache/sis/xml/package-info.java |  2 +-
 .../java/org/apache/sis/metadata/NameMapTest.java  |  2 +-
 .../apache/sis/metadata/TreeNodeChildrenTest.java  |  2 +-
 .../java/org/apache/sis/test/MetadataAssert.java   |  2 +-
 .../java/org/apache/sis/test/sql/TestDatabase.java |  2 +-
 .../org/apache/sis/test/xml/SchemaCompliance.java  |  2 +-
 .../gazetteer/GeohashReferenceSystem.java          |  2 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |  6 +-
 .../gazetteer/ModifiableLocationType.java          |  4 +-
 .../gazetteer/ReferencingByIdentifiers.java        |  2 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  | 24 +++----
 .../org/apache/sis/geometry/ArrayEnvelope.java     |  2 +-
 .../org/apache/sis/geometry/DirectPosition2D.java  |  2 +-
 .../java/org/apache/sis/geometry/Envelope2D.java   | 20 +++---
 .../java/org/apache/sis/geometry/Envelopes.java    |  6 +-
 .../apache/sis/geometry/GeneralDirectPosition.java |  2 +-
 .../org/apache/sis/geometry/GeneralEnvelope.java   | 26 ++++----
 .../org/apache/sis/geometry/ImmutableEnvelope.java |  2 +-
 .../java/org/apache/sis/geometry/package-info.java |  4 +-
 .../internal/jaxb/referencing/RS_Identifier.java   |  4 +-
 .../referencing/provider/MillerCylindrical.java    |  2 +-
 .../sis/internal/referencing/provider/NADCON.java  |  2 +-
 .../java/org/apache/sis/io/wkt/Convention.java     |  4 +-
 .../org/apache/sis/io/wkt/FormattableObject.java   |  6 +-
 .../main/java/org/apache/sis/io/wkt/Formatter.java |  4 +-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  4 +-
 .../main/java/org/apache/sis/io/wkt/Symbols.java   |  6 +-
 .../java/org/apache/sis/io/wkt/Transliterator.java |  6 +-
 .../sis/io/wkt/UnparsableObjectException.java      |  2 +-
 .../main/java/org/apache/sis/io/wkt/WKTFormat.java |  6 +-
 .../java/org/apache/sis/io/wkt/package-info.java   |  6 +-
 .../parameter/DefaultParameterDescriptorGroup.java |  2 +-
 .../sis/parameter/DefaultParameterValue.java       | 18 ++---
 .../sis/parameter/DefaultParameterValueGroup.java  |  8 +--
 .../org/apache/sis/parameter/ParameterBuilder.java |  4 +-
 .../org/apache/sis/parameter/Parameterized.java    |  2 +-
 .../java/org/apache/sis/parameter/Parameters.java  |  6 +-
 .../org/apache/sis/parameter/TensorParameters.java | 16 ++---
 .../sis/parameter/UnmodifiableParameterValue.java  |  2 +-
 .../org/apache/sis/parameter/package-info.java     |  2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  | 32 ++++-----
 .../sis/referencing/AbstractReferenceSystem.java   |  4 +-
 .../java/org/apache/sis/referencing/Builder.java   | 18 ++---
 .../main/java/org/apache/sis/referencing/CRS.java  | 16 ++---
 .../sis/referencing/GeodesicsOnEllipsoid.java      |  2 +-
 .../apache/sis/referencing/GeodeticCalculator.java |  6 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |  2 +-
 .../sis/referencing/ImmutableIdentifier.java       |  6 +-
 .../apache/sis/referencing/NamedIdentifier.java    |  4 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |  4 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |  6 +-
 .../sis/referencing/crs/DefaultDerivedCRS.java     |  4 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |  2 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |  4 +-
 .../sis/referencing/crs/DefaultGeographicCRS.java  |  6 +-
 .../sis/referencing/crs/DefaultImageCRS.java       |  2 +-
 .../sis/referencing/crs/DefaultParametricCRS.java  |  2 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |  2 +-
 .../sis/referencing/crs/DefaultTemporalCRS.java    |  2 +-
 .../sis/referencing/crs/DefaultVerticalCRS.java    |  2 +-
 .../apache/sis/referencing/crs/package-info.java   |  2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  2 +-
 .../apache/sis/referencing/cs/AxesConvention.java  |  6 +-
 .../org/apache/sis/referencing/cs/AxisFilter.java  |  4 +-
 .../sis/referencing/cs/CoordinateSystems.java      | 12 ++--
 .../apache/sis/referencing/cs/DefaultAffineCS.java |  2 +-
 .../sis/referencing/cs/DefaultCartesianCS.java     |  2 +-
 .../sis/referencing/cs/DefaultCompoundCS.java      |  2 +-
 .../cs/DefaultCoordinateSystemAxis.java            |  8 +--
 .../sis/referencing/cs/DefaultCylindricalCS.java   |  2 +-
 .../sis/referencing/cs/DefaultEllipsoidalCS.java   |  2 +-
 .../apache/sis/referencing/cs/DefaultLinearCS.java |  2 +-
 .../sis/referencing/cs/DefaultParametricCS.java    |  2 +-
 .../apache/sis/referencing/cs/DefaultPolarCS.java  |  2 +-
 .../sis/referencing/cs/DefaultSphericalCS.java     |  2 +-
 .../apache/sis/referencing/cs/DefaultTimeCS.java   |  2 +-
 .../sis/referencing/cs/DefaultUserDefinedCS.java   |  2 +-
 .../sis/referencing/cs/DefaultVerticalCS.java      |  2 +-
 .../sis/referencing/cs/DirectionAlongMeridian.java |  4 +-
 .../sis/referencing/datum/AbstractDatum.java       |  6 +-
 .../sis/referencing/datum/BursaWolfParameters.java |  8 +--
 .../sis/referencing/datum/DatumShiftGrid.java      | 16 ++---
 .../sis/referencing/datum/DefaultEllipsoid.java    |  4 +-
 .../referencing/datum/DefaultEngineeringDatum.java |  2 +-
 .../referencing/datum/DefaultGeodeticDatum.java    | 14 ++--
 .../sis/referencing/datum/DefaultImageDatum.java   |  2 +-
 .../referencing/datum/DefaultParametricDatum.java  |  4 +-
 .../referencing/datum/DefaultPrimeMeridian.java    |  6 +-
 .../referencing/datum/DefaultTemporalDatum.java    |  4 +-
 .../referencing/datum/DefaultVerticalDatum.java    |  4 +-
 .../org/apache/sis/referencing/datum/Sphere.java   |  2 +-
 .../apache/sis/referencing/datum/package-info.java |  2 +-
 .../factory/CommonAuthorityFactory.java            |  4 +-
 .../factory/ConcurrentAuthorityFactory.java        | 10 +--
 .../factory/GeodeticAuthorityFactory.java          | 76 +++++++++++-----------
 .../referencing/factory/GeodeticObjectFactory.java |  6 +-
 .../factory/IdentifiedObjectFinder.java            |  4 +-
 .../referencing/factory/IdentifiedObjectSet.java   |  6 +-
 .../factory/MissingFactoryResourceException.java   |  2 +-
 .../factory/MultiAuthoritiesFactory.java           | 12 ++--
 .../factory/UnavailableFactoryException.java       |  2 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  2 +-
 .../referencing/factory/sql/EPSGDataAccess.java    | 10 +--
 .../sis/referencing/factory/sql/EPSGFactory.java   |  4 +-
 .../factory/sql/InstallationScriptProvider.java    |  6 +-
 .../sis/referencing/factory/sql/SQLTranslator.java |  2 +-
 .../sis/referencing/factory/sql/package-info.java  |  6 +-
 .../operation/AbstractCoordinateOperation.java     | 10 +--
 .../operation/CoordinateOperationFinder.java       |  6 +-
 .../operation/DefaultConcatenatedOperation.java    |  2 +-
 .../referencing/operation/DefaultConversion.java   |  8 +--
 .../operation/DefaultOperationMethod.java          |  6 +-
 .../operation/DefaultTransformation.java           |  2 +-
 .../operation/builder/LinearTransformBuilder.java  |  2 +-
 .../operation/builder/LocalizationGridBuilder.java |  2 +-
 .../operation/matrix/GeneralMatrix.java            |  2 +-
 .../sis/referencing/operation/matrix/Matrices.java |  8 +--
 .../referencing/operation/matrix/MatrixSIS.java    |  6 +-
 .../referencing/operation/matrix/package-info.java |  4 +-
 .../sis/referencing/operation/package-info.java    |  6 +-
 .../operation/projection/ConformalProjection.java  |  6 +-
 .../operation/projection/CylindricalEqualArea.java |  2 +-
 .../projection/LambertConicConformal.java          |  2 +-
 .../referencing/operation/projection/Mercator.java |  4 +-
 .../operation/projection/NormalizedProjection.java | 10 +--
 .../operation/projection/ObliqueStereographic.java |  2 +-
 .../operation/projection/ProjectionException.java  |  2 +-
 .../operation/projection/SatelliteTracking.java    |  4 +-
 .../operation/projection/TransverseMercator.java   |  2 +-
 .../operation/projection/package-info.java         | 15 ++---
 .../operation/transform/AbstractMathTransform.java | 10 +--
 .../transform/AbstractMathTransform1D.java         |  6 +-
 .../transform/AbstractMathTransform2D.java         |  6 +-
 .../operation/transform/ContextualParameters.java  |  4 +-
 .../operation/transform/DatumShiftTransform.java   |  2 +-
 .../transform/DefaultMathTransformFactory.java     | 12 ++--
 .../transform/EllipsoidToCentricTransform.java     |  2 +-
 .../transform/ExponentialTransform1D.java          |  2 +-
 .../transform/InterpolatedGeocentricTransform.java |  4 +-
 .../transform/InterpolatedMolodenskyTransform.java |  2 +-
 .../operation/transform/InterpolatedTransform.java |  4 +-
 .../operation/transform/IterationStrategy.java     |  2 +-
 .../operation/transform/LinearInterpolator1D.java  |  2 +-
 .../operation/transform/LinearTransform.java       |  6 +-
 .../transform/LogarithmicTransform1D.java          |  2 +-
 .../operation/transform/MathTransformProvider.java |  4 +-
 .../operation/transform/MolodenskyTransform.java   |  2 +-
 .../operation/transform/OperationMethodSet.java    |  4 +-
 .../operation/transform/PassThroughTransform.java  |  4 +-
 .../operation/transform/PowerTransform1D.java      |  2 +-
 .../operation/transform/TransferFunction.java      |  4 +-
 .../operation/transform/package-info.java          |  4 +-
 .../org/apache/sis/referencing/package-info.java   |  6 +-
 .../internal/referencing/provider/NTv2Test.java    |  2 +-
 .../referencing/crs/DefaultGeocentricCRSTest.java  |  2 +-
 .../operation/matrix/MatrixTestCase.java           |  2 +-
 .../referencing/operation/matrix/SolverTest.java   |  2 +-
 .../projection/LambertConicConformalTest.java      |  2 +-
 .../org/apache/sis/test/widget/package-info.java   |  2 +-
 .../sis/internal/converter/AngleConverter.java     |  4 +-
 .../sis/internal/converter/ArrayConverter.java     |  2 +-
 .../internal/converter/CharSequenceConverter.java  |  2 +-
 .../apache/sis/internal/converter/ClassPair.java   |  2 +-
 .../internal/converter/CollectionConverter.java    |  2 +-
 .../sis/internal/converter/ConverterRegistry.java  | 10 +--
 .../sis/internal/converter/DateConverter.java      |  6 +-
 .../sis/internal/converter/FallbackConverter.java  |  2 +-
 .../sis/internal/converter/IdentityConverter.java  |  2 +-
 .../sis/internal/converter/NumberConverter.java    |  4 +-
 .../sis/internal/converter/ObjectToString.java     |  2 +-
 .../sis/internal/converter/PathConverter.java      |  2 +-
 .../sis/internal/converter/StringConverter.java    |  4 +-
 .../sis/internal/converter/SystemConverter.java    |  4 +-
 .../sis/internal/converter/SystemRegistry.java     |  2 +-
 .../sis/internal/converter/package-info.java       |  2 +-
 .../sis/internal/system/DelayedExecutor.java       |  2 +-
 .../sis/internal/system/DelayedRunnable.java       |  2 +-
 .../org/apache/sis/internal/system/Threads.java    |  2 +-
 .../org/apache/sis/internal/util/Constants.java    |  2 +-
 .../apache/sis/internal/util/DefinitionURI.java    |  4 +-
 .../org/apache/sis/internal/util/DoubleDouble.java | 12 ++--
 .../org/apache/sis/internal/util/Numerics.java     |  2 +-
 .../java/org/apache/sis/internal/util/Strings.java |  2 +-
 .../sis/internal/util/UnmodifiableArrayList.java   |  8 +--
 .../org/apache/sis/internal/util/package-info.java |  2 +-
 .../src/main/java/org/apache/sis/io/Appender.java  |  2 +-
 .../main/java/org/apache/sis/io/ClassFormat.java   |  2 +-
 .../java/org/apache/sis/io/CompoundFormat.java     |  4 +-
 .../main/java/org/apache/sis/io/DefaultFormat.java |  2 +-
 .../main/java/org/apache/sis/io/LineAppender.java  |  2 +-
 .../main/java/org/apache/sis/io/TabularFormat.java |  4 +-
 .../main/java/org/apache/sis/io/package-info.java  |  4 +-
 .../apache/sis/math/CompoundDirectPositions.java   |  2 +-
 .../java/org/apache/sis/math/DecimalFunctions.java |  2 +-
 .../java/org/apache/sis/math/MathFunctions.java    |  4 +-
 .../main/java/org/apache/sis/math/Statistics.java  |  2 +-
 .../src/main/java/org/apache/sis/math/Vector.java  | 10 +--
 .../main/java/org/apache/sis/measure/Angle.java    |  4 +-
 .../org/apache/sis/measure/ElevationAngle.java     |  2 +-
 .../sis/measure/FormattedCharacterIterator.java    |  2 +-
 .../main/java/org/apache/sis/measure/Latitude.java |  2 +-
 .../java/org/apache/sis/measure/Longitude.java     |  2 +-
 .../org/apache/sis/measure/MeasurementRange.java   |  4 +-
 .../java/org/apache/sis/measure/NumberRange.java   |  6 +-
 .../main/java/org/apache/sis/measure/Range.java    |  6 +-
 .../java/org/apache/sis/measure/RangeFormat.java   |  4 +-
 .../apache/sis/measure/SexagesimalConverter.java   |  2 +-
 .../java/org/apache/sis/measure/UnitFormat.java    | 10 +--
 .../main/java/org/apache/sis/measure/Units.java    |  4 +-
 .../main/java/org/apache/sis/setup/OptionKey.java  |  2 +-
 .../java/org/apache/sis/util/ArgumentChecks.java   |  2 +-
 .../main/java/org/apache/sis/util/ArraysExt.java   |  6 +-
 .../java/org/apache/sis/util/CharSequences.java    | 18 ++---
 .../main/java/org/apache/sis/util/Characters.java  |  2 +-
 .../src/main/java/org/apache/sis/util/Classes.java |  2 +-
 .../java/org/apache/sis/util/ComparisonMode.java   | 10 +--
 .../apache/sis/util/CorruptedObjectException.java  |  2 +-
 .../main/java/org/apache/sis/util/Disposable.java  |  2 +-
 .../org/apache/sis/util/LenientComparable.java     |  4 +-
 .../java/org/apache/sis/util/ObjectConverter.java  |  2 +-
 .../java/org/apache/sis/util/StringBuilders.java   |  4 +-
 .../main/java/org/apache/sis/util/Utilities.java   |  4 +-
 .../src/main/java/org/apache/sis/util/Version.java |  2 +-
 .../sis/util/collection/BackingStoreException.java |  2 +-
 .../java/org/apache/sis/util/collection/Cache.java |  4 +-
 .../apache/sis/util/collection/CacheEntries.java   |  2 +-
 .../apache/sis/util/collection/CodeListSet.java    |  4 +-
 .../sis/util/collection/DefaultTreeTable.java      |  2 +-
 .../org/apache/sis/util/collection/DerivedMap.java |  4 +-
 .../org/apache/sis/util/collection/DerivedSet.java |  4 +-
 .../org/apache/sis/util/collection/RangeSet.java   |  6 +-
 .../apache/sis/util/collection/TableColumn.java    |  2 +-
 .../apache/sis/util/collection/TreeNodeList.java   |  2 +-
 .../org/apache/sis/util/collection/TreeTable.java  |  2 +-
 .../sis/util/collection/TreeTableFormat.java       |  8 +--
 .../org/apache/sis/util/collection/TreeTables.java |  2 +-
 .../apache/sis/util/collection/WeakHashSet.java    |  4 +-
 .../sis/util/collection/WeakValueHashMap.java      |  2 +-
 .../sis/util/iso/AbstractInternationalString.java  | 10 +--
 .../sis/util/iso/DefaultInternationalString.java   |  6 +-
 .../sis/util/iso/ResourceInternationalString.java  | 10 +--
 .../sis/util/iso/SimpleInternationalString.java    |  4 +-
 .../org/apache/sis/util/logging/LoggerAdapter.java |  8 +--
 .../org/apache/sis/util/logging/LoggerFactory.java |  2 +-
 .../java/org/apache/sis/util/logging/Logging.java  |  2 +-
 .../apache/sis/util/logging/MonolineFormatter.java |  8 +--
 .../apache/sis/util/logging/PerformanceLevel.java  |  2 +-
 .../org/apache/sis/util/logging/package-info.java  |  4 +-
 .../java/org/apache/sis/util/resources/Errors.java |  2 +-
 .../sis/util/resources/IndexedResourceBundle.java  |  2 +-
 .../resources/ResourceInternationalString.java     |  2 +-
 .../apache/sis/util/resources/package-info.java    |  2 +-
 .../java/org/apache/sis/test/package-info.java     |  2 +-
 .../apache/sis/profile/france/package-info.java    |  2 +-
 src/main/javadoc/sis.css                           | 15 -----
 .../earthobservation/LandsatStoreProvider.java     |  2 +-
 .../org/apache/sis/storage/gdal/Proj4Factory.java  |  2 +-
 .../org/apache/sis/storage/gdal/package-info.java  |  4 +-
 .../sis/storage/geotiff/GeoTiffStoreProvider.java  |  2 +-
 .../sis/storage/geotiff/GridGeometryBuilder.java   |  2 +-
 .../sis/storage/geotiff/ImageFileDirectory.java    |  6 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |  2 +-
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |  2 +-
 .../apache/sis/storage/netcdf/package-info.java    |  2 +-
 .../org/apache/sis/storage/sql/package-info.java   |  2 +-
 .../sis/internal/storage/AbstractFeatureSet.java   |  2 +-
 .../sis/internal/storage/AbstractResource.java     |  2 +-
 .../sis/internal/storage/JoinFeatureSet.java       |  2 +-
 .../sis/internal/storage/ResourceOnFileSystem.java |  2 +-
 .../org/apache/sis/internal/storage/csv/Store.java |  2 +-
 .../sis/internal/storage/csv/StoreProvider.java    |  2 +-
 .../sis/internal/storage/csv/package-info.java     |  2 +-
 .../sis/internal/storage/io/ChannelData.java       |  2 +-
 .../sis/internal/storage/io/ChannelDataInput.java  |  4 +-
 .../sis/internal/storage/io/ChannelDataOutput.java |  4 +-
 .../sis/internal/storage/io/ChannelFactory.java    |  2 +-
 .../storage/io/ChannelImageInputStream.java        |  2 +-
 .../sis/internal/storage/io/IOUtilities.java       |  2 +-
 .../internal/storage/io/InputStreamAdapter.java    |  2 +-
 .../java/org/apache/sis/storage/Aggregate.java     |  4 +-
 .../main/java/org/apache/sis/storage/DataSet.java  |  2 +-
 .../java/org/apache/sis/storage/DataStore.java     |  8 +--
 .../org/apache/sis/storage/DataStoreException.java |  4 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |  8 +--
 .../org/apache/sis/storage/DataStoreRegistry.java  |  2 +-
 .../java/org/apache/sis/storage/DataStores.java    |  2 +-
 .../java/org/apache/sis/storage/FeatureNaming.java |  4 +-
 .../java/org/apache/sis/storage/ProbeResult.java   |  6 +-
 .../main/java/org/apache/sis/storage/Resource.java |  4 +-
 .../apache/sis/storage/event/StoreListeners.java   | 10 +--
 .../internal/storage/xml/stream/StaxStreamIO.java  |  2 +-
 .../storage/xml/stream/StaxStreamReader.java       |  2 +-
 .../storage/xml/stream/StaxStreamWriter.java       |  4 +-
 404 files changed, 907 insertions(+), 924 deletions(-)

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 @@ import org.apache.sis.internal.util.X364;
  *   <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 @@ import org.apache.sis.util.logging.MonolineFormatter;
  * 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 f9e055c..f86e825 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 @@ import org.apache.sis.util.Debug;
  * 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 {@link 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 e64c718..4e1005e 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
@@ -187,7 +187,7 @@ public abstract class GridCoverage {
      * 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 33b84a7..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 @@ import org.apache.sis.math.Vector;
  * }
  * </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 246b203..3b1680f 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
@@ -37,7 +37,7 @@ import org.opengis.feature.MultiValuedPropertyException;
  * 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 @@ public abstract class AbstractAssociation extends Field<Feature> implements Feat
     /**
      * Sets the associated feature.
      *
-     * <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 6128aed..3cf8027 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
@@ -54,7 +54,7 @@ import org.opengis.feature.MultiValuedPropertyException;
  *
  * {@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>
@@ -239,7 +239,7 @@ public abstract class AbstractAttribute<V> extends Field<V> implements Attribute
     /**
      * 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.
@@ -286,7 +286,7 @@ public abstract class AbstractAttribute<V> extends Field<V> implements Attribute
      * 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.
@@ -306,7 +306,7 @@ public abstract class AbstractAttribute<V> extends Field<V> implements Attribute
      *     }
      * }
      *
-     * <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 26a33ba..8cfb110 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
@@ -59,14 +59,14 @@ import org.opengis.feature.Operation;
  *
  * {@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>
@@ -313,7 +313,7 @@ public abstract class AbstractFeature implements Feature, Serializable {
      * 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
@@ -337,7 +337,7 @@ public abstract class AbstractFeature implements Feature, Serializable {
     /**
      * 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 35581f1..658d299 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
@@ -178,7 +178,7 @@ public class AbstractIdentifiedType implements IdentifiedType, Deprecable, Seria
      *   </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 fda0a6d..af664d1 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
@@ -36,7 +36,7 @@ import org.opengis.feature.AttributeType;
  * 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 44a88a0..847ae2d 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
@@ -50,7 +50,7 @@ import org.opengis.feature.PropertyNotFoundException;
  *       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 535be02..7312ab1 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
@@ -47,7 +47,7 @@ import org.opengis.feature.AttributeType;
  * Attribute characterization (discussed below) is similar to {@link java.lang.annotation.Annotation}.
  * </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:
  *
@@ -59,7 +59,7 @@ import org.opengis.feature.AttributeType;
  *   <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
@@ -84,7 +84,7 @@ import org.opengis.feature.AttributeType;
  * 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 19144b5..aad374f 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
@@ -60,12 +60,12 @@ import org.opengis.feature.PropertyNotFoundException;
  * compared to the Java language, {@code FeatureType} is equivalent to {@link Class} while
  * {@code Feature} instances are equivalent to {@link Object} instances of that class.</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>
@@ -84,13 +84,13 @@ import org.opengis.feature.PropertyNotFoundException;
  * 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 ({@link AttributeType} instances) given to the constructor are also immutable.
  * Such immutable instances can be shared by many objects and passed between threads without synchronization.
@@ -665,7 +665,7 @@ public class DefaultFeatureType extends AbstractIdentifiedType implements Featur
      * 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 b7627c2..8e49d8c 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
@@ -59,7 +59,7 @@ import org.opengis.feature.PropertyType;
  *   <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 77b6f6d..b75c880 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
@@ -41,7 +41,7 @@ import org.opengis.feature.FeatureAssociationRole;
  * <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
@@ -147,7 +147,7 @@ public final class FeatureOperations extends Static {
      * 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.
@@ -182,7 +182,7 @@ public final class FeatureOperations extends Static {
      *   <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.
@@ -246,11 +246,11 @@ public final class FeatureOperations extends Static {
      * {@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 00ff6b9..ebfe2aa 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
@@ -34,7 +34,7 @@ import org.opengis.feature.MultiValuedPropertyException;
  * <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 572eb0b..cf61e49 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
@@ -34,7 +34,7 @@ import org.opengis.feature.MultiValuedPropertyException;
  * <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 4601cc7..a037e34 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
@@ -30,7 +30,7 @@ import org.opengis.feature.InvalidPropertyValueException;
  * 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 235f75d..8b3b073 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
@@ -28,7 +28,7 @@ import org.opengis.feature.AttributeType;
  * 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 bb100fd..468997f 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
@@ -53,7 +53,7 @@ import org.opengis.feature.PropertyNotFoundException;
  * {@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 @@ import org.apache.sis.internal.feature.Resources;
  *     }
  * }
  *
- * <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 f3d4e6f..8eeeb3d 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
@@ -56,7 +56,7 @@ import org.opengis.feature.PropertyNotFoundException;
  *       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 @@ import static org.apache.sis.util.collection.Containers.hashMapCapacity;
  * 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 @@ import static org.apache.sis.util.collection.Containers.hashMapCapacity;
  *       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 @@ import org.apache.sis.xml.XLink;
 /**
  * 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 @@ public final class PrimitiveTypeProperties {
      * 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 @@ public final class PrimitiveTypeProperties {
      * {@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 @@ import org.apache.sis.internal.xml.XmlUtilities;
  * 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 @@ import javax.xml.bind.annotation.XmlType;
  * 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 @@ import javax.xml.bind.annotation.XmlType;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  *       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 @@ public abstract class GMLAdapter {
      * 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 @@ import org.apache.sis.measure.Units;
  * 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 eb81dbb..f318736 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
@@ -55,7 +55,7 @@ import static org.apache.sis.internal.util.CollectionsExt.nonNull;
  * 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 @@ package org.apache.sis.internal.xml;
  *   <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 @@ import org.apache.sis.util.collection.TreeTable;
  * </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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      * 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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      *
      * 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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      * 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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      * 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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      *       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 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
      * 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 83685d2..4018fdb 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
@@ -72,7 +72,7 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNullElement;
  * 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:
  *
@@ -84,7 +84,7 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNullElement;
  *       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
@@ -820,21 +820,21 @@ public class MetadataStandard implements Serializable {
      * {@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}
@@ -843,7 +843,7 @@ public class MetadataStandard implements Serializable {
      * 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}
@@ -914,7 +914,7 @@ public class MetadataStandard implements Serializable {
      *       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:
@@ -932,7 +932,7 @@ public class MetadataStandard implements Serializable {
      * 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.
@@ -964,7 +964,7 @@ public class MetadataStandard implements Serializable {
      * 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 @@ abstract class MetadataVisitor<R> {
      * 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 @@ import static org.apache.sis.internal.metadata.MetadataUtilities.valueIfDefined;
  * 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 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
      *   <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 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
      * 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 @@ import static org.apache.sis.util.collection.Containers.hashMapCapacity;
  *       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 @@ class PropertyAccessor {
      * 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 465e7da..d0f1a28 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 @@ import org.apache.sis.util.logging.Logging;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ final class TreeNodeChildren extends AbstractCollection<TreeTable.Node> {
      * 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 @@ final class TreeNodeChildren extends AbstractCollection<TreeTable.Node> {
      * 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 @@ import org.apache.sis.xml.NilReason;
  * {@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 c7d7e8a..443556d 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
@@ -54,7 +54,7 @@ import org.apache.sis.xml.Namespaces;
  * 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
@@ -72,7 +72,7 @@ import org.apache.sis.xml.Namespaces;
  *   </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 57cb0d0..e80b0d9 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
@@ -114,7 +114,7 @@ import org.apache.sis.math.FunctionProperty;
  * {@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}
@@ -122,7 +122,7 @@ import org.apache.sis.math.FunctionProperty;
  * 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 @@ public class ISOMetadata extends ModifiableMetadata implements IdentifiedObject,
      * 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 599614e..23299a8 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 @@ public class DefaultObjective extends ISOMetadata implements Objective {
     /**
      * 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 fc81b30..7161170 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 6a83995..e82ca78 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
@@ -96,7 +96,7 @@ public final class Citations extends Static {
      * 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:
      *
@@ -105,7 +105,7 @@ public final class Citations extends Static {
      *   <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>
@@ -155,7 +155,7 @@ public final class Citations extends Static {
      * 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.
@@ -180,7 +180,7 @@ public final class Citations extends Static {
      * 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>
@@ -203,7 +203,7 @@ public final class Citations extends Static {
      * 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>
@@ -236,7 +236,7 @@ public final class Citations extends Static {
      * <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:
      *
@@ -249,7 +249,7 @@ public final class Citations extends Static {
      * 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>
@@ -282,7 +282,7 @@ public final class Citations extends Static {
      * <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>
@@ -317,7 +317,7 @@ public final class Citations extends Static {
      * <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>
@@ -332,7 +332,7 @@ public final class Citations extends Static {
      * 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>
@@ -345,7 +345,7 @@ public final class Citations extends Static {
     /**
      * 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>
@@ -358,7 +358,7 @@ public final class Citations extends Static {
     /**
      * 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>
@@ -372,7 +372,7 @@ public final class Citations extends Static {
      * 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>
@@ -387,7 +387,7 @@ public final class Citations extends Static {
      * 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>
@@ -402,7 +402,7 @@ public final class Citations extends Static {
      * 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>
@@ -415,7 +415,7 @@ public final class Citations extends Static {
     /**
      * 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 041df02..6e2ff87 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
@@ -52,13 +52,13 @@ import static org.apache.sis.internal.metadata.MetadataUtilities.toMilliseconds;
  * {@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>
@@ -357,7 +357,7 @@ public class DefaultCitation extends ISOMetadata implements Citation {
      *
      * <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 f9d6f7c..0cc6a40 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
@@ -41,7 +41,7 @@ import org.apache.sis.internal.metadata.Dependencies;
  * <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:
  *
@@ -54,7 +54,7 @@ import org.apache.sis.internal.metadata.Dependencies;
  *       {@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 2c9e39d..4e5b356 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 @@ import org.opengis.metadata.constraint.LegalConstraints;
  * {@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 8292c8f..91fff93 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 242800a..bbb05bb 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
@@ -190,11 +190,11 @@ public class DefaultStandardOrderProcess extends ISOMetadata implements Standard
     /**
      * 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 5a1f02c..dd9ce34 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">
@@ -50,7 +50,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 @@ import org.apache.sis.xml.NilReason;
  *   <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 @@ import static java.lang.Double.doubleToLongBits;
  *   <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 @@ import static java.lang.Double.doubleToLongBits;
  * {@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 @@ import static java.lang.Double.doubleToLongBits;
  * 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 f661f0b..d169d0a 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 @@ import org.apache.sis.xml.NilReason;
  *   <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 26ddeb5..a2fe0f3 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
@@ -51,7 +51,7 @@ import org.apache.sis.xml.NilReason;
  *   <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 ea1c6ce..3ac8015 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
@@ -211,7 +211,7 @@ public final class Extents extends Static {
      * {@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:
      *
@@ -524,7 +524,7 @@ public final class Extents extends Static {
      * <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 376f9aa..e0fa384 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
@@ -51,7 +51,7 @@ import org.apache.sis.internal.jaxb.code.DS_InitiativeTypeCode;
  * According ISO 19115, at least one of {@linkplain #getAggregateDataSetName() aggregate dataset name}
  * and {@linkplain #getAggregateDataSetIdentifier() aggregate dataset identifier} 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/DefaultAssociatedResource.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultAssociatedResource.java
index fd47118..e045595 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
@@ -45,7 +45,7 @@ import org.apache.sis.metadata.iso.ISOMetadata;
  * 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 @@ import static org.apache.sis.internal.metadata.MetadataUtilities.ensurePositive;
  *   <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 1d12aa0..64e55b0 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
@@ -53,7 +53,7 @@ import static org.apache.sis.internal.metadata.MetadataUtilities.ensurePositive;
  * 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>
@@ -245,7 +245,7 @@ public class DefaultResolution extends ISOMetadata implements Resolution {
     /**
      * 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.
      *
@@ -271,7 +271,7 @@ public class DefaultResolution extends ISOMetadata implements Resolution {
     /**
      * 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.
      *
@@ -302,7 +302,7 @@ public class DefaultResolution extends ISOMetadata implements Resolution {
     /**
      * 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.
      *
@@ -335,7 +335,7 @@ public class DefaultResolution extends ISOMetadata implements Resolution {
     /**
      * 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.
      *
@@ -367,7 +367,7 @@ public class DefaultResolution extends ISOMetadata implements Resolution {
     /**
      * 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 dfe8ba0..a3a249a 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 24a9ceb..490471e 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
@@ -59,7 +59,7 @@ import org.apache.sis.internal.jaxb.metadata.MD_Scope;
  * 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 538e294..092242f 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
@@ -67,7 +67,7 @@ import org.apache.sis.util.iso.Types;
  * 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 14387d5..252f2ae 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 81f7d47..e78783d 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
@@ -53,7 +53,7 @@ import static org.apache.sis.util.collection.Containers.isNullOrEmpty;
  * 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>
@@ -321,7 +321,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
     /**
      * 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.
      *
@@ -345,7 +345,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
      * “<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.
      *
@@ -360,7 +360,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
     /**
      * 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.
      *
@@ -379,7 +379,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
      * “<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.
      *
@@ -394,7 +394,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
     /**
      * 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.
      *
@@ -413,7 +413,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
      * “<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.
      *
@@ -428,7 +428,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
     /**
      * 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.
      *
@@ -447,7 +447,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
      * “<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.
      *
@@ -462,7 +462,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
     /**
      * 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.
      *
@@ -487,7 +487,7 @@ public class DefaultScopeDescription extends ISOMetadata implements ScopeDescrip
      * 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 83ffb29..4b1119a 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 b940230..06827f2 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 9429bda..da2e79a 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 @@ import org.apache.sis.internal.xml.LegacyNamespaces;
  * 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 @@ public class DefaultQuantitativeResult extends AbstractResult implements Quantit
     /**
      * 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 214b9c1..ff09f09 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 @@ import org.apache.sis.util.resources.Messages;
  * 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 @@ public class DefaultGeorectified extends DefaultGridSpatialRepresentation implem
      * 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 @@ public class DefaultGeorectified extends DefaultGridSpatialRepresentation implem
      * 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 8b301fc..68933fa 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 @@ import org.apache.sis.internal.system.Loggers;
  * 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 @@ import org.apache.sis.internal.metadata.sql.SQLBuilder;
  * 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 75f15b8..17dad47 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
@@ -87,7 +87,7 @@ import org.apache.sis.util.iso.Types;
  *
  * 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.
@@ -101,7 +101,7 @@ import org.apache.sis.util.iso.Types;
  *   <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 990423f..9cf1602 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
@@ -67,7 +67,7 @@ import org.opengis.util.ControlledVocabulary;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.internal.jaxb.gco.CharSequenceAdapter;
  *   <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 @@ public class DefaultLocalName extends AbstractName implements LocalName {
     /**
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   <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 203fbec..1fb3f6c 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 @@ import static org.apache.sis.util.iso.DefaultNameSpace.DEFAULT_SEPARATOR_STRING;
  *   <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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   <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 @@ public class DefaultNameSpace implements NameSpace, Serializable {
      * <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 @@ import org.apache.sis.internal.metadata.RecordSchemaSIS;
  * 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 f277308..149f2a8 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
@@ -57,12 +57,12 @@ import org.apache.sis.internal.util.Strings;
  *   <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 1ef3a42..d107128 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
@@ -58,7 +58,7 @@ import org.apache.sis.internal.metadata.RecordSchemaSIS;
  * 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:
@@ -77,13 +77,13 @@ import org.apache.sis.internal.metadata.RecordSchemaSIS;
  * }
  * </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 @@ import org.apache.sis.internal.util.UnmodifiableArrayList;
  *   <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 @@ import org.apache.sis.util.UnknownNameException;
  *   <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 @@ import org.apache.sis.util.UnknownNameException;
  * {@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 @@ import java.io.ObjectStreamException;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  * 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 2efa1f8..cad4682 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 @@ import org.apache.sis.internal.util.CollectionsExt;
  * 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 @@ abstract class RecordDefinition {                                       // Inten
      * 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 2c22494..fda82dc 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
@@ -63,7 +63,7 @@ import org.apache.sis.internal.system.Loggers;
  *   </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 4e0eae5..d2b676e 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 @@ import org.opengis.metadata.citation.Citation;
  *     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 4cc681a..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 @@ public abstract class MarshalContext {
      * 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,7 +64,7 @@ public abstract class MarshalContext {
     /**
      * 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.
      *
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 @@ import org.apache.sis.util.CharSequences;
  *     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 @@ public class MarshallerPool {
      * 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 @@ public class MarshallerPool {
      * 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 @@ import org.apache.sis.internal.xml.LegacyNamespaces;
  *   <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 @@ package org.apache.sis.xml;
  * 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 @@ import org.apache.sis.internal.jaxb.PrimitiveTypeProperties;
  * {@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 @@ public final class NilReason implements Serializable {
      * 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 @@ import org.apache.sis.internal.jaxb.TypeRegistration;
  * 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 @@ public final class XML extends Static {
      * 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 @@ public final class XML extends Static {
      * 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 @@ public final class XML extends Static {
      * 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 @@ public final class XML extends Static {
      * 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 @@ public final class XML extends Static {
      * 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 @@ public final class XML extends Static {
      * 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 @@ public final strictfp class NameMapTest extends TestCase {
      * 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 a4703d4..a275bca 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
@@ -44,7 +44,7 @@ import static org.junit.Assert.*;
  * 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 56a76c7..e7b78d4 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
@@ -141,7 +141,7 @@ public strictfp class MetadataAssert extends Assert {
      *
      * 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 @@ import static org.junit.Assume.*;
  * 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-metadata/src/test/java/org/apache/sis/test/xml/SchemaCompliance.java b/core/sis-metadata/src/test/java/org/apache/sis/test/xml/SchemaCompliance.java
index 8b01faa..64b4e36 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/xml/SchemaCompliance.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/xml/SchemaCompliance.java
@@ -39,7 +39,7 @@ import org.apache.sis.util.StringBuilders;
  * <a href="https://standards.iso.org/iso/19115/-3/">https://standards.iso.org/iso/19115/-3/</a>.
  * All classes in a given directory are scanned.
  *
- * <div class="section">Limitations</div>
+ * <h2>Limitations</h2>
  * Current implementation ignores the XML prefix (e.g. {@code "cit:"} in {@code "cit:CI_Citation"}).
  * We assume that there is no name collision, especially given that {@code "CI_"} prefix in front of
  * most OGC/ISO class names have the effect of a namespace. If a collision nevertheless happen, then
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 f675f6c..5d3d781 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
@@ -201,7 +201,7 @@ public class GeohashReferenceSystem extends ReferencingByIdentifiers {
      * 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 b176415..eae965e 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
@@ -127,7 +127,7 @@ import org.opengis.referencing.gazetteer.LocationType;
  * }
  * </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.
@@ -349,7 +349,7 @@ public class MilitaryGridReferenceSystem extends ReferencingByIdentifiers {
      *
      * <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.
      *
@@ -1297,7 +1297,7 @@ public class MilitaryGridReferenceSystem extends ReferencingByIdentifiers {
      * 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 deb5dd9..e0ea4a6 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
@@ -78,7 +78,7 @@ import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
  * }
  * </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},
@@ -102,7 +102,7 @@ import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
  * 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 00e5062..fc92ae1 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
@@ -44,7 +44,7 @@ import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
 /**
  * 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 e7b02e1..ffbbdb8 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
@@ -72,7 +72,7 @@ import static org.apache.sis.math.MathFunctions.isNegativeZero;
  * <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).
@@ -95,13 +95,13 @@ import static org.apache.sis.math.MathFunctions.isNegativeZero;
  * </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:
@@ -403,7 +403,7 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      *     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
@@ -454,7 +454,7 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      *     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
@@ -700,11 +700,11 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      * 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
@@ -752,11 +752,11 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      *
      * <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:
      *
@@ -881,11 +881,11 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      *
      * <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.
@@ -1022,7 +1022,7 @@ public abstract class AbstractEnvelope extends FormattableObject implements Enve
      * 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 53b0cf9..5dd86cd 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
@@ -339,7 +339,7 @@ scanNumber: while ((i += Character.charCount(c)) < length) {
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureDimensionMatches;
  * 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 e85727c..6d9cd3c 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
@@ -61,7 +61,7 @@ import static org.apache.sis.geometry.AbstractEnvelope.isNegativeUnsafe;
  * 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).
@@ -691,7 +691,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -719,7 +719,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -741,7 +741,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -791,7 +791,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -813,7 +813,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -860,7 +860,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -950,7 +950,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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
@@ -1048,7 +1048,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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)}.
      *
@@ -1088,7 +1088,7 @@ public class Envelope2D extends Rectangle2D.Double implements Envelope, Emptiabl
      * 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..3a95a25 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 @@ import static org.apache.sis.util.StringBuilders.trimFractionalPart;
 /**
  * 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 @@ public final class Envelopes extends Static {
      * 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 @@ public final class Envelopes extends Static {
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureDimensionMatches;
  * 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 afcd2b6..6951a6b 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
@@ -69,7 +69,7 @@ import static org.apache.sis.math.MathFunctions.isNegativeZero;
  *       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).
@@ -96,7 +96,7 @@ import static org.apache.sis.math.MathFunctions.isNegativeZero;
  * </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:
  *
@@ -532,11 +532,11 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable, Seriali
      * 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):
@@ -612,17 +612,17 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable, Seriali
      * 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:
@@ -768,14 +768,14 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable, Seriali
     /**
      * 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:
@@ -960,7 +960,7 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable, Seriali
      *       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
@@ -972,13 +972,13 @@ public class GeneralEnvelope extends ArrayEnvelope implements Cloneable, Seriali
      *     }
      * }
      *
-     * <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 e2384e6..0124952 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
@@ -37,7 +37,7 @@ import static org.apache.sis.util.ArgumentChecks.ensureDimensionMatches;
  * 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 c3b4722..031c299 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
@@ -29,7 +29,7 @@ import org.opengis.metadata.Identifier;
  * 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
@@ -43,7 +43,7 @@ import org.opengis.metadata.Identifier;
  *   <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 @@ import org.apache.sis.metadata.iso.citation.Citations;
  * 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 @@ public final class NADCON extends AbstractProvider {
      * 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 @@ import org.apache.sis.metadata.iso.citation.Citations;
  * 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 @@ public enum Convention {
      * 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 @@ import org.apache.sis.internal.util.Constants;
  *       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 @@ public abstract class FormattableObject {
      *       (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 4533750..92780cd 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
@@ -894,7 +894,7 @@ public class Formatter implements Localized {
      * 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.
@@ -1637,7 +1637,7 @@ public class Formatter implements Localized {
      *
      * <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 b982e2d..f5aea8e 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
@@ -379,7 +379,7 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
      *     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.
@@ -654,7 +654,7 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
      * 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 @@ public class Symbols implements Localized, Cloneable, Serializable {
      * 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 @@ public class Symbols implements Localized, Cloneable, Serializable {
      * 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 @@ public class Symbols implements Localized, Cloneable, Serializable {
      * 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 @@ import org.apache.sis.util.Characters;
  * 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 @@ import org.apache.sis.util.Characters;
  * <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 @@ import org.apache.sis.util.Characters;
  * 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 @@ import org.apache.sis.util.LocalizedException;
 /**
  * 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 @@ import org.apache.sis.internal.referencing.ReferencingFactoryContainer;
  *   <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 @@ import org.apache.sis.internal.referencing.ReferencingFactoryContainer;
  * 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 @@ public class WKTFormat extends CompoundFormat<Object> {
      *   <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 e3bed60..ebfc70a 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
@@ -46,7 +46,7 @@ import static org.apache.sis.util.Utilities.deepEquals;
  * 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 @@ import static org.apache.sis.util.Utilities.deepEquals;
  *     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 @@ public class DefaultParameterValue<T> extends FormattableObject implements Param
      * 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 @@ public class DefaultParameterValue<T> extends FormattableObject implements Param
      * 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 @@ convert:            if (componentType != null) {
      *       {@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 @@ convert:            if (componentType != null) {
      * 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 @@ convert:            if (componentType != null) {
      * 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 @@ convert:            if (componentType != null) {
      *   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 @@ import org.apache.sis.util.Utilities;
  *       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 @@ import org.apache.sis.util.Utilities;
  * 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 @@ public class DefaultParameterValueGroup extends Parameters implements LenientCom
      * 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 @@ public class DefaultParameterValueGroup extends Parameters implements LenientCom
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  * </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 @@ public interface Parameterized {
     /**
      * 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 ce0c72f..3496127 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 @@ import org.apache.sis.util.Debug;
  * 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 @@ import org.apache.sis.util.Debug;
  * </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 @@ import org.apache.sis.util.Debug;
  * (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 1900bec..fc4fbfc 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ public class TensorParameters<E> implements Serializable {
      * }</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 @@ public class TensorParameters<E> implements Serializable {
      * 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 @@ public class TensorParameters<E> implements Serializable {
      * 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 @@ public class TensorParameters<E> implements Serializable {
      * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 fe03695..2823f05 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
@@ -89,7 +89,7 @@ import static org.apache.sis.internal.util.CollectionsExt.immutableSet;
  *   <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.
@@ -111,7 +111,7 @@ import static org.apache.sis.internal.util.CollectionsExt.immutableSet;
  *       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 Identifier}, {@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,
@@ -301,7 +301,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      *   </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}.
@@ -311,7 +311,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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.
@@ -459,7 +459,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * <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>
@@ -515,7 +515,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
     /**
      * 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}.
      *
@@ -580,7 +580,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      *       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},
@@ -594,7 +594,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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)
@@ -608,7 +608,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      *       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
@@ -660,7 +660,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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
@@ -671,7 +671,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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}
@@ -785,7 +785,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * <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.
      *
@@ -812,7 +812,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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:
@@ -858,7 +858,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * }
      * </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(…)}
@@ -1016,7 +1016,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * {@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).
@@ -1036,7 +1036,7 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
      * 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 2f0874d..1f3457a 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 @@ import static org.apache.sis.util.collection.Containers.property;
  *   <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 2357abe..0c71bf6 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
@@ -78,7 +78,7 @@ import static org.apache.sis.util.ArgumentChecks.*;
  *       {@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">
@@ -116,7 +116,7 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * <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
@@ -142,11 +142,11 @@ import static org.apache.sis.util.ArgumentChecks.*;
  *   </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>
@@ -478,12 +478,12 @@ public abstract class Builder<B extends Builder<B>> {
      * 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}.
@@ -570,7 +570,7 @@ public abstract class Builder<B extends Builder<B>> {
      * {@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}.
@@ -596,7 +596,7 @@ public abstract class Builder<B extends Builder<B>> {
      * {@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}.
@@ -623,7 +623,7 @@ public abstract class Builder<B extends Builder<B>> {
      * {@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 7c0c231..b139c7a 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
@@ -104,7 +104,7 @@ import org.opengis.geometry.Geometry;
  *   <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
@@ -124,7 +124,7 @@ import org.opengis.geometry.Geometry;
  *   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
@@ -278,7 +278,7 @@ public final class CRS extends Static {
      * 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:
@@ -393,7 +393,7 @@ public final class CRS extends Static {
      *   <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.
@@ -875,7 +875,7 @@ public final class CRS extends Static {
      * {@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
@@ -883,7 +883,7 @@ public final class CRS extends Static {
      * 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:
      *
@@ -925,7 +925,7 @@ public final class CRS extends Static {
      * 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}
@@ -1159,7 +1159,7 @@ public final class CRS extends Static {
      * 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 @@ class GeodesicsOnEllipsoid extends GeodeticCalculator {
      *
      * 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 @@ import static org.apache.sis.internal.metadata.ReferencingServices.NAUTICAL_MILE
  *   </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 @@ import static org.apache.sis.internal.metadata.ReferencingServices.NAUTICAL_MILE
  * 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 fc91821..17b943c 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
@@ -299,7 +299,7 @@ public final class IdentifiedObjects extends Static {
      * 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 3791bbb..97de5bb 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
@@ -47,7 +47,7 @@ import static org.apache.sis.util.collection.Containers.property;
  * {@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
@@ -56,7 +56,7 @@ import static org.apache.sis.util.collection.Containers.property;
  * 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)
@@ -250,7 +250,7 @@ public class ImmutableIdentifier extends FormattableObject implements Identifier
      *   </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 2d8ba4c..84ef85c 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
@@ -56,7 +56,7 @@ import org.apache.sis.util.ArgumentChecks;
  * {@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>
@@ -75,7 +75,7 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 c76a353..30c7b97 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 @@ import static org.apache.sis.internal.referencing.WKTUtilities.toFormattable;
  *
  * 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 1379aa0..2b57f12 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
@@ -87,7 +87,7 @@ import org.apache.sis.io.wkt.Convention;
  * 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>
@@ -104,7 +104,7 @@ import org.apache.sis.io.wkt.Convention;
  *
  * 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
@@ -562,7 +562,7 @@ public class DefaultCompoundCRS extends AbstractCRS implements CompoundCRS {
     /**
      * 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 9b44dea..ce7b720 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
@@ -88,7 +88,7 @@ import org.opengis.referencing.datum.ParametricDatum;
  * 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
@@ -190,7 +190,7 @@ public class DefaultDerivedCRS extends AbstractDerivedCRS<Conversion> implements
      * 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 2e92f28..8d8965e 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   {@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 798cd98..e9256b9 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 @@ import org.apache.sis.referencing.AbstractReferenceSystem;
  *   {@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 @@ import org.apache.sis.referencing.AbstractReferenceSystem;
  *     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 b82b997..44ce788 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 @@ import static org.apache.sis.internal.util.Constants.CRS84;
  *   {@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 @@ import static org.apache.sis.internal.util.Constants.CRS84;
  *     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 @@ public class DefaultGeographicCRS extends DefaultGeodeticCRS implements Geograph
     /**
      * 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 4fed78f..5931780 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   {@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 ac910ab..8e83767 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
@@ -46,7 +46,7 @@ import org.opengis.referencing.datum.ParametricDatum;
  *   {@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 2338eb7..989b6ba 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 @@ import static org.apache.sis.internal.referencing.WKTUtilities.toFormattable;
  *   {@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 1286ae9..fc4b07a 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 @@ import static org.apache.sis.internal.util.StandardDateFormat.MILLIS_PER_SECOND;
  *   {@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 16b5b88..159aa74 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   {@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 00e9d08..15f95b4 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 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * (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 @@ import org.apache.sis.measure.Units;
  *   </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 @@ import org.apache.sis.measure.Units;
  * 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 @@ public enum AxesConvention implements AxisFilter {
      * {@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 @@ import javax.measure.Unit;
  * 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 @@ public final class CoordinateSystems extends Static {
      * {@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 @@ public final class CoordinateSystems extends Static {
      * 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 @@ public final class CoordinateSystems extends Static {
      * 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 @@ public final class CoordinateSystems extends Static {
      * <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 @@ public final class CoordinateSystems extends Static {
      * ({@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 @@ public final class CoordinateSystems extends Static {
      *     });
      * }</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 0bc88d6..1d632bc 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 @@ import org.apache.sis.measure.Units;
  *   <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 c92b259..08259fe 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 @@ import org.apache.sis.measure.Angle;
  *   <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 1d8e7c9..f5e023e 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 @@ import static org.apache.sis.util.Utilities.deepEquals;
  *   <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 17102e0..10a2664 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 @@ import static org.apache.sis.internal.referencing.NilReferencingObject.UNNAMED;
 /**
  * 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 @@ import static org.apache.sis.internal.referencing.NilReferencingObject.UNNAMED;
  * 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 @@ public class DefaultCoordinateSystemAxis extends AbstractIdentifiedObject implem
      * 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 @@ public class DefaultCoordinateSystemAxis extends AbstractIdentifiedObject implem
     /**
      * 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 d147c29..f753a20 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 @@ import org.apache.sis.measure.Units;
  *   <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 28711cc..5982a82 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 @@ import org.apache.sis.measure.Units;
  *   <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 e86b162..9833869 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 @@ import org.apache.sis.measure.Units;
  *   <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 3f9c616..6b24b18 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
@@ -38,7 +38,7 @@ import org.opengis.referencing.cs.ParametricCS;
  *   <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 18a3eea..f4557d4 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 @@ import org.apache.sis.measure.Units;
  *   <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 ab171a7..59b3997 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 @@ import org.apache.sis.measure.Units;
  *   <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 f0e6c37..e0baaee 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 @@ import org.apache.sis.measure.Units;
  *   <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 d5e9ec0..ae8b520 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 @@ import org.opengis.referencing.cs.CoordinateSystemAxis;
  *   <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 373add8..6366d1e 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 @@ import org.apache.sis.measure.Units;
  *   <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 @@ import org.apache.sis.util.resources.Errors;
  * 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 38ba50e..9536826 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 @@ import java.util.Objects;
  * {@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 @@ public class AbstractDatum extends AbstractIdentifiedObject implements Datum {
      *       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 @@ import java.util.Objects;
  *       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 @@ import java.util.Objects;
  * 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 @@ public class BursaWolfParameters extends FormattableObject implements Cloneable,
      * {@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 @@ import org.apache.sis.measure.Units;
  *
  * 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 @@ import org.apache.sis.measure.Units;
  * 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 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
      * 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 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
      * 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 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
      *   └                   ┘         └                             ┘
      * }
      *
-     * <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 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
      *   └                   ┘         └                                                        ┘
      * }
      *
-     * <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 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
      * 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 a004719..e272c20 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   <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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *     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 0c06e0e..bddab2c 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 @@ import org.apache.sis.io.wkt.Formatter;
  * 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 5e3dfe5..47cf530 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 @@ import static org.apache.sis.internal.referencing.WKTUtilities.toFormattable;
  * 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 @@ import static org.apache.sis.internal.referencing.WKTUtilities.toFormattable;
  *   </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 @@ import static org.apache.sis.internal.referencing.WKTUtilities.toFormattable;
  *     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 @@ public class DefaultGeodeticDatum extends AbstractDatum implements GeodeticDatum
      * 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 @@ public class DefaultGeodeticDatum extends AbstractDatum implements GeodeticDatum
      *       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 @@ public class DefaultGeodeticDatum extends AbstractDatum implements GeodeticDatum
      * <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 8f7e0ca..ddae660 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  * 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 428f062..c9c9200 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
@@ -30,7 +30,7 @@ import org.opengis.referencing.datum.ParametricDatum;
 /**
  * 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).
  *
@@ -43,7 +43,7 @@ import org.opengis.referencing.datum.ParametricDatum;
  *       {@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 d96d7cf..ef2decc 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
 /**
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *     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 @@ public class DefaultPrimeMeridian extends AbstractIdentifiedObject implements Pr
      * 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 e67fa9e..9e7f2ce 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
 /**
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *     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 226e67a..355b4ff 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  * {@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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *     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 @@ import static java.lang.Math.*;
 /**
  * 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 @@ import org.apache.sis.util.iso.SimpleInternationalString;
  *   </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 @@ import org.apache.sis.util.iso.SimpleInternationalString;
  * <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 @@ import org.apache.sis.util.resources.Messages;
  * (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 @@ public abstract class ConcurrentAuthorityFactory<DAO extends GeodeticAuthorityFa
      * 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 @@ public abstract class ConcurrentAuthorityFactory<DAO extends GeodeticAuthorityFa
      * 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 e904db4..4f272cc 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
@@ -146,7 +146,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
@@ -170,7 +170,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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,
@@ -214,7 +214,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -260,7 +260,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -295,7 +295,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -331,7 +331,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -363,7 +363,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -382,7 +382,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
     /**
      * 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.
      *
@@ -401,7 +401,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
     /**
      * 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.
      *
@@ -431,7 +431,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -450,7 +450,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -479,7 +479,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -499,7 +499,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -534,7 +534,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -568,7 +568,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -603,7 +603,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -622,7 +622,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
     /**
      * 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.
      *
@@ -641,7 +641,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
     /**
      * 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.
      *
@@ -673,7 +673,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -693,7 +693,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -725,7 +725,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -759,7 +759,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -790,7 +790,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -826,7 +826,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -860,7 +860,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -890,7 +890,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -909,7 +909,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -927,7 +927,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
     /**
      * 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.
      *
@@ -960,7 +960,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -990,7 +990,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -1009,7 +1009,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -1028,7 +1028,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -1060,7 +1060,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -1097,7 +1097,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *
      * 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.
      *
@@ -1130,7 +1130,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -1158,7 +1158,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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.
      *
@@ -1193,7 +1193,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *   <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.
      *
@@ -1215,7 +1215,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * 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 d32a37a..33250aa 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 @@ import org.apache.sis.xml.XML;
  * (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 @@ import org.apache.sis.xml.XML;
  *   </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}.
@@ -1622,7 +1622,7 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory
      * 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 @@ import org.apache.sis.util.Utilities;
  *   <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 @@ public class IdentifiedObjectFinder {
      * 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 @@ import org.apache.sis.util.Classes;
  *
  * <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 @@ import org.opengis.util.FactoryException;
  * 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 @@ import org.apache.sis.util.collection.BackingStoreException;
  * 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 @@ import org.apache.sis.util.collection.BackingStoreException;
  * {@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 @@ import org.apache.sis.util.collection.BackingStoreException;
  * 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 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
      * 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 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
      * {@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 @@ import org.opengis.referencing.AuthorityFactory;
  * 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 d9bf57f..8bc9101 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 @@ final class EPSGCodeFinder extends IdentifiedObjectFinder {
      * 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 f4ff54c..7d6d56e 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
@@ -126,7 +126,7 @@ import static org.apache.sis.internal.referencing.ServicesForMetadata.CONNECTION
  * 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
@@ -135,7 +135,7 @@ import static org.apache.sis.internal.referencing.ServicesForMetadata.CONNECTION
  * 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}.
@@ -144,7 +144,7 @@ import static org.apache.sis.internal.referencing.ServicesForMetadata.CONNECTION
  * 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.
@@ -505,7 +505,7 @@ addURIs:    for (int i=0; ; i++) {
      * 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:
@@ -642,7 +642,7 @@ addURIs:    for (int i=0; ; i++) {
      * 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 @@ import org.apache.sis.util.Localized;
  * 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 @@ import org.apache.sis.internal.util.Constants;
  *     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 @@ public abstract class InstallationScriptProvider extends InstallationResources {
      * 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 @@ public abstract class InstallationScriptProvider extends InstallationResources {
      *
      * 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 @@ import org.apache.sis.internal.metadata.sql.SQLUtilities;
  * 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 @@ import static org.apache.sis.util.Utilities.deepEquals;
  *   <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 @@ public class AbstractCoordinateOperation extends AbstractIdentifiedObject implem
      *   </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 @@ check:      for (int isTarget=0; ; isTarget++) {        // 0 == source check; 1
      * 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 @@ check:      for (int isTarget=0; ; isTarget++) {        // 0 == source check; 1
      * 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 79bbbbc..a0bfc03 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 @@ import static org.apache.sis.util.Utilities.equalsIgnoreMetadata;
  *   </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 @@ public class CoordinateOperationFinder extends CoordinateOperationRegistry {
      * 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 eb4260e..24c5732 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
@@ -160,7 +160,7 @@ final class DefaultConcatenatedOperation extends AbstractCoordinateOperation imp
      * 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 @@ import org.apache.sis.util.Utilities;
  * {@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 @@ import org.apache.sis.util.Utilities;
  *  {@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 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
      *   </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 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
      * {@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 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.*;
  *     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 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * {@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 @@ import org.apache.sis.util.ArgumentChecks;
  * {@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 @@ import org.apache.sis.util.Classes;
  * 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 @@ import static org.apache.sis.referencing.operation.builder.ResidualGrid.SOURCE_D
  * 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 @@ import org.apache.sis.internal.referencing.ExtendedPrecisionMatrix;
 /**
  * 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 fc656b7..b0bf6e2 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 @@ public final class Matrices extends Static {
      * Actually this method is used more often for {@linkplain org.opengis.coverage.grid.GridEnvelope 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 @@ public final class Matrices extends Static {
      * (<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 @@ public final class Matrices extends Static {
      * Actually this method is used more often for {@linkplain org.opengis.coverage.grid.GridEnvelope 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 @@ public abstract class MatrixSIS implements Matrix, LenientComparable, Cloneable,
      * 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 @@ public abstract class MatrixSIS implements Matrix, LenientComparable, Cloneable,
      * 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 @@ public abstract class MatrixSIS implements Matrix, LenientComparable, Cloneable,
      * 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 @@ abstract class ConformalProjection extends NormalizedProjection {
      * 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 @@ abstract class ConformalProjection extends NormalizedProjection {
      * </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 @@ abstract class ConformalProjection extends NormalizedProjection {
      * 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 @@ import static org.apache.sis.internal.referencing.provider.LambertCylindricalEqu
  *   <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 @@ import static org.apache.sis.math.MathFunctions.isPositive;
  * 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 @@ import static org.apache.sis.math.MathFunctions.isPositive;
  * <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 @@ import static org.apache.sis.math.MathFunctions.isPositive;
  * 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 6fcc036..b6e2a0d 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 @@ import static java.lang.Math.*;
  * 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 @@ public abstract class NormalizedProjection extends AbstractMathTransform2D imple
      *   </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 @@ public abstract class NormalizedProjection extends AbstractMathTransform2D imple
      * 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 @@ public abstract class NormalizedProjection extends AbstractMathTransform2D imple
      * <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 @@ public abstract class NormalizedProjection extends AbstractMathTransform2D imple
      * {@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 @@ import static org.apache.sis.internal.referencing.provider.ObliqueStereographic.
  * 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 @@ import org.opengis.referencing.operation.TransformException;
 /**
  * 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 @@ import static org.apache.sis.internal.referencing.provider.SatelliteTracking.*;
  *       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 @@ import static org.apache.sis.internal.referencing.provider.TransverseMercator.*;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureDimensionMatches;
  *
  * 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 @@ public abstract class AbstractMathTransform extends FormattableObject
      * 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 @@ public abstract class AbstractMathTransform extends FormattableObject
      *   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 @@ public abstract class AbstractMathTransform extends FormattableObject
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureDimensionMatches;
  *   <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 @@ public abstract class AbstractMathTransform1D extends AbstractMathTransform impl
      * 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 @@ import org.apache.sis.internal.referencing.j2d.ShapeUtilities;
  *
  * 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 @@ public abstract class AbstractMathTransform2D extends AbstractMathTransform impl
      * 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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.util.ArgumentChecks;
  *   </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 @@ import org.apache.sis.util.Debug;
  * 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 daf6ce0..c07fbfa 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ public class DefaultMathTransformFactory extends AbstractFactory implements Math
      * 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 @@ public class EllipsoidToCentricTransform extends AbstractMathTransform implement
      *   <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 @@ import org.apache.sis.util.ComparisonMode;
  * }
  * </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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.util.Debug;
  * 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 @@ import org.apache.sis.internal.referencing.DirectPositionView;
  * <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 @@ public class InterpolatedTransform extends DatumShiftTransform {
      * {@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 @@ package org.apache.sis.referencing.operation.transform;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * <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 @@ import org.opengis.referencing.operation.NoninvertibleTransformException;
  *       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 @@ import org.opengis.referencing.operation.NoninvertibleTransformException;
  * <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 @@ import org.opengis.referencing.operation.NoninvertibleTransformException;
  *
  * <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 @@ import org.apache.sis.util.ComparisonMode;
  *
  * <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 @@ import org.opengis.referencing.operation.MathTransformFactory;
  * 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 @@ public interface MathTransformProvider {
      * }
      * </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 @@ import static java.lang.Math.*;
  *       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 @@ import org.apache.sis.referencing.operation.DefaultOperationMethod;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.*;
  * }
  * </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 @@ import org.apache.sis.util.ComparisonMode;
  * <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 @@ import org.apache.sis.referencing.operation.matrix.Matrix2;
  *       <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/internal/referencing/provider/NTv2Test.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/NTv2Test.java
index 537fbd9..5d29b20 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
@@ -187,7 +187,7 @@ public final strictfp class NTv2Test extends DatumShiftTestCase {
      * 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 @@ public final strictfp class DefaultGeocentricCRSTest extends TestCase {
     /**
      * 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 @@ public abstract strictfp class MatrixTestCase extends TestCase {
      * 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 @@ import static org.apache.sis.referencing.operation.matrix.MatrixTestCase.assertE
  * 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 b0a266b..7ccb2c3 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
@@ -93,7 +93,7 @@ public final strictfp class LambertConicConformalTest extends MapProjectionTestC
      * 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 @@ import org.apache.sis.math.FunctionProperty;
 /**
  * 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 @@ public final class AngleConverter extends SystemConverter<Angle,Double> {
     /**
      * 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 @@ import org.apache.sis.util.UnconvertibleObjectException;
  * 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 @@ import org.apache.sis.util.UnconvertibleObjectException;
  * <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 @@ import org.apache.sis.util.ObjectConverter;
  * <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 @@ import org.apache.sis.math.FunctionProperty;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ public class ConverterRegistry {
      * 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 @@ public class ConverterRegistry {
      * 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 @@ public class ConverterRegistry {
      * 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 @@ import org.apache.sis.math.FunctionProperty;
 /**
  * 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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.math.FunctionProperty;
 /**
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ import org.apache.sis.util.resources.Errors;
  * {@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 @@ import org.apache.sis.math.FunctionProperty;
  *     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 @@ import org.apache.sis.util.UnconvertibleObjectException;
 /**
  * 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 @@ import org.apache.sis.measure.Units;
  * 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 @@ import org.apache.sis.measure.Units;
  *   <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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ abstract class SystemConverter<S,T> extends ClassPair<S,T> implements ObjectConv
      * 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 @@ import org.apache.sis.internal.system.Modules;
  * 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 @@ import org.apache.sis.util.logging.Logging;
  *   <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 @@ import java.util.concurrent.atomic.AtomicLong;
 /**
  * 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 @@ import org.apache.sis.util.logging.Logging;
  * 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 @@ import org.apache.sis.util.Static;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   <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 @@ import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *   <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 @@ import org.apache.sis.math.DecimalFunctions;
  *     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 @@ public final class DoubleDouble extends Number {
      * 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 @@ public final class DoubleDouble extends Number {
      * 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 @@ public final class DoubleDouble extends Number {
      * 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 @@ public final class DoubleDouble extends Number {
      * 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 @@ public final class DoubleDouble extends Number {
     /**
      * 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 @@ public final class Numerics extends Static {
      * 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 @@ public final class Strings extends Static {
      * 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 @@ import org.apache.sis.util.collection.CheckedContainer;
  * 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 @@ public class UnmodifiableArrayList<E> extends AbstractList<E> implements RandomA
      * 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 @@ public class UnmodifiableArrayList<E> extends AbstractList<E> implements RandomA
      * 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 @@ public class UnmodifiableArrayList<E> extends AbstractList<E> implements RandomA
      * <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 @@ import static org.apache.sis.util.Characters.isLineOrParagraphSeparator;
  * 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 @@ import org.apache.sis.util.Classes;
 /**
  * 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 @@ import static org.apache.sis.internal.util.StandardDateFormat.UTC;
  *   <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 @@ import org.apache.sis.internal.util.LocalizedParseException;
  * 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 dfabac8..1df8894 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 @@ import org.apache.sis.internal.util.X364;
  * 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 659192a..726f748 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 @@ import org.apache.sis.util.resources.Errors;
  *   <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 @@ public abstract class TabularFormat<T> extends CompoundFormat<T> {
      *   <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 @@ import org.apache.sis.util.resources.Errors;
  * 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 @@ public final class DecimalFunctions extends Static {
      * 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 02020dc..51a7c96 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 @@ public final class MathFunctions extends Static {
      *
      * 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 @@ public final class MathFunctions extends Static {
      *   <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 @@ import static java.lang.Double.doubleToLongBits;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureValidIndex;
  *   <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 @@ import static org.apache.sis.util.ArgumentChecks.ensureValidIndex;
  *     // 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 @@ public abstract class Vector extends AbstractList<Number> implements RandomAcces
      * 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 @@ public abstract class Vector extends AbstractList<Number> implements RandomAcces
      * 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 @@ search:     for (;;) {
      * 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 @@ import static org.apache.sis.math.MathFunctions.isNegative;
  *   <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 @@ import org.opengis.referencing.cs.AxisDirection;        // For javadoc
  * 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 @@ import org.apache.sis.internal.simple.SimpleCharacterIterator;
  * 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 @@ import org.opengis.referencing.cs.AxisDirection;
  * {@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 @@ import org.opengis.referencing.cs.AxisDirection;
  * 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 963e95e..d1691dd 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 @@ import org.apache.sis.util.resources.Errors;
  *   <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 a3dad27..c5d4989 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 @@ import org.apache.sis.util.collection.WeakHashSet;
  *   <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 @@ import org.apache.sis.util.collection.WeakHashSet;
  * {@linkplain org.opengis.coverage.DiscreteCoverage discrete coverages}, the {@code NumberRange} class can
  * also be used with {@linkplain org.opengis.coverage.ContinuousCoverage 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 f7bec2e..e192dcb 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 @@ import org.apache.sis.util.Numbers;
  * 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 @@ import org.apache.sis.util.Numbers;
  * 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 {@linkplain org.opengis.geometry.TransfiniteSet transfinite}) of feature attribute
  * values associated by a function (the {@linkplain org.opengis.coverage.Coverage coverage}) with the
@@ -72,7 +72,7 @@ import org.apache.sis.util.Numbers;
  * numeric ranges can be associated to {@linkplain org.opengis.coverage.ContinuousCoverage
  * 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 @@ import org.apache.sis.internal.util.Numerics;
  * 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 @@ import org.apache.sis.internal.util.Numerics;
  *       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 @@ import static org.apache.sis.math.MathFunctions.truncate;
  * 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 @@ import org.apache.sis.util.logging.Logging;
  * 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 @@ public class UnitFormat extends Format implements javax.measure.format.UnitForma
          * 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 @@ public class UnitFormat extends Format implements javax.measure.format.UnitForma
      * 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 @@ public final class Units extends Static {
      * 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 2b3fac2..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 @@ import org.apache.sis.internal.system.Modules;
  * <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:
  *
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 @@ import org.apache.sis.util.resources.Errors;
  *       {@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 @@ import java.lang.reflect.Array;
  *       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 @@ public final class ArraysExt extends Static {
      * 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 @@ import static java.lang.Character.*;
  * 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 @@ import static java.lang.Character.*;
  * 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 @@ public final class CharSequences extends Static {
     /**
      * 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 @@ search:     for (; fromIndex <= toIndex; fromIndex++) {
      * 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 @@ searchWordBreak:    while (true) {
      *   <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 @@ cmp:    while (ia < lga) {
      * 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 @@ cmp:    while (ia < lga) {
      * 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 @@ public final class Characters extends Static {
      * 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 @@ public final class Classes extends Static {
      * 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 @@ public enum ComparisonMode {
      * 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 @@ public enum ComparisonMode {
      * 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 @@ public enum ComparisonMode {
      * 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 @@ public enum ComparisonMode {
      * 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 @@ import org.opengis.referencing.IdentifiedObject;
  *   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 @@ package org.apache.sis.util;
  * 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 @@ package org.apache.sis.util;
  * 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 @@ public interface LenientComparable {
      *        <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 @@ import org.apache.sis.math.FunctionProperty;
  * {@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 @@ import static java.lang.Character.*;
  * 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 @@ public final class StringBuilders extends Static {
      * 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 @@ public final class Utilities extends Static {
      * 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 @@ public final class Utilities extends Static {
      *       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 @@ import static org.apache.sis.internal.system.Modules.MINOR_VERSION;
  * <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 @@ import java.sql.SQLException;
  *     }
  * }
  *
- * <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 @@ import org.apache.sis.internal.system.ReferenceQueueConsumer;
  * }
  *
  *
- * <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 @@ import org.apache.sis.internal.system.ReferenceQueueConsumer;
  * 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 @@ import java.lang.ref.Reference;
  * <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 @@ import org.apache.sis.internal.util.CheckedArrayList;
  * 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 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
      * 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 @@ import org.apache.sis.math.FunctionProperty;
  *       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 @@ import org.apache.sis.math.FunctionProperty;
  *   <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 @@ import org.apache.sis.internal.util.SetOfUnknownSize;
  *       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 @@ import org.apache.sis.internal.util.SetOfUnknownSize;
  *       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 @@ import static org.apache.sis.util.Numbers.*;
  *       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 @@ import static org.apache.sis.util.Numbers.*;
  * 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 @@ import static org.apache.sis.util.Numbers.*;
  *   <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 @@ import org.apache.sis.util.iso.SimpleInternationalString;
  *     }
  * }
  *
- * <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 @@ import org.apache.sis.util.resources.Errors;
  * <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 d0ba260..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
@@ -279,7 +279,7 @@ public interface TreeTable {
          * 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 f6fb420..1b4188d 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 @@ import static org.apache.sis.util.Characters.NO_BREAK_SPACE;
  * 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 @@ import static org.apache.sis.util.Characters.NO_BREAK_SPACE;
  * 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 @@ public class TreeTableFormat extends TabularFormat<TreeTable> {
      * 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 @@ public class TreeTableFormat extends TabularFormat<TreeTable> {
      *   <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 @@ import org.apache.sis.util.ArgumentChecks;
  * <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 @@ import static org.apache.sis.util.collection.WeakEntry.*;
  * 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 @@ import static org.apache.sis.util.collection.WeakEntry.*;
  *
  * 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 @@ import static org.apache.sis.util.collection.WeakEntry.*;
  * <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 ed08d7e..827fa94 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
@@ -35,7 +35,7 @@ import org.apache.sis.util.CharSequences;
  * 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:
  *
@@ -57,12 +57,12 @@ public abstract class AbstractInternationalString implements InternationalString
      * 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.
@@ -119,14 +119,14 @@ public abstract class AbstractInternationalString implements InternationalString
      * 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 @@ import org.apache.sis.internal.system.Modules;
  * 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 @@ public class DefaultInternationalString extends AbstractInternationalString impl
      * 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 @@ public class DefaultInternationalString extends AbstractInternationalString impl
      *       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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ public class ResourceInternationalString extends AbstractInternationalString imp
      * 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 @@ public class ResourceInternationalString extends AbstractInternationalString imp
      * {@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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ import org.apache.sis.util.Debug;
  * 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 @@ import org.apache.sis.util.Debug;
  * 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 @@ import org.apache.sis.util.Debug;
  * 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 @@ public abstract class LoggerAdapter extends Logger {
     /**
      * 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 @@ import org.apache.sis.util.collection.WeakValueHashMap;
  * 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 @@ public final class Logging extends Static {
      * 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 @@ import static org.apache.sis.internal.util.StandardDateFormat.UTC;
  *       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 @@ import static org.apache.sis.internal.util.StandardDateFormat.UTC;
  *     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 @@ public class MonolineFormatter extends Formatter {
     /**
      * 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 @@ loop:   for (int i=0; ; i++) {
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensurePositive;
  * 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 @@ import org.opengis.util.InternationalString;
 /**
  * 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 48d3ad9..1427a08 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
@@ -69,7 +69,7 @@ import org.apache.sis.measure.Range;
  *   <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 @@ import org.apache.sis.util.iso.AbstractInternationalString;
  * {@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/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 55b82bf..1710847 100644
--- a/src/main/javadoc/sis.css
+++ b/src/main/javadoc/sis.css
@@ -182,21 +182,6 @@ div.warning:before {
 
 
 /*
- * 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 @@ import org.apache.sis.internal.storage.wkt.FirstKeywordPeek;
  * 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 @@ public class Proj4Factory extends GeodeticAuthorityFactory implements CRSAuthori
      * 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 @@ import org.apache.sis.internal.util.Constants;
  * 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 @@ import org.apache.sis.math.Vector;
  * 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 @@ final class ImageFileDirectory extends AbstractGridResource {
      * <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 @@ final class ImageFileDirectory extends AbstractGridResource {
      * 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 @@ final class ImageFileDirectory extends AbstractGridResource {
      * 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 1b2f74f..92c4b8d 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
@@ -99,7 +99,7 @@ import static org.apache.sis.internal.util.CollectionsExt.first;
  * {@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 @@ import org.apache.sis.util.Version;
  * 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 12e4f82..0945bfc 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 e07f19b..910a6be 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 @@ import org.opengis.feature.FeatureType;
  *   <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 @@ import org.apache.sis.storage.event.WarningEvent;
  * 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/JoinFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/JoinFeatureSet.java
index 30ffcec..a3365a0 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/JoinFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/JoinFeatureSet.java
@@ -62,7 +62,7 @@ import org.apache.sis.filter.DefaultFilterFactory;
  * The left and right features appear together in an {@code JoinFeatureSet} instance when a value from
  * {@code leftProperty} in the first feature is equal to a value from {@code rightProperty} in the second feature.
  *
- * <div class="section">Implementation note</div>
+ * <h2>Implementation note</h2>
  * If iterations in one feature set is cheaper than iterations in the other feature set, then the "costly" or larger
  * {@code FeatureSet} should be on the left side and the "cheap" {@code FeatureSet} should be on the right side.
  *
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 @@ import org.apache.sis.storage.Resource;
  * 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 aae37b3..2497cf5 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
@@ -766,7 +766,7 @@ final class Store extends URIDataStore implements FeatureSet {
     /**
      * 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 @@ import org.apache.sis.util.ArgumentChecks;
  * 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 @@ public abstract class ChannelData implements Markable {
      * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureBetween;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureBetween;
  * <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 @@ import static org.apache.sis.util.ArgumentChecks.ensureBetween;
  * 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 @@ import static org.apache.sis.util.ArgumentChecks.ensureBetween;
  * <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 @@ import org.apache.sis.storage.event.StoreListeners;
  * 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 @@ loop:   while ((c = read()) >= 0) {
      * 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 @@ public final class IOUtilities extends Static {
      * 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 @@ import javax.imageio.stream.ImageInputStream;
 /**
  * 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 ef5a8e7..c63da03 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 @@ import java.util.Collection;
  * 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 @@ public interface Aggregate extends Resource {
      * {@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 @@ import org.opengis.geometry.Envelope;
  * 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 475c50e..6814fb5 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
@@ -48,7 +48,7 @@ import org.apache.sis.storage.event.StoreListeners;
  * 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:
  *
@@ -284,7 +284,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * 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>
      *
@@ -443,7 +443,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * 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
@@ -471,7 +471,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * {@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 @@ import org.apache.sis.util.Workaround;
 /**
  * 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 @@ public class DataStoreException extends Exception implements LocalizedException
      * 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 169a5b5..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 @@ import org.apache.sis.util.Version;
  *       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 @@ import org.apache.sis.util.Version;
  * 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.
  *
@@ -288,7 +288,7 @@ public abstract class DataStoreProvider {
      * 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 @@ public abstract class DataStoreProvider {
      *     }
      * }
      *
-     * <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 782daca..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
@@ -38,7 +38,7 @@ import org.apache.sis.util.ArraysExt;
  * 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 @@ public final class DataStores extends Static {
     /**
      * 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 62e9235..3657eb7 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 @@ import org.apache.sis.internal.storage.Resources;
  * 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 @@ import org.apache.sis.internal.storage.Resources;
  * 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 @@ import org.apache.sis.internal.util.Strings;
  * {@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 @@ import org.apache.sis.internal.util.Strings;
  * 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 @@ public class ProbeResult implements Serializable {
      * 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 d5afc4a..e37a1ca 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 @@ public interface Resource {
      * 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 @@ public interface Resource {
      * {@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 @@ import org.apache.sis.storage.Resource;
  * <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 @@ import org.apache.sis.storage.Resource;
  *   </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 @@ public class StoreListeners implements Localized {
      * 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 @@ public class StoreListeners implements Localized {
      * 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 @@ public class StoreListeners implements Localized {
      * {@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 @@ import org.apache.sis.util.resources.Errors;
  * 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 724a5b8..3f3e32d 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 @@ import org.opengis.feature.Feature;
  *     }
  * }
  *
- * <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 7f4ba22..ea86c85 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 @@ import org.opengis.feature.Feature;
  *     }
  * }
  *
- * <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 @@ public abstract class StaxStreamWriter extends StaxStreamIO implements Consumer<
      * 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()


Mime
View raw message