diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 552bda6..ba2e707 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,4 +1,58 @@
 
+              Apache Commons Geometry 1.0 RELEASE NOTES
+
+The Apache Commons Geometry team is pleased to announce the release of
+commons-geometry-parent-1.0
+
+The Apache Commons Geometry project provides geometric types and utilities.
+
+This is the first major release of Apache Commons Geometry.
+Apache Commons Geometry 1.0 contains the following library modules:
+ commons-geometry-core (requires Java 8+)
+ commons-geometry-euclidean (requires Java 8+)
+ commons-geometry-spherical (requires Java 8+)
+ commons-geometry-io-core (requires Java 8+)
+ commons-geometry-io-euclidean (requires Java 8+)
+
+Changes in this version include:
+
+New features:
+o GEOMETRY-118:  Add coordinate-specific transform methods to AffineTransformMatrixXD classes,
+        e.g. "applyX", "applyY", "applyZ".
+o GEOMETRY-95:  Add solid geometry tutorial.
+o GEOMETRY-120:  Add SimpleTriangleMeshBuilder.addFace(int[]) method as alternative to
+        addFace(int, int, int).
+o GEOMETRY-117:  Add shear methods to AffineTransformMatrix2D. Thanks to Christoph Läubrich.
+o GEOMETRY-119:  Add VectorXD.normalizeOrNull() methods so that callers can detect normalization
+        failures without needing to catch an exception.
+o GEOMETRY-115:  Add modules for IO functionality: commons-geometry-io-core,
+        commons-geometry-io-euclidean.
+o GEOMETRY-108:  Add BoundaryList interface and implementation classes.
+
+Fixed Bugs:
+o GEOMETRY-116:  Fix incorrect OSGi headers. Reported by Christoph Läubrich.
+
+Changes:
+o GEOMETRY-138:  Do not use checked exceptions in IO modules.
+o GEOMETRY-13:  Use Norms.EUCLIDEAN from Commons Numbers to compute 3D Euclidean norm values.
+o GEOMETRY-126:  Replace VectorXD.linearCombination methods with VectorXD.Sum classes. Use
+        Sum class from Commons Numbers for computing internal linear combinations.
+o GEOMETRY-124:  Replace DoublePrecisionContext with Precision.DoubleEquivalence from
+        Commons Numbers.
+o GEOMETRY-109:  Rename the BoundarySourceXX.from() static factory methods to "of" to better
+        match the JDK's Stream.of() method.
+o GEOMETRY-103:  Migrate unit tests to JUnit 5. Thanks to Arturo Bernal.
+
+
+For complete information on Apache Commons Geometry, including instructions on how to submit
+        bug reports, patches, or suggestions for improvement, see the Apache Commons Geometry
+        website:
+
+https://commons.apache.org/proper/commons-geometry/
+
+
+=============================================================================
+
               Apache Commons Geometry 1.0-beta1 RELEASE NOTES
 
 The Apache Commons Geometry team is pleased to announce the release of
@@ -22,5 +76,3 @@
 reports, patches, or suggestions for improvement, see the Apache Commons Geometry website:
 
 https://commons.apache.org/proper/commons-geometry/
-
-
diff --git a/commons-geometry-core/pom.xml b/commons-geometry-core/pom.xml
index 2521911..3b12615 100644
--- a/commons-geometry-core/pom.xml
+++ b/commons-geometry-core/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-core</artifactId>
diff --git a/commons-geometry-core/src/site/site.xml b/commons-geometry-core/src/site/site.xml
index d9d4ce5..7adbb0a 100644
--- a/commons-geometry-core/src/site/site.xml
+++ b/commons-geometry-core/src/site/site.xml
@@ -28,8 +28,8 @@
       <item name="Overview" href="/index.html"/>
       <item name="Latest API docs (development)"
             href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-core/javadocs/api-1.0/index.html"/> -->
+      <item name="Javadoc (1.0 release)"
+            href="https://commons.apache.org/geometry/commons-geometry-core/javadocs/api-1.0/index.html"/>
     </menu>
 
     <head>
diff --git a/commons-geometry-enclosing/CONTRIBUTING.md b/commons-geometry-enclosing/CONTRIBUTING.md
deleted file mode 100644
index dad0a8d..0000000
--- a/commons-geometry-enclosing/CONTRIBUTING.md
+++ /dev/null
@@ -1,115 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: contributing-md-template.md                           |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons-build:contributing-md              |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.jira.id  (required, alphabetic, upper case)             |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.jira.id>MATH</commons.jira.id>                           |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Contributing to Apache Commons Geometry Enclosing
-======================
-
-You have found a bug or you have an idea for a cool new feature? Contributing code is a great way to give something back to
-the open source community. Before you dig right into the code there are a few guidelines that we need contributors to
-follow so that we can have a chance of keeping on top of things.
-
-Getting Started
----------------
-
-+ Make sure you have a [JIRA account](https://issues.apache.org/jira/).
-+ Make sure you have a [GitHub account](https://github.com/signup/free).
-+ If you're planning to implement a new feature it makes sense to discuss your changes on the [dev list](https://commons.apache.org/mail-lists.html) first. This way you can make sure you're not wasting your time on something that isn't considered to be in Apache Commons Geometry Enclosing's scope.
-+ Submit a [Jira Ticket][jira] for your issue, assuming one does not already exist.
-  + Clearly describe the issue including steps to reproduce when it is a bug.
-  + Make sure you fill in the earliest version that you know has the issue.
-+ Find the corresponding [repository on GitHub](https://github.com/apache/?query=commons-),
-[fork](https://help.github.com/articles/fork-a-repo/) and check out your forked repository.
-
-Making Changes
---------------
-
-+ Create a _topic branch_ for your isolated work.
-  * Usually you should base your branch on the `master` or `trunk` branch.
-  * A good topic branch name can be the JIRA bug id plus a keyword, e.g. `GEOMETRY-123-InputStream`.
-  * If you have submitted multiple JIRA issues, try to maintain separate branches and pull requests.
-+ Make commits of logical units.
-  * Make sure your commit messages are meaningful and in the proper format. Your commit message should contain the key of the JIRA issue.
-  * e.g. `GEOMETRY-123: Close input stream earlier`
-+ Respect the original code style:
-  + Only use spaces for indentation.
-  + Create minimal diffs - disable _On Save_ actions like _Reformat Source Code_ or _Organize Imports_. If you feel the source code should be reformatted create a separate PR for this change first.
-  + Check for unnecessary whitespace with `git diff` -- check before committing.
-+ Make sure you have added the necessary tests for your changes, typically in `src/test/java`.
-+ Run all the tests with `mvn clean verify` to assure nothing else was accidentally broken.
-
-Making Trivial Changes
-----------------------
-
-The JIRA tickets are used to generate the changelog for the next release.
-
-For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA.
-In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number.
-
-
-Submitting Changes
-------------------
-
-+ Sign and submit the Apache [Contributor License Agreement][cla] if you haven't already.
-  * Note that small patches & typical bug fixes do not require a CLA as
-    clause 5 of the [Apache License](https://www.apache.org/licenses/LICENSE-2.0.html#contributions)
-    covers them.
-+ Push your changes to a topic branch in your fork of the repository.
-+ Submit a _Pull Request_ to the corresponding repository in the `apache` organization.
-  * Verify _Files Changed_ shows only your intended changes and does not
-  include additional files like `target/*.class`
-+ Update your JIRA ticket and include a link to the pull request in the ticket.
-
-If you prefer to not use GitHub, then you can instead use
-`git format-patch` (or `svn diff`) and attach the patch file to the JIRA issue.
-
-
-Additional Resources
---------------------
-
-+ [Contributing patches](https://commons.apache.org/patches.html)
-+ [Apache Commons Geometry Enclosing JIRA project page][jira]
-+ [Contributor License Agreement][cla]
-+ [General GitHub documentation](https://help.github.com/)
-+ [GitHub pull request documentation](https://help.github.com/articles/creating-a-pull-request/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ `#apache-commons` IRC channel on `irc.freenode.net`
-
-[cla]:https://www.apache.org/licenses/#clas
-[jira]:https://issues.apache.org/jira/browse/GEOMETRY
diff --git a/commons-geometry-enclosing/LICENSE.txt b/commons-geometry-enclosing/LICENSE.txt
deleted file mode 100644
index 261eeb9..0000000
--- a/commons-geometry-enclosing/LICENSE.txt
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/commons-geometry-enclosing/NOTICE.txt b/commons-geometry-enclosing/NOTICE.txt
deleted file mode 100644
index 8d9849f..0000000
--- a/commons-geometry-enclosing/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Commons Geometry
-Copyright 2020 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/commons-geometry-enclosing/README.md b/commons-geometry-enclosing/README.md
deleted file mode 100644
index 27db2f6..0000000
--- a/commons-geometry-enclosing/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: readme-md-template.md                                 |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:readme-md                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Apache Commons Geometry Enclosing
-===================
-
-[![Build Status](https://travis-ci.org/apache/commons-geometry-enclosing.svg?branch=master)](https://travis-ci.org/apache/commons-geometry-enclosing)
-[![Coverage Status](https://coveralls.io/repos/apache/commons-geometry-enclosing/badge.svg?branch=master)](https://coveralls.io/r/apache/commons-geometry-enclosing)
-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.commons/commons-geometry-enclosing/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.apache.commons/commons-geometry-enclosing/)
-[![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)
-
-Algorithms for computing enclosing balls.
-
-Documentation
--------------
-
-More information can be found on the [Apache Commons Geometry Enclosing homepage](https://commons.apache.org/proper/commons-geometry).
-The [JavaDoc](https://commons.apache.org/proper/commons-geometry/javadocs/api-release) can be browsed.
-Questions related to the usage of Apache Commons Geometry Enclosing should be posted to the [user mailing list][ml].
-
-Where can I get the latest release?
------------------------------------
-You can download source and binaries from our [download page](https://commons.apache.org/proper/commons-geometry/download_geometry.cgi).
-
-Alternatively you can pull it from the central Maven repositories:
-
-```xml
-<dependency>
-  <groupId>org.apache.commons</groupId>
-  <artifactId>commons-geometry-enclosing</artifactId>
-  <version>1.0-beta1</version>
-</dependency>
-```
-
-Contributing
-------------
-
-We accept Pull Requests via GitHub. The [developer mailing list][ml] is the main channel of communication for contributors.
-There are some guidelines which will make applying PRs easier for us:
-+ No tabs! Please use spaces for indentation.
-+ Respect the code style.
-+ Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-+ Provide JUnit tests for your changes and make sure your changes don't break any existing tests by running ```mvn clean test```.
-
-If you plan to contribute on a regular basis, please consider filing a [contributor license agreement](https://www.apache.org/licenses/#clas).
-You can learn more about contributing via GitHub in our [contribution guidelines](CONTRIBUTING.md).
-
-License
--------
-This code is under the [Apache Licence v2](https://www.apache.org/licenses/LICENSE-2.0).
-
-See the `NOTICE.txt` file for required notices and attributions.
-
-Donations
----------
-You like Apache Commons Geometry Enclosing? Then [donate back to the ASF](https://www.apache.org/foundation/contributing.html) to support the development.
-
-Additional Resources
---------------------
-
-+ [Apache Commons Homepage](https://commons.apache.org/)
-+ [Apache Issue Tracker (JIRA)](https://issues.apache.org/jira/browse/GEOMETRY)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ `#apache-commons` IRC channel on `irc.freenode.org`
-
-[ml]:https://commons.apache.org/mail-lists.html
diff --git a/commons-geometry-enclosing/pom.xml b/commons-geometry-enclosing/pom.xml
deleted file mode 100644
index 9b0ed2a..0000000
--- a/commons-geometry-enclosing/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-         xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>commons-geometry-enclosing</artifactId>
-  <name>Apache Commons Geometry Enclosing</name>
-
-  <description>Algorithms for computing enclosing balls.</description>
-
-  <properties>
-    <!-- OSGi -->
-    <commons.osgi.symbolicName>org.apache.commons.geometry.enclosing</commons.osgi.symbolicName>
-    <commons.osgi.export>org.apache.commons.geometry.enclosing.*</commons.osgi.export>
-    <!-- Java 9+ -->
-    <commons.automatic.module.name>org.apache.commons.geometry.enclosing</commons.automatic.module.name>
-    <!-- Workaround to avoid duplicating config files. -->
-    <geometry.parent.dir>${basedir}/..</geometry.parent.dir>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-euclidean</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-numbers-fraction</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-core</artifactId>
-      <version>${project.version}</version>
-      <classifier>tests</classifier>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-euclidean</artifactId>
-      <version>${project.version}</version>
-      <classifier>tests</classifier>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-client-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-simple</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-sampling</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- testing -->
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java
deleted file mode 100644
index ca5bf38..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/Encloser.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import org.apache.commons.geometry.core.Point;
-
-/** Interface for algorithms computing enclosing balls.
- * @param <P> Point type.
- * @see EnclosingBall
- */
-public interface Encloser<P extends Point<P>> {
-
-    /** Find a ball enclosing a list of points.
-     * @param points points to enclose
-     * @return enclosing ball
-     * @throws IllegalArgumentException if the argument does not contain any points
-     */
-    EnclosingBall<P> enclose(Iterable<P> points);
-
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/EnclosingBall.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/EnclosingBall.java
deleted file mode 100644
index a7fb9bb..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/EnclosingBall.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.core.Point;
-import org.apache.commons.numbers.core.Precision;
-
-/** This class represents a ball enclosing some points.
- * @param <P> Point type.
- * @see Point
- * @see Encloser
- */
-public class EnclosingBall<P extends Point<P>> {
-    /** Center of the ball. */
-    private final P center;
-
-    /** Radius of the ball. */
-    private final double radius;
-
-    /** Support points used to define the ball. */
-    private final List<P> support;
-
-    /** Construct an enclosing ball defined by a collection of support points. Callers are responsible
-     * for ensuring that the given points lie inside the ball. No validation is performed.
-     * @param center center of the ball
-     * @param radius radius of the ball
-     * @param support support points used to define the ball
-     */
-    public EnclosingBall(final P center, final double radius, final Collection<P> support) {
-        this.center  = center;
-        this.radius  = radius;
-        this.support = Collections.unmodifiableList(new ArrayList<>(support));
-    }
-
-    /** Get the center of the ball.
-     * @return center of the ball
-     */
-    public P getCenter() {
-        return center;
-    }
-
-    /** Get the radius of the ball.
-     * @return radius of the ball (can be negative if the ball is empty)
-     */
-    public double getRadius() {
-        return radius;
-    }
-
-    /** Get the support points used to define the ball.
-     * @return support points used to define the ball
-     */
-    public List<P> getSupport() {
-        return support;
-    }
-
-    /** Get the number of support points used to define the ball.
-     * @return number of support points used to define the ball
-     */
-    public int getSupportSize() {
-        return support.size();
-    }
-
-    /** Check if a point is within the ball or on the boundary. True is returned if the
-     * distance from the center of the ball to the given point is strictly less than
-     * or equal to the ball radius.
-     * @param point point to test
-     * @return true if the point is within the ball or on the boundary
-     */
-    public boolean contains(final P point) {
-        return point.distance(center) <= radius;
-    }
-
-    /** Check if a point is within the ball or on the boundary, using the given precision
-     * context for floating point comparison. True is returned if the distance from the
-     * center of the ball to the given point is less than or equal to the ball radius
-     * as evaluated by the precision context.
-     * @param point point to test
-     * @param precision precision context to use for floating point comparisons
-     * @return true if the point is within the ball or on the boundary as evaluated by
-     *      the precision context
-     */
-    public boolean contains(final P point, final Precision.DoubleEquivalence precision) {
-        return precision.lte(point.distance(center), radius);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(getClass().getSimpleName())
-            .append("[center= ")
-            .append(getCenter())
-            .append(", radius= ")
-            .append(getRadius())
-            .append(']');
-
-        return sb.toString();
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/SupportBallGenerator.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/SupportBallGenerator.java
deleted file mode 100644
index ad2631a..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/SupportBallGenerator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import java.util.List;
-
-import org.apache.commons.geometry.core.Point;
-
-/** Interface for generating balls based on support points.
- * <p>
- * This generator is used in the {@link WelzlEncloser Emo Welzl} algorithm
- * and its derivatives.
- * </p>
- * @param <P> Point type.
- * @see EnclosingBall
- */
-public interface SupportBallGenerator<P extends Point<P>> {
-
-    /** Create a ball whose boundary lies on prescribed support points.
-     * @param support support points (may be empty)
-     * @return ball whose boundary lies on the prescribed support points
-     */
-    EnclosingBall<P> ballOnSupport(List<P> support);
-
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java
deleted file mode 100755
index d246f46..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/WelzlEncloser.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.geometry.core.Point;
-import org.apache.commons.geometry.core.internal.GeometryInternalError;
-import org.apache.commons.numbers.core.Precision;
-
-/** Class implementing Emo Welzl's algorithm to find the smallest enclosing ball in linear time.
- * <p>
- * The class implements the algorithm described in paper <a
- * href="http://www.inf.ethz.ch/personal/emo/PublFiles/SmallEnclDisk_LNCS555_91.pdf">Smallest
- * Enclosing Disks (Balls and Ellipsoids)</a> by Emo Welzl, Lecture Notes in Computer Science
- * 555 (1991) 359-370. The pivoting improvement published in the paper <a
- * href="http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf">Fast and
- * Robust Smallest Enclosing Balls</a>, by Bernd Gärtner and further modified in
- * paper <a
- * href="http://www.idt.mdh.se/kurser/ct3340/ht12/MINICONFERENCE/FinalPapers/ircse12_submission_30.pdf">
- * Efficient Computation of Smallest Enclosing Balls in Three Dimensions</a> by Linus Källberg
- * to avoid performing local copies of data have been included.
- * </p>
- * @param <P> Point type.
- */
-public class WelzlEncloser<P extends Point<P>> implements Encloser<P> {
-
-    /** Precision context used to compare floating point numbers. */
-    private final Precision.DoubleEquivalence precision;
-
-    /** Object used to generate balls from support points. */
-    private final SupportBallGenerator<P> generator;
-
-    /** Simple constructor.
-     * @param generator generator for balls on support
-     * @param precision precision context used to compare floating point values
-     */
-    public WelzlEncloser(final SupportBallGenerator<P> generator, final Precision.DoubleEquivalence precision) {
-        this.generator = generator;
-        this.precision = precision;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public EnclosingBall<P> enclose(final Iterable<P> points) {
-
-        if (points == null || !points.iterator().hasNext()) {
-            throw new IllegalArgumentException("Unable to generate enclosing ball: no points given");
-        }
-
-        // Emo Welzl algorithm with Bernd Gärtner and Linus Källberg improvements
-        return pivotingBall(points);
-    }
-
-    /** Compute enclosing ball using Gärtner's pivoting heuristic.
-     * @param points points to be enclosed
-     * @return enclosing ball
-     */
-    private EnclosingBall<P> pivotingBall(final Iterable<P> points) {
-
-        final P first = points.iterator().next();
-        final List<P> extreme = new ArrayList<>(first.getDimension() + 1);
-        final List<P> support = new ArrayList<>(first.getDimension() + 1);
-
-        // start with only first point selected as a candidate support
-        extreme.add(first);
-        EnclosingBall<P> ball = moveToFrontBall(extreme, extreme.size(), support);
-
-        while (true) {
-
-            // select the point farthest to current ball
-            final P farthest = selectFarthest(points, ball);
-
-            if (ball.contains(farthest, precision)) {
-                // we have found a ball containing all points
-                return ball;
-            }
-
-            // recurse search, restricted to the small subset containing support and farthest point
-            support.clear();
-            support.add(farthest);
-            final EnclosingBall<P> savedBall = ball;
-            ball = moveToFrontBall(extreme, extreme.size(), support);
-            if (precision.lt(ball.getRadius(), savedBall.getRadius())) {
-                // this should never happen
-                throw new GeometryInternalError();
-            }
-
-            // it was an interesting point, move it to the front
-            // according to Gärtner's heuristic
-            extreme.add(0, farthest);
-
-            // prune the least interesting points
-            extreme.subList(ball.getSupportSize(), extreme.size()).clear();
-        }
-    }
-
-    /** Compute enclosing ball using Welzl's move to front heuristic.
-     * @param extreme subset of extreme points
-     * @param nbExtreme number of extreme points to consider
-     * @param support points that must belong to the ball support
-     * @return enclosing ball, for the extreme subset only
-     */
-    private EnclosingBall<P> moveToFrontBall(final List<P> extreme, final int nbExtreme,
-                                                final List<P> support) {
-        // create a new ball on the prescribed support
-        EnclosingBall<P> ball = generator.ballOnSupport(support);
-
-        if (ball.getSupportSize() <= ball.getCenter().getDimension()) {
-
-            for (int i = 0; i < nbExtreme; ++i) {
-                final P pi = extreme.get(i);
-                if (!ball.contains(pi, precision)) {
-
-                    // we have found an outside point,
-                    // enlarge the ball by adding it to the support
-                    support.add(pi);
-                    ball = moveToFrontBall(extreme, i, support);
-                    support.remove(support.size() - 1);
-
-                    // it was an interesting point, move it to the front
-                    // according to Welzl's heuristic
-                    for (int j = i; j > 0; --j) {
-                        extreme.set(j, extreme.get(j - 1));
-                    }
-                    extreme.set(0, pi);
-                }
-            }
-        }
-
-        return ball;
-    }
-
-    /** Select the point farthest to the current ball.
-     * @param points points to be enclosed
-     * @param ball current ball
-     * @return farthest point
-     */
-    private P selectFarthest(final Iterable<P> points, final EnclosingBall<P> ball) {
-
-        final P center = ball.getCenter();
-        P farthest   = null;
-        double dMax  = -1.0;
-
-        for (final P point : points) {
-            final double d = point.distance(center);
-            if (d > dMax) {
-                farthest = point;
-                dMax     = d;
-            }
-        }
-
-        return farthest;
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGenerator.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGenerator.java
deleted file mode 100644
index 6fd1068..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGenerator.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.threed;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.enclosing.SupportBallGenerator;
-import org.apache.commons.geometry.enclosing.euclidean.twod.DiskGenerator;
-import org.apache.commons.geometry.euclidean.threed.EmbeddingPlane;
-import org.apache.commons.geometry.euclidean.threed.Planes;
-import org.apache.commons.geometry.euclidean.threed.Vector3D;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.numbers.fraction.BigFraction;
-
-/** Class generating a sphere from its support points.
- */
-public class SphereGenerator implements SupportBallGenerator<Vector3D> {
-
-    /** Precision context used to compare floating point numbers. */
-    private final Precision.DoubleEquivalence precision;
-
-    /** Construct a new instance with the given precision context.
-     * @param precision precision context used to compare floating point numbers
-     */
-    public SphereGenerator(final Precision.DoubleEquivalence precision) {
-        this.precision = precision;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public EnclosingBall<Vector3D> ballOnSupport(final List<Vector3D> support) {
-        if (support.isEmpty()) {
-            return new EnclosingBall<>(Vector3D.ZERO, Double.NEGATIVE_INFINITY, Collections.emptyList());
-        }
-        final Vector3D vA = support.get(0);
-        if (support.size() < 2) {
-            return new EnclosingBall<>(vA, 0, Collections.singletonList(vA));
-        }
-        final Vector3D vB = support.get(1);
-        if (support.size() < 3) {
-            return new EnclosingBall<>(vA.lerp(vB, 0.5),
-                                       0.5 * vA.distance(vB),
-                                       Arrays.asList(vA, vB));
-        }
-        final Vector3D vC = support.get(2);
-        if (support.size() < 4) {
-            final EmbeddingPlane p = Planes.fromPoints(vA, vB, vC, precision).getEmbedding();
-            final EnclosingBall<Vector2D> disk =
-                    new DiskGenerator().ballOnSupport(Arrays.asList(p.toSubspace(vA),
-                                                                    p.toSubspace(vB),
-                                                                    p.toSubspace(vC)));
-
-            // convert back to 3D
-            return new EnclosingBall<>(p.toSpace(disk.getCenter()),
-                                                            disk.getRadius(),
-                                                            Arrays.asList(vA, vB, vC));
-
-        }
-        final Vector3D vD = support.get(3);
-        // a sphere is 3D can be defined as:
-        // (1)   (x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 = r^2
-        // which can be written:
-        // (2)   (x^2 + y^2 + z^2) - 2 x_0 x - 2 y_0 y - 2 z_0 z + (x_0^2 + y_0^2 + z_0^2 - r^2) = 0
-        // or simply:
-        // (3)   (x^2 + y^2 + z^2) + a x + b y + c z + d = 0
-        // with sphere center coordinates -a/2, -b/2, -c/2
-        // If the sphere exists, a b, c and d are a non zero solution to
-        // [ (x^2  + y^2  + z^2)    x    y   z    1 ]   [ 1 ]   [ 0 ]
-        // [ (xA^2 + yA^2 + zA^2)   xA   yA  zA   1 ]   [ a ]   [ 0 ]
-        // [ (xB^2 + yB^2 + zB^2)   xB   yB  zB   1 ] * [ b ] = [ 0 ]
-        // [ (xC^2 + yC^2 + zC^2)   xC   yC  zC   1 ]   [ c ]   [ 0 ]
-        // [ (xD^2 + yD^2 + zD^2)   xD   yD  zD   1 ]   [ d ]   [ 0 ]
-        // So the determinant of the matrix is zero. Computing this determinant
-        // by expanding it using the minors m_ij of first row leads to
-        // (4)   m_11 (x^2 + y^2 + z^2) - m_12 x + m_13 y - m_14 z + m_15 = 0
-        // So by identifying equations (2) and (4) we get the coordinates
-        // of center as:
-        //      x_0 = +m_12 / (2 m_11)
-        //      y_0 = -m_13 / (2 m_11)
-        //      z_0 = +m_14 / (2 m_11)
-        // Note that the minors m_11, m_12, m_13 and m_14 all have the last column
-        // filled with 1.0, hence simplifying the computation
-        final BigFraction[] c2 = {
-            BigFraction.from(vA.getX()), BigFraction.from(vB.getX()),
-            BigFraction.from(vC.getX()), BigFraction.from(vD.getX())
-        };
-        final BigFraction[] c3 = {
-            BigFraction.from(vA.getY()), BigFraction.from(vB.getY()),
-            BigFraction.from(vC.getY()), BigFraction.from(vD.getY())
-        };
-        final BigFraction[] c4 = {
-            BigFraction.from(vA.getZ()), BigFraction.from(vB.getZ()),
-            BigFraction.from(vC.getZ()), BigFraction.from(vD.getZ())
-        };
-        final BigFraction[] c1 = {
-            c2[0].multiply(c2[0]).add(c3[0].multiply(c3[0])).add(c4[0].multiply(c4[0])),
-            c2[1].multiply(c2[1]).add(c3[1].multiply(c3[1])).add(c4[1].multiply(c4[1])),
-            c2[2].multiply(c2[2]).add(c3[2].multiply(c3[2])).add(c4[2].multiply(c4[2])),
-            c2[3].multiply(c2[3]).add(c3[3].multiply(c3[3])).add(c4[3].multiply(c4[3]))
-        };
-        final BigFraction twoM11 = minor(c2, c3, c4).multiply(2);
-        final BigFraction m12 = minor(c1, c3, c4);
-        final BigFraction m13 = minor(c1, c2, c4);
-        final BigFraction m14 = minor(c1, c2, c3);
-        final BigFraction centerX = m12.divide(twoM11);
-        final BigFraction centerY = m13.divide(twoM11).negate();
-        final BigFraction centerZ = m14.divide(twoM11);
-        final BigFraction dx = c2[0].subtract(centerX);
-        final BigFraction dy = c3[0].subtract(centerY);
-        final BigFraction dz = c4[0].subtract(centerZ);
-        final BigFraction r2 = dx.multiply(dx).add(dy.multiply(dy)).add(dz.multiply(dz));
-        return new EnclosingBall<>(Vector3D.of(centerX.doubleValue(),
-                                               centerY.doubleValue(),
-                                               centerZ.doubleValue()),
-                                   Math.sqrt(r2.doubleValue()),
-                                   Arrays.asList(vA, vB, vC, vD));
-    }
-
-    /** Compute a dimension 4 minor, when 4<sup>th</sup> column is known to be filled with 1.0.
-     * @param c1 first column
-     * @param c2 second column
-     * @param c3 third column
-     * @return value of the minor computed has an exact fraction
-     */
-    private BigFraction minor(final BigFraction[] c1, final BigFraction[] c2, final BigFraction[] c3) {
-        return c2[0].multiply(c3[1]).multiply(c1[2].subtract(c1[3])).
-            add(c2[0].multiply(c3[2]).multiply(c1[3].subtract(c1[1]))).
-            add(c2[0].multiply(c3[3]).multiply(c1[1].subtract(c1[2]))).
-            add(c2[1].multiply(c3[0]).multiply(c1[3].subtract(c1[2]))).
-            add(c2[1].multiply(c3[2]).multiply(c1[0].subtract(c1[3]))).
-            add(c2[1].multiply(c3[3]).multiply(c1[2].subtract(c1[0]))).
-            add(c2[2].multiply(c3[0]).multiply(c1[1].subtract(c1[3]))).
-            add(c2[2].multiply(c3[1]).multiply(c1[3].subtract(c1[0]))).
-            add(c2[2].multiply(c3[3]).multiply(c1[0].subtract(c1[1]))).
-            add(c2[3].multiply(c3[0]).multiply(c1[2].subtract(c1[1]))).
-            add(c2[3].multiply(c3[1]).multiply(c1[0].subtract(c1[2]))).
-            add(c2[3].multiply(c3[2]).multiply(c1[1].subtract(c1[0])));
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3D.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3D.java
deleted file mode 100644
index d17e515..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3D.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.threed;
-
-import org.apache.commons.geometry.enclosing.WelzlEncloser;
-import org.apache.commons.geometry.euclidean.threed.Vector3D;
-import org.apache.commons.numbers.core.Precision;
-
-/** Extension of the {@link WelzlEncloser} class for Euclidean 3D space. This is
- * primarily a convenience class to simplify instantiation.
- */
-public class WelzlEncloser3D extends WelzlEncloser<Vector3D> {
-
-    /** Construct a new instance with the given precision context. A new {@link SphereGenerator}
-     * instance is used as the support ball generator.
-     * @param precision precision context to use for floating point comparisons
-     */
-    public WelzlEncloser3D(final Precision.DoubleEquivalence precision) {
-        super(new SphereGenerator(precision), precision);
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/package-info.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/package-info.java
deleted file mode 100644
index a5420c8..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/threed/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- * <p>
- * This package provides classes related to the smallest enclosing ball problem in three dimensions.
- * </p>
- *
- */
-package org.apache.commons.geometry.enclosing.euclidean.threed;
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGenerator.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGenerator.java
deleted file mode 100644
index 77eb5d1..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGenerator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.twod;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.enclosing.SupportBallGenerator;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.fraction.BigFraction;
-
-/** Class generating a disk from its support points.
- */
-public class DiskGenerator implements SupportBallGenerator<Vector2D> {
-
-    /** {@inheritDoc} */
-    @Override
-    public EnclosingBall<Vector2D> ballOnSupport(final List<Vector2D> support) {
-        if (support.isEmpty()) {
-            return new EnclosingBall<>(Vector2D.ZERO, Double.NEGATIVE_INFINITY, Collections.emptyList());
-        }
-        final Vector2D vA = support.get(0);
-        if (support.size() < 2) {
-            return new EnclosingBall<>(vA, 0, Collections.singletonList(vA));
-        }
-        final Vector2D vB = support.get(1);
-        if (support.size() < 3) {
-            return new EnclosingBall<>(vA.lerp(vB, 0.5),
-                                       0.5 * vA.distance(vB),
-                                       Arrays.asList(vA, vB));
-        }
-        final Vector2D vC = support.get(2);
-        // a disk is 2D can be defined as:
-        // (1)   (x - x_0)^2 + (y - y_0)^2 = r^2
-        // which can be written:
-        // (2)   (x^2 + y^2) - 2 x_0 x - 2 y_0 y + (x_0^2 + y_0^2 - r^2) = 0
-        // or simply:
-        // (3)   (x^2 + y^2) + a x + b y + c = 0
-        // with disk center coordinates -a/2, -b/2
-        // If the disk exists, a, b and c are a non-zero solution to
-        // [ (x^2  + y^2 )   x    y   1 ]   [ 1 ]   [ 0 ]
-        // [ (xA^2 + yA^2)   xA   yA  1 ]   [ a ]   [ 0 ]
-        // [ (xB^2 + yB^2)   xB   yB  1 ] * [ b ] = [ 0 ]
-        // [ (xC^2 + yC^2)   xC   yC  1 ]   [ c ]   [ 0 ]
-        // So the determinant of the matrix is zero. Computing this determinant
-        // by expanding it using the minors m_ij of first row leads to
-        // (4)   m_11 (x^2 + y^2) - m_12 x + m_13 y - m_14 = 0
-        // So by identifying equations (2) and (4) we get the coordinates
-        // of center as:
-        //      x_0 = +m_12 / (2 m_11)
-        //      y_0 = -m_13 / (2 m_11)
-        // Note that the minors m_11, m_12 and m_13 all have the last column
-        // filled with 1.0, hence simplifying the computation
-        final BigFraction[] c2 = {
-            BigFraction.from(vA.getX()), BigFraction.from(vB.getX()), BigFraction.from(vC.getX())
-        };
-        final BigFraction[] c3 = {
-            BigFraction.from(vA.getY()), BigFraction.from(vB.getY()), BigFraction.from(vC.getY())
-        };
-        final BigFraction[] c1 = {
-            c2[0].multiply(c2[0]).add(c3[0].multiply(c3[0])),
-            c2[1].multiply(c2[1]).add(c3[1].multiply(c3[1])),
-            c2[2].multiply(c2[2]).add(c3[2].multiply(c3[2]))
-        };
-        final BigFraction twoM11 = minor(c2, c3).multiply(2);
-        final BigFraction m12 = minor(c1, c3);
-        final BigFraction m13 = minor(c1, c2);
-        final BigFraction centerX = m12.divide(twoM11);
-        final BigFraction centerY = m13.divide(twoM11).negate();
-        final BigFraction dx = c2[0].subtract(centerX);
-        final BigFraction dy = c3[0].subtract(centerY);
-        final BigFraction r2 = dx.multiply(dx).add(dy.multiply(dy));
-        return new EnclosingBall<>(Vector2D.of(centerX.doubleValue(),
-                                               centerY.doubleValue()),
-                                   Math.sqrt(r2.doubleValue()),
-                                   Arrays.asList(vA, vB, vC));
-    }
-
-    /** Compute a dimension 3 minor, when 3<sup>d</sup> column is known to be filled with 1.0.
-     * @param c1 first column
-     * @param c2 second column
-     * @return value of the minor computed has an exact fraction
-     */
-    private BigFraction minor(final BigFraction[] c1, final BigFraction[] c2) {
-        return c2[0].multiply(c1[2].subtract(c1[1])).
-            add(c2[1].multiply(c1[0].subtract(c1[2]))).
-            add(c2[2].multiply(c1[1].subtract(c1[0])));
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2D.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2D.java
deleted file mode 100644
index 0a733d1..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2D.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.twod;
-
-import org.apache.commons.geometry.enclosing.WelzlEncloser;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-
-/** Extension of the {@link WelzlEncloser} class for Euclidean 2D space. This is
- * primarily a convenience class to simplify instantiation.
- */
-public class WelzlEncloser2D extends WelzlEncloser<Vector2D> {
-
-    /** Construct a new instance with the given precision context. A new {@link DiskGenerator}
-     * instance is used as the support ball generator.
-     * @param precision precision context to use for floating point comparisons.
-     */
-    public WelzlEncloser2D(final Precision.DoubleEquivalence precision) {
-        super(new DiskGenerator(), precision);
-    }
-}
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/package-info.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/package-info.java
deleted file mode 100644
index b9a2ede..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/euclidean/twod/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- * <p>
- * This package provides classes related to the smallest enclosing ball problem in two dimensions.
- * </p>
- *
- */
-package org.apache.commons.geometry.enclosing.euclidean.twod;
diff --git a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/package-info.java b/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/package-info.java
deleted file mode 100644
index 7338211..0000000
--- a/commons-geometry-enclosing/src/main/java/org/apache/commons/geometry/enclosing/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- * <p>
- * This package provides interfaces and classes related to the smallest enclosing ball problem.
- * </p>
- *
- */
-package org.apache.commons.geometry.enclosing;
diff --git a/commons-geometry-enclosing/src/site/site.xml b/commons-geometry-enclosing/src/site/site.xml
deleted file mode 100644
index 88dc5cc..0000000
--- a/commons-geometry-enclosing/src/site/site.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project name="Geometry">
-  <bannerRight>
-    <name>Apache Commons Geometry</name>
-    <!-- Use a full URL allows a correct banner for the modules. -->
-    <src>https://commons.apache.org/proper/commons-geometry/images/commons_geometry.small.png</src>
-    <href>https://commons.apache.org/proper/commons-geometry/index.html</href>
-  </bannerRight>
-
-  <body>
-    <menu name="Geometry">
-      <item name="Overview" href="/index.html"/>
-      <item name="Latest API docs (development)"
-            href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-enclosing/javadocs/api-1.0/index.html"/> -->
-    </menu>
-
-    <head>
-      <![CDATA[<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
-      </script>]]>
-    </head>
-
-  </body>
-</project>
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/DocumentationExamplesTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/DocumentationExamplesTest.java
deleted file mode 100644
index 8af5b4b..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/DocumentationExamplesTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.geometry.enclosing.euclidean.threed.WelzlEncloser3D;
-import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
-import org.apache.commons.geometry.euclidean.threed.Vector3D;
-import org.apache.commons.numbers.core.Precision;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-/** This class contains code listed as examples in the user guide and other documentation.
- * If any portion of this code changes, the corresponding examples in the documentation <em>must</em> be updated.
- */
-class DocumentationExamplesTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    @Test
-    void testWelzlEncloser3DExample() {
-        final Precision.DoubleEquivalence precision = Precision.doubleEquivalenceOfEpsilon(1e-10);
-
-        final List<Vector3D> points = Arrays.asList(
-                    Vector3D.of(0, 0, 1),
-                    Vector3D.of(0.75, 0, 1),
-                    Vector3D.of(2, 0, 1),
-                    Vector3D.of(1, 0, 2)
-                );
-
-        // compute the enclosing ball
-        final WelzlEncloser3D encloser = new WelzlEncloser3D(precision);
-
-        final EnclosingBall<Vector3D> sphere = encloser.enclose(points);
-
-        // check the generated ball
-        final Vector3D center = sphere.getCenter(); // (1, 0, 1)
-        final double radius = sphere.getRadius(); // 1.0
-        final boolean containsCenter = sphere.contains(center); // true
-        final boolean containsOrigin = sphere.contains(Vector3D.ZERO); // false
-
-        // ----------
-        EuclideanTestUtils.assertCoordinatesEqual(Vector3D.of(1, 0, 1), center, TEST_EPS);
-        Assertions.assertEquals(1.0, radius, TEST_EPS);
-        Assertions.assertTrue(containsCenter);
-        Assertions.assertFalse(containsOrigin);
-    }
-}
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/EnclosingBallTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/EnclosingBallTest.java
deleted file mode 100644
index 96b5f3b..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/EnclosingBallTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class EnclosingBallTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    @Test
-    void testProperties_emptySupport() {
-        // arrange
-        final Vector2D center = Vector2D.of(1.2, 3.4);
-        final double radius = 10;
-        final List<Vector2D> support = new ArrayList<>();
-
-        // act
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(center, radius, support);
-
-        // assert
-        Assertions.assertSame(center, ball.getCenter());
-        Assertions.assertEquals(radius, ball.getRadius(), TEST_EPS);
-        Assertions.assertEquals(0, ball.getSupportSize());
-
-        final List<Vector2D> resultSupport = ball.getSupport();
-        Assertions.assertEquals(0, resultSupport.size());
-    }
-
-    @Test
-    void testProperties_nonEmptySupport() {
-        // arrange
-        final Vector2D center = Vector2D.of(1.2, 3.4);
-        final double radius = 10;
-        final List<Vector2D> support = new ArrayList<>(Arrays.asList(
-                Vector2D.ZERO, Vector2D.Unit.PLUS_X, Vector2D.Unit.PLUS_Y));
-
-        // act
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(center, radius, support);
-
-        // assert
-        Assertions.assertSame(center, ball.getCenter());
-        Assertions.assertEquals(radius, ball.getRadius(), TEST_EPS);
-        Assertions.assertEquals(3, ball.getSupportSize());
-
-        final List<Vector2D> resultSupport = ball.getSupport();
-        Assertions.assertNotSame(support, resultSupport);
-        Assertions.assertEquals(support, resultSupport);
-    }
-
-    @Test
-    void testGetSupport_listCannotBeModified() {
-        // arrange
-        final List<Vector2D> support = new ArrayList<>(Collections.singletonList(Vector2D.ZERO));
-
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(Vector2D.of(1, 1), 4, support);
-        final List<Vector2D> ballSupport = ball.getSupport();
-
-        // act/assert
-        Assertions.assertThrows(UnsupportedOperationException.class, () ->  ballSupport.add(Vector2D.Unit.PLUS_X));
-    }
-
-    @Test
-    void testContains_strict() {
-        // arrange
-        final Vector2D center = Vector2D.of(1, 2);
-        final double radius = 2;
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(center, radius, Collections.emptyList());
-
-        // act/assert
-        Assertions.assertTrue(ball.contains(center));
-
-        Assertions.assertTrue(ball.contains(Vector2D.of(2, 3)));
-        Assertions.assertTrue(ball.contains(Vector2D.of(0, 1)));
-
-        Assertions.assertTrue(ball.contains(Vector2D.of(0, 2)));
-        Assertions.assertTrue(ball.contains(Vector2D.of(1, 4)));
-
-        Assertions.assertFalse(ball.contains(Vector2D.of(3.00001, 2)));
-        Assertions.assertFalse(ball.contains(Vector2D.of(1, -1e-12)));
-
-        Assertions.assertFalse(ball.contains(Vector2D.of(1, 5)));
-        Assertions.assertFalse(ball.contains(Vector2D.of(1, -1)));
-        Assertions.assertFalse(ball.contains(Vector2D.of(-2, 2)));
-        Assertions.assertFalse(ball.contains(Vector2D.of(4, 2)));
-    }
-
-    @Test
-    void testContains_precision() {
-        // arrange
-        final Precision.DoubleEquivalence lowerPrecision = Precision.doubleEquivalenceOfEpsilon(1e-4);
-        final Precision.DoubleEquivalence higherPrecision = Precision.doubleEquivalenceOfEpsilon(1e-10);
-
-        final Vector2D center = Vector2D.of(1, 2);
-        final double radius = 2;
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(center, radius, Collections.emptyList());
-
-        // act/assert
-        Assertions.assertTrue(ball.contains(center, higherPrecision));
-
-        Assertions.assertTrue(ball.contains(Vector2D.of(2, 3), higherPrecision));
-        Assertions.assertTrue(ball.contains(Vector2D.of(0, 1), higherPrecision));
-
-        Assertions.assertTrue(ball.contains(Vector2D.of(0, 2), higherPrecision));
-        Assertions.assertTrue(ball.contains(Vector2D.of(1, 4), higherPrecision));
-
-        Assertions.assertFalse(ball.contains(Vector2D.of(3.00001, 2), higherPrecision));
-        Assertions.assertTrue(ball.contains(Vector2D.of(1, -1e-12), higherPrecision));
-
-        Assertions.assertTrue(ball.contains(Vector2D.of(3.00001, 2), lowerPrecision));
-        Assertions.assertTrue(ball.contains(Vector2D.of(1, -1e-12), lowerPrecision));
-
-        Assertions.assertFalse(ball.contains(Vector2D.of(1, 5), higherPrecision));
-        Assertions.assertFalse(ball.contains(Vector2D.of(1, -1), higherPrecision));
-        Assertions.assertFalse(ball.contains(Vector2D.of(-2, 2), higherPrecision));
-        Assertions.assertFalse(ball.contains(Vector2D.of(4, 2), higherPrecision));
-    }
-
-    @Test
-    void testToString() {
-        // arrange
-        final EnclosingBall<Vector2D> ball = new EnclosingBall<>(Vector2D.ZERO, 1, Collections.singletonList(Vector2D.Unit.PLUS_X));
-
-        // act
-        final String str = ball.toString();
-
-        // assert
-        Assertions.assertTrue(str.startsWith("EnclosingBall[center= (0"));
-        Assertions.assertTrue(str.contains("radius= 1"));
-    }
-}
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGeneratorTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGeneratorTest.java
deleted file mode 100644
index df8fb86..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/SphereGeneratorTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.threed;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.euclidean.threed.Vector3D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.UnitSphereSampler;
-import org.apache.commons.rng.simple.RandomSource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class SphereGeneratorTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    private static final Precision.DoubleEquivalence TEST_PRECISION =
-            Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
-
-    private final SphereGenerator generator = new SphereGenerator(TEST_PRECISION);
-
-    @Test
-    void testSupport0Point() {
-        // arrange
-        final List<Vector3D> support = Collections.emptyList();
-
-        // act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertTrue(sphere.getRadius() < 0);
-        Assertions.assertEquals(0, sphere.getSupportSize());
-        Assertions.assertEquals(0, sphere.getSupport().size());
-    }
-
-    @Test
-    void testSupport1Point() {
-        // arrange
-        final Precision.DoubleEquivalence lowPrecision = Precision.doubleEquivalenceOfEpsilon(0.5);
-        final Precision.DoubleEquivalence highPrecision = Precision.doubleEquivalenceOfEpsilon(0.001);
-        final List<Vector3D> support = Collections.singletonList(Vector3D.of(1, 2, 3));
-
-        // act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(0.0, sphere.getRadius(), TEST_EPS);
-
-        Assertions.assertTrue(sphere.contains(support.get(0)));
-        Assertions.assertTrue(sphere.contains(support.get(0), lowPrecision));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(support.get(0).getX() + 0.1,
-                                                        support.get(0).getY() + 0.1,
-                                                        support.get(0).getZ() + 0.1),
-                                            highPrecision));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(support.get(0).getX() + 0.1,
-                                                       support.get(0).getY() + 0.1,
-                                                       support.get(0).getZ() + 0.1),
-                                            lowPrecision));
-
-        Assertions.assertEquals(0, support.get(0).distance(sphere.getCenter()), 1.0e-10);
-        Assertions.assertEquals(1, sphere.getSupportSize());
-        Assertions.assertEquals(support.get(0), sphere.getSupport().get(0));
-    }
-
-    @Test
-    void testSupport2Points() {
-        // arrange
-        final List<Vector3D> support = Arrays.asList(Vector3D.of(1, 0, 0),
-                                               Vector3D.of(3, 0, 0));
-
-        // act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(1.0, sphere.getRadius(), TEST_EPS);
-
-        int i = 0;
-        for (final Vector3D v : support) {
-            Assertions.assertTrue(sphere.contains(v));
-            Assertions.assertEquals(1.0, v.distance(sphere.getCenter()), TEST_EPS);
-            Assertions.assertSame(v, sphere.getSupport().get(i++));
-        }
-
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, 0.9, 0)));
-        Assertions.assertFalse(sphere.contains(Vector3D.ZERO));
-        Assertions.assertEquals(0.0, Vector3D.of(2, 0, 0).distance(sphere.getCenter()), TEST_EPS);
-        Assertions.assertEquals(2, sphere.getSupportSize());
-    }
-
-    @Test
-    void testSupport3Points() {
-        // arrange
-        final List<Vector3D> support = Arrays.asList(Vector3D.of(1, 0, 0),
-                                               Vector3D.of(3, 0, 0),
-                                               Vector3D.of(2, 2, 0));
-
-        // act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(5.0 / 4.0, sphere.getRadius(), TEST_EPS);
-
-        int i = 0;
-        for (final Vector3D v : support) {
-            Assertions.assertTrue(sphere.contains(v));
-            Assertions.assertEquals(5.0 / 4.0, v.distance(sphere.getCenter()), TEST_EPS);
-            Assertions.assertEquals(v, sphere.getSupport().get(i++));
-        }
-
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, 0.9, 0)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(0.9, 0, 0)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(3.1, 0, 0)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2.0, -0.499, 0)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2.0, -0.501, 0)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2.0, 3.0 / 4.0, -1.249)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2.0, 3.0 / 4.0, -1.251)));
-        Assertions.assertEquals(0.0, Vector3D.of(2.0, 3.0 / 4.0, 0).distance(sphere.getCenter()), TEST_EPS);
-        Assertions.assertEquals(3, sphere.getSupportSize());
-    }
-
-    @Test
-    void testSupport4Points() {
-        // arrange
-        final List<Vector3D> support = Arrays.asList(Vector3D.of(17, 14, 18),
-                                               Vector3D.of(11, 14, 22),
-                                               Vector3D.of(2, 22, 17),
-                                               Vector3D.of(22, 11, -10));
-
-        // act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(25.0, sphere.getRadius(), TEST_EPS);
-
-        int i = 0;
-        for (final Vector3D v : support) {
-            Assertions.assertTrue(sphere.contains(v));
-            Assertions.assertEquals(25.0, v.distance(sphere.getCenter()), 1.0e-10);
-            Assertions.assertEquals(v, sphere.getSupport().get(i++));
-        }
-
-        Assertions.assertTrue(sphere.contains(Vector3D.of(-22.999, 2, 2)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(-23.001, 2, 2)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(26.999, 2, 2)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(27.001, 2, 2)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, -22.999, 2)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2, -23.001, 2)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, 26.999, 2)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2, 27.001, 2)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, 2, -22.999)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2, 2, -23.001)));
-        Assertions.assertTrue(sphere.contains(Vector3D.of(2, 2, 26.999)));
-        Assertions.assertFalse(sphere.contains(Vector3D.of(2, 2, 27.001)));
-        Assertions.assertEquals(0.0, Vector3D.of(2.0, 2.0, 2.0).distance(sphere.getCenter()), TEST_EPS);
-        Assertions.assertEquals(4, sphere.getSupportSize());
-    }
-
-    @Test
-    void testRandom() {
-        // arrange
-        final UniformRandomProvider random = RandomSource.create(RandomSource.WELL_1024_A,
-                                                                 0xd015982e9f31ee04L);
-        final UnitSphereSampler sr = new UnitSphereSampler(3, random);
-        for (int i = 0; i < 100; ++i) {
-            final double d = 25 * random.nextDouble();
-            final double refRadius = 10 * random.nextDouble();
-            final Vector3D refCenter = Vector3D.of(sr.nextVector()).multiply(d);
-            final List<Vector3D> support = new ArrayList<>();
-            for (int j = 0; j < 5; ++j) {
-                support.add(Vector3D.Sum.of(refCenter).addScaled(refRadius, Vector3D.of(sr.nextVector())).get());
-            }
-
-            // act
-            final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-            // assert
-            Assertions.assertEquals(0.0, refCenter.distance(sphere.getCenter()), 4e-7 * refRadius);
-            Assertions.assertEquals(refRadius, sphere.getRadius(), 1e-7 * refRadius);
-        }
-    }
-
-    @Test
-    void testDegeneratedCase() {
-        // --- arrange
-        final List<Vector3D> support =
-               Arrays.asList(Vector3D.of(Math.scalb(-8039905610797991.0, -50),   //   -7.140870659936730
-                                          Math.scalb(-4663475464714142.0, -48),   //  -16.567993074240455
-                                          Math.scalb(6592658872616184.0, -49)),  //   11.710914678204503
-                             Vector3D.of(Math.scalb(-8036658568968473.0, -50),   //   -7.137986707455888
-                                          Math.scalb(-4664256346424880.0, -48),   //  -16.570767323375720
-                                          Math.scalb(6591357011730307.0, -49)),  //  11.708602108715928)
-                             Vector3D.of(Math.scalb(-8037820142977230.0, -50),   //   -7.139018392423351
-                                          Math.scalb(-4665280434237813.0, -48),   //  -16.574405614157020
-                                          Math.scalb(6592435966112099.0, -49)),  //   11.710518716711425
-                             Vector3D.of(Math.scalb(-8038007803611611.0, -50),   //   -7.139185068549035
-                                          Math.scalb(-4664291215918380.0, -48),   //  -16.570891204702250
-                                          Math.scalb(6595270610894208.0, -49))); //   11.715554057357394
-
-        // --- act
-        final EnclosingBall<Vector3D> sphere = generator.ballOnSupport(support);
-
-        // --- assert
-        // the following values have been computed using Emacs calc with exact arithmetic from the
-        // rational representation corresponding to the scalb calls (i.e. -8039905610797991/2^50, ...)
-        // The results were converted to decimal representation rounded to 1.0e-30 when writing the reference
-        // values in this test
-        final double eps = 1e-20;
-        Assertions.assertEquals(0.003616820213530053297575846168, sphere.getRadius(), eps);
-        Assertions.assertEquals(-7.139325643360503322823511839511, sphere.getCenter().getX(), eps);
-        Assertions.assertEquals(-16.571096474251747245361467833760, sphere.getCenter().getY(), eps);
-        Assertions.assertEquals(11.711945804096960876521111630800, sphere.getCenter().getZ(), eps);
-
-        final Precision.DoubleEquivalence supportPrecision = Precision.doubleEquivalenceOfEpsilon(1e-14);
-        for (final Vector3D v : support) {
-            Assertions.assertTrue(sphere.contains(v, supportPrecision));
-        }
-    }
-}
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java
deleted file mode 100644
index 9561982..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3DTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.threed;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.geometry.core.GeometryTestUtils;
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.euclidean.threed.Vector3D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.UnitSphereSampler;
-import org.apache.commons.rng.simple.RandomSource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class WelzlEncloser3DTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    private static final Precision.DoubleEquivalence TEST_PRECISION =
-            Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
-
-    private final WelzlEncloser3D encloser = new WelzlEncloser3D(TEST_PRECISION);
-
-    @Test
-    void testNoPoints() {
-        // arrange
-        final String msg = "Unable to generate enclosing ball: no points given";
-
-        // act/assert
-        GeometryTestUtils.assertThrowsWithMessage(() -> {
-            encloser.enclose(null);
-        }, IllegalArgumentException.class, msg);
-
-        GeometryTestUtils.assertThrowsWithMessage(() -> {
-            encloser.enclose(new ArrayList<Vector3D>());
-        }, IllegalArgumentException.class, msg);
-    }
-
-    @Test
-    void testReducingBall() {
-        // arrange
-        final List<Vector3D> list =
-                Arrays.asList(Vector3D.of(-7.140397329568118, -16.571661242582177, 11.714458961735405),
-                              Vector3D.of(-7.137986707455888, -16.570767323375720, 11.708602108715928),
-                              Vector3D.of(-7.139185068549035, -16.570891204702250, 11.715554057357394),
-                              Vector3D.of(-7.142682716997507, -16.571609818234290, 11.710787934580328),
-                              Vector3D.of(-7.139018392423351, -16.574405614157020, 11.710518716711425),
-                              Vector3D.of(-7.140870659936730, -16.567993074240455, 11.710914678204503),
-                              Vector3D.of(-7.136350173659562, -16.570498228820930, 11.713965225900928),
-                              Vector3D.of(-7.141675762759172, -16.572852471407028, 11.714033471449508),
-                              Vector3D.of(-7.140453077221105, -16.570212820780647, 11.708624578004980),
-                              Vector3D.of(-7.140322188726825, -16.574152894557717, 11.710305611121410),
-                              Vector3D.of(-7.141116131477088, -16.574061164624560, 11.712938509321699));
-
-        // act
-        final EnclosingBall<Vector3D> ball = encloser.enclose(list);
-
-        // assert
-        Assertions.assertTrue(ball.getRadius() > 0);
-    }
-
-    @Test
-    void testInfiniteLoop() {
-        // arrange
-        // this test used to generate an infinite loop
-        final List<Vector3D> list =
-                Arrays.asList(Vector3D.of(-0.89227075512164380, -2.89317694645713900, 14.84572323743355500),
-                              Vector3D.of(-0.92099498940693580, -2.31086108263908940, 12.92071026467688300),
-                              Vector3D.of(-0.85227999411005200, -3.06314731441320730, 15.40163831651287000),
-                              Vector3D.of(-1.77399413020785970, -3.65630391378114260, 14.13190097751873400),
-                              Vector3D.of(0.33157833272465354, -2.22813591757792160, 14.21225234159008200),
-                              Vector3D.of(-1.53065579165484400, -1.65692084770139570, 14.61483055714788500),
-                              Vector3D.of(-1.08457093941217140, -1.96100325935602980, 13.09265170575555000),
-                              Vector3D.of(0.30029469589708850, -3.05470831395667370, 14.56352400426342600),
-                              Vector3D.of(-0.95007443938638460, -1.86810946486118360, 15.14491234340057000),
-                              Vector3D.of(-1.89661503804130830, -2.17004080885185860, 14.81235128513927000),
-                              Vector3D.of(-0.72193328761607530, -1.44513142833618270, 14.52355724218561800),
-                              Vector3D.of(-0.26895980939606550, -3.69512371522084140, 14.72272846327652000),
-                              Vector3D.of(-1.53501693431786170, -3.25055166611021900, 15.15509062584274800),
-                              Vector3D.of(-0.71727553535519410, -3.62284279460799100, 13.26256700929380700),
-                              Vector3D.of(-0.30220950676137365, -3.25410412500779070, 13.13682612771606000),
-                              Vector3D.of(-0.04543996608267075, -1.93081853923797750, 14.79497997883171400),
-                              Vector3D.of(-1.53348892951571640, -3.66688919703524900, 14.73095600812074200),
-                              Vector3D.of(-0.98034899533935820, -3.34004481162763960, 13.03245014017556800));
-
-        // act
-        final EnclosingBall<Vector3D> ball = encloser.enclose(list);
-
-        // assert
-        Assertions.assertTrue(ball.getRadius() > 0);
-    }
-
-    @Test
-    void testLargeSamples() {
-        // arrange
-        final UniformRandomProvider random = RandomSource.create(RandomSource.WELL_1024_A,
-                                                                 0x35ddecfc78131e1dL);
-        final UnitSphereSampler sr = new UnitSphereSampler(3, random);
-        for (int k = 0; k < 50; ++k) {
-
-            // define the reference sphere we want to compute
-            final double d = 25 * random.nextDouble();
-            final double refRadius = 10 * random.nextDouble();
-            final Vector3D refCenter = Vector3D.of(sr.nextVector()).multiply(d);
-            // set up a large sample inside the reference sphere
-            final int nbPoints = random.nextInt(1000);
-
-            final List<Vector3D> points = new ArrayList<>();
-            for (int i = 0; i < nbPoints; ++i) {
-                final double r = refRadius * random.nextDouble();
-                points.add(Vector3D.Sum.of(refCenter).addScaled(r, Vector3D.of(sr.nextVector())).get());
-            }
-
-            // act/assert
-            // test we find a sphere at most as large as the one used for random drawings
-            checkSphere(points, refRadius);
-        }
-    }
-
-    private void checkSphere(final List<Vector3D> points, final double refRadius) {
-
-        final EnclosingBall<Vector3D> sphere = checkSphere(points);
-
-        // compare computed sphere with bounding sphere
-        Assertions.assertTrue(sphere.getRadius() <= refRadius);
-
-        // check removing any point of the support Sphere fails to enclose the point
-        for (int i = 0; i < sphere.getSupportSize(); ++i) {
-            final List<Vector3D> reducedSupport = new ArrayList<>();
-            int count = 0;
-            for (final Vector3D s : sphere.getSupport()) {
-                if (count++ != i) {
-                    reducedSupport.add(s);
-                }
-            }
-            final EnclosingBall<Vector3D> reducedSphere = new SphereGenerator(TEST_PRECISION)
-                    .ballOnSupport(reducedSupport);
-            boolean foundOutside = false;
-            for (int j = 0; j < points.size() && !foundOutside; ++j) {
-                if (!reducedSphere.contains(points.get(j), TEST_PRECISION)) {
-                    foundOutside = true;
-                }
-            }
-            Assertions.assertTrue(foundOutside);
-        }
-    }
-
-    private EnclosingBall<Vector3D> checkSphere(final List<Vector3D> points) {
-
-        final EnclosingBall<Vector3D> sphere = encloser.enclose(points);
-
-        // all points are enclosed
-        for (final Vector3D v : points) {
-            Assertions.assertTrue(sphere.contains(v, TEST_PRECISION));
-        }
-
-        // all support points are on the boundary
-        final Vector3D center = sphere.getCenter();
-        final double radius = sphere.getRadius();
-
-        for (final Vector3D s : sphere.getSupport()) {
-            Assertions.assertTrue(TEST_PRECISION.eqZero(center.distance(s) - radius));
-        }
-
-        return sphere;
-    }
-}
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGeneratorTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGeneratorTest.java
deleted file mode 100644
index c3428d9..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/DiskGeneratorTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.UnitSphereSampler;
-import org.apache.commons.rng.simple.RandomSource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class DiskGeneratorTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    private final DiskGenerator generator = new DiskGenerator();
-
-    @Test
-    void testSupport0Point() {
-        // arrange
-        final List<Vector2D> support = Collections.emptyList();
-
-        // act
-        final EnclosingBall<Vector2D> disk = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertTrue(disk.getRadius() < 0);
-        Assertions.assertEquals(0, disk.getSupportSize());
-        Assertions.assertEquals(0, disk.getSupport().size());
-    }
-
-    @Test
-    void testSupport1Point() {
-        // arrange
-        final Precision.DoubleEquivalence lowPrecision = Precision.doubleEquivalenceOfEpsilon(0.5);
-        final Precision.DoubleEquivalence highPrecision = Precision.doubleEquivalenceOfEpsilon(0.001);
-        final List<Vector2D> support = Collections.singletonList(Vector2D.of(1, 2));
-
-        // act
-        final EnclosingBall<Vector2D> disk = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(0.0, disk.getRadius(), TEST_EPS);
-        Assertions.assertTrue(disk.contains(support.get(0)));
-        Assertions.assertTrue(disk.contains(support.get(0), lowPrecision));
-        Assertions.assertFalse(disk.contains(Vector2D.of(support.get(0).getX() + 0.1,
-                                                      support.get(0).getY() - 0.1),
-                                        highPrecision));
-        Assertions.assertTrue(disk.contains(Vector2D.of(support.get(0).getX() + 0.1,
-                                                     support.get(0).getY() - 0.1),
-                                        lowPrecision));
-        Assertions.assertEquals(0, support.get(0).distance(disk.getCenter()), TEST_EPS);
-        Assertions.assertEquals(1, disk.getSupportSize());
-        Assertions.assertEquals(support.get(0), disk.getSupport().get(0));
-    }
-
-    @Test
-    void testSupport2Points() {
-        // arrange
-        final List<Vector2D> support = Arrays.asList(Vector2D.of(1, 0),
-                                               Vector2D.of(3, 0));
-
-        // act
-        final EnclosingBall<Vector2D> disk = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(1.0, disk.getRadius(), TEST_EPS);
-
-        int i = 0;
-        for (final Vector2D v : support) {
-            Assertions.assertTrue(disk.contains(v));
-            Assertions.assertEquals(1.0, v.distance(disk.getCenter()), TEST_EPS);
-            Assertions.assertEquals(v, disk.getSupport().get(i++));
-        }
-
-        Assertions.assertTrue(disk.contains(Vector2D.of(2, 0.9)));
-        Assertions.assertFalse(disk.contains(Vector2D.ZERO));
-        Assertions.assertEquals(0.0, Vector2D.of(2, 0).distance(disk.getCenter()), TEST_EPS);
-        Assertions.assertEquals(2, disk.getSupportSize());
-    }
-
-    @Test
-    void testSupport3Points() {
-        // arrange
-        final List<Vector2D> support = Arrays.asList(Vector2D.of(1, 0),
-                                               Vector2D.of(3, 0),
-                                               Vector2D.of(2, 2));
-
-        // act
-        final EnclosingBall<Vector2D> disk = generator.ballOnSupport(support);
-
-        // assert
-        Assertions.assertEquals(5.0 / 4.0, disk.getRadius(), TEST_EPS);
-
-        int i = 0;
-        for (final Vector2D v : support) {
-            Assertions.assertTrue(disk.contains(v));
-            Assertions.assertEquals(5.0 / 4.0, v.distance(disk.getCenter()), TEST_EPS);
-            Assertions.assertEquals(v, disk.getSupport().get(i++));
-        }
-
-        Assertions.assertTrue(disk.contains(Vector2D.of(2, 0.9)));
-        Assertions.assertFalse(disk.contains(Vector2D.of(0.9,  0)));
-        Assertions.assertFalse(disk.contains(Vector2D.of(3.1,  0)));
-        Assertions.assertTrue(disk.contains(Vector2D.of(2.0, -0.499)));
-        Assertions.assertFalse(disk.contains(Vector2D.of(2.0, -0.501)));
-        Assertions.assertEquals(0.0, Vector2D.of(2.0, 3.0 / 4.0).distance(disk.getCenter()), TEST_EPS);
-        Assertions.assertEquals(3, disk.getSupportSize());
-    }
-
-    @Test
-    void testRandom() {
-        // arrange
-        final UniformRandomProvider random = RandomSource.create(RandomSource.WELL_1024_A,
-                                                                 0x12faa818373ffe90L);
-        final UnitSphereSampler sr = new UnitSphereSampler(2, random);
-        for (int i = 0; i < 500; ++i) {
-            final double d = 25 * random.nextDouble();
-            final double refRadius = 10 * random.nextDouble();
-            final Vector2D refCenter = Vector2D.of(sr.nextVector()).multiply(d);
-            final List<Vector2D> support = new ArrayList<>();
-            for (int j = 0; j < 3; ++j) {
-                support.add(Vector2D.Sum.of(refCenter).addScaled(refRadius, Vector2D.of(sr.nextVector())).get());
-            }
-
-            // act
-            final EnclosingBall<Vector2D> disk = generator.ballOnSupport(support);
-
-            // assert
-            Assertions.assertEquals(0.0, refCenter.distance(disk.getCenter()), 3e-9 * refRadius);
-            Assertions.assertEquals(refRadius, disk.getRadius(), 7e-10 * refRadius);
-        }
-    }
-}
diff --git a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java b/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java
deleted file mode 100755
index 8bbb9cb..0000000
--- a/commons-geometry-enclosing/src/test/java/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2DTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.enclosing.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.geometry.core.GeometryTestUtils;
-import org.apache.commons.geometry.enclosing.EnclosingBall;
-import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.simple.RandomSource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class WelzlEncloser2DTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    private static final Precision.DoubleEquivalence TEST_PRECISION =
-            Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
-
-    private final WelzlEncloser2D encloser = new WelzlEncloser2D(TEST_PRECISION);
-
-    @Test
-    void testNoPoints() {
-        // arrange
-        final String msg = "Unable to generate enclosing ball: no points given";
-
-        // act/assert
-        GeometryTestUtils.assertThrowsWithMessage(() -> {
-            encloser.enclose(null);
-        }, IllegalArgumentException.class, msg);
-
-        GeometryTestUtils.assertThrowsWithMessage(() -> {
-            encloser.enclose(new ArrayList<Vector2D>());
-        }, IllegalArgumentException.class, msg);
-    }
-
-    @Test
-    void testRegularPoints() {
-        // arrange
-        final List<Vector2D> list = buildList(22, 26, 30, 38, 64, 28,  8, 54, 11, 15);
-
-        // act/assert
-        checkDisk(list, Arrays.asList(list.get(2), list.get(3), list.get(4)));
-    }
-
-    @Test
-    void testSolutionOnDiameter() {
-        // arrange
-        final List<Vector2D> list = buildList(22, 26, 30, 38, 64, 28,  8, 54);
-
-        // act/assert
-        checkDisk(list, Arrays.asList(list.get(2), list.get(3)));
-    }
-
-    @Test
-    void testReducingBall1() {
-        // arrange
-        final List<Vector2D> list = buildList(0.05380958511396061, 0.57332359658700000,
-                                        0.99348810731127870, 0.02056421361521466,
-                                        0.01203950647796437, 0.99779675042261860,
-                                        0.00810189987706078, 0.00589246003827815,
-                                        0.00465180821202149, 0.99219972923046940);
-
-        // act/assert
-        checkDisk(list, Arrays.asList(list.get(1), list.get(3), list.get(4)));
-    }
-
-    @Test
-    void testReducingBall2() {
-        // arrange
-        final List<Vector2D> list = buildList(0.016930586154703, 0.333955448537779,
-                                        0.987189104892331, 0.969778855274507,
-                                        0.983696889599935, 0.012904580013266,
-                                        0.013114499572905, 0.034740156356895);
-
-        // act/assert
-        checkDisk(list, Arrays.asList(list.get(1), list.get(2), list.get(3)));
-    }
-
-    @Test
-    void testLargeSamples() {
-        // arrange
-        final UniformRandomProvider random = RandomSource.create(RandomSource.WELL_1024_A, 0xa2a63cad12c01fb2L);
-        for (int k = 0; k < 100; ++k) {
-            final int nbPoints = random.nextInt(10000);
-            final List<Vector2D> points = new ArrayList<>();
-            for (int i = 0; i < nbPoints; ++i) {
-                final double x = random.nextDouble();
-                final double y = random.nextDouble();
-                points.add(Vector2D.of(x, y));
-            }
-
-            // act/assert
-            checkDisk(points);
-        }
-    }
-
-    @Test
-    void testEnclosingWithPrecision() {
-        // arrange
-        final List<Vector2D> points = Arrays.asList(
-                Vector2D.of(271.59, 57.282),
-                Vector2D.of(269.145, 57.063),
-                Vector2D.of(309.117, 77.187),
-                Vector2D.of(316.989, 34.835),
-                Vector2D.of(323.101, 53.972)
-        );
-        final double precision = 1;
-        final Precision.DoubleEquivalence precisionContext = Precision.doubleEquivalenceOfEpsilon(precision);
-        final WelzlEncloser2D customPrecisionEncloser = new WelzlEncloser2D(precisionContext);
-
-        // act
-        final EnclosingBall<Vector2D> result = customPrecisionEncloser.enclose(points);
-
-        // assert
-        Assertions.assertEquals(27.099954200964234, result.getRadius(), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(296.0056977503686, 53.469890753441945),
-                result.getCenter(), TEST_EPS);
-    }
-
-    private List<Vector2D> buildList(final double... coordinates) {
-        final List<Vector2D> list = new ArrayList<>(coordinates.length / 2);
-        for (int i = 0; i < coordinates.length; i += 2) {
-            list.add(Vector2D.of(coordinates[i], coordinates[i + 1]));
-        }
-        return list;
-    }
-
-    private void checkDisk(final List<Vector2D> points, final List<Vector2D> refSupport) {
-
-        final EnclosingBall<Vector2D> disk = checkDisk(points);
-
-        // compare computed disk with expected disk
-        final EnclosingBall<Vector2D> expected = new DiskGenerator().ballOnSupport(refSupport);
-        Assertions.assertEquals(refSupport.size(), disk.getSupportSize());
-        Assertions.assertEquals(expected.getRadius(),        disk.getRadius(),        1.0e-10);
-        Assertions.assertEquals(expected.getCenter().getX(), disk.getCenter().getX(), 1.0e-10);
-        Assertions.assertEquals(expected.getCenter().getY(), disk.getCenter().getY(), 1.0e-10);
-
-        for (final Vector2D s : disk.getSupport()) {
-            boolean found = false;
-            for (final Vector2D rs : refSupport) {
-                if (s == rs) {
-                    found = true;
-                    break;
-                }
-            }
-            Assertions.assertTrue(found);
-        }
-
-        // check removing any point of the support disk fails to enclose the point
-        for (int i = 0; i < disk.getSupportSize(); ++i) {
-            final List<Vector2D> reducedSupport = new ArrayList<>();
-            int count = 0;
-            for (final Vector2D s : disk.getSupport()) {
-                if (count++ != i) {
-                    reducedSupport.add(s);
-                }
-            }
-            final EnclosingBall<Vector2D> reducedDisk = new DiskGenerator().ballOnSupport(reducedSupport);
-            boolean foundOutside = false;
-            for (int j = 0; j < points.size() && !foundOutside; ++j) {
-                if (!reducedDisk.contains(points.get(j), TEST_PRECISION)) {
-                    foundOutside = true;
-                }
-            }
-            Assertions.assertTrue(foundOutside);
-        }
-    }
-
-    private EnclosingBall<Vector2D> checkDisk(final List<Vector2D> points) {
-
-        final EnclosingBall<Vector2D> disk = encloser.enclose(points);
-
-        // all points are enclosed
-        for (final Vector2D v : points) {
-            Assertions.assertTrue(disk.contains(v, TEST_PRECISION));
-        }
-
-        // all support points are on the boundary
-        final Vector2D center = disk.getCenter();
-        final double radius = disk.getRadius();
-
-        for (final Vector2D s : disk.getSupport()) {
-            Assertions.assertTrue(TEST_PRECISION.eqZero(center.distance(s) - radius));
-        }
-
-        return disk;
-    }
-}
diff --git a/commons-geometry-euclidean/pom.xml b/commons-geometry-euclidean/pom.xml
index 63cf2f6..9527b6d 100644
--- a/commons-geometry-euclidean/pom.xml
+++ b/commons-geometry-euclidean/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-euclidean</artifactId>
diff --git a/commons-geometry-euclidean/src/site/site.xml b/commons-geometry-euclidean/src/site/site.xml
index 8915e07..9bac4dd 100644
--- a/commons-geometry-euclidean/src/site/site.xml
+++ b/commons-geometry-euclidean/src/site/site.xml
@@ -28,8 +28,8 @@
       <item name="Overview" href="/index.html"/>
       <item name="Latest API docs (development)"
             href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-euclidean/javadocs/api-1.0/index.html"/> -->
+      <item name="Javadoc (1.0 release)"
+            href="https://commons.apache.org/geometry/commons-geometry-euclidean/javadocs/api-1.0/index.html"/>
     </menu>
 
 
diff --git a/commons-geometry-examples/examples-jmh/pom.xml b/commons-geometry-examples/examples-jmh/pom.xml
index 19778bf..6da6b92 100644
--- a/commons-geometry-examples/examples-jmh/pom.xml
+++ b/commons-geometry-examples/examples-jmh/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-examples</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-examples-jmh</artifactId>
diff --git a/commons-geometry-examples/examples-tutorials/pom.xml b/commons-geometry-examples/examples-tutorials/pom.xml
index 2772034..85e8c56 100644
--- a/commons-geometry-examples/examples-tutorials/pom.xml
+++ b/commons-geometry-examples/examples-tutorials/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-examples</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-examples-tutorials</artifactId>
diff --git a/commons-geometry-examples/pom.xml b/commons-geometry-examples/pom.xml
index 7ebe6d8..53e3884 100644
--- a/commons-geometry-examples/pom.xml
+++ b/commons-geometry-examples/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-examples</artifactId>
diff --git a/commons-geometry-hull/CONTRIBUTING.md b/commons-geometry-hull/CONTRIBUTING.md
deleted file mode 100644
index 457bbfc..0000000
--- a/commons-geometry-hull/CONTRIBUTING.md
+++ /dev/null
@@ -1,115 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: contributing-md-template.md                           |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons-build:contributing-md              |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.jira.id  (required, alphabetic, upper case)             |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.jira.id>MATH</commons.jira.id>                           |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Contributing to Apache Commons Geometry Hull
-======================
-
-You have found a bug or you have an idea for a cool new feature? Contributing code is a great way to give something back to
-the open source community. Before you dig right into the code there are a few guidelines that we need contributors to
-follow so that we can have a chance of keeping on top of things.
-
-Getting Started
----------------
-
-+ Make sure you have a [JIRA account](https://issues.apache.org/jira/).
-+ Make sure you have a [GitHub account](https://github.com/signup/free).
-+ If you're planning to implement a new feature it makes sense to discuss your changes on the [dev list](https://commons.apache.org/mail-lists.html) first. This way you can make sure you're not wasting your time on something that isn't considered to be in Apache Commons Geometry Hull's scope.
-+ Submit a [Jira Ticket][jira] for your issue, assuming one does not already exist.
-  + Clearly describe the issue including steps to reproduce when it is a bug.
-  + Make sure you fill in the earliest version that you know has the issue.
-+ Find the corresponding [repository on GitHub](https://github.com/apache/?query=commons-),
-[fork](https://help.github.com/articles/fork-a-repo/) and check out your forked repository.
-
-Making Changes
---------------
-
-+ Create a _topic branch_ for your isolated work.
-  * Usually you should base your branch on the `master` or `trunk` branch.
-  * A good topic branch name can be the JIRA bug id plus a keyword, e.g. `GEOMETRY-123-InputStream`.
-  * If you have submitted multiple JIRA issues, try to maintain separate branches and pull requests.
-+ Make commits of logical units.
-  * Make sure your commit messages are meaningful and in the proper format. Your commit message should contain the key of the JIRA issue.
-  * e.g. `GEOMETRY-123: Close input stream earlier`
-+ Respect the original code style:
-  + Only use spaces for indentation.
-  + Create minimal diffs - disable _On Save_ actions like _Reformat Source Code_ or _Organize Imports_. If you feel the source code should be reformatted create a separate PR for this change first.
-  + Check for unnecessary whitespace with `git diff` -- check before committing.
-+ Make sure you have added the necessary tests for your changes, typically in `src/test/java`.
-+ Run all the tests with `mvn clean verify` to assure nothing else was accidentally broken.
-
-Making Trivial Changes
-----------------------
-
-The JIRA tickets are used to generate the changelog for the next release.
-
-For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA.
-In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number.
-
-
-Submitting Changes
-------------------
-
-+ Sign and submit the Apache [Contributor License Agreement][cla] if you haven't already.
-  * Note that small patches & typical bug fixes do not require a CLA as
-    clause 5 of the [Apache License](https://www.apache.org/licenses/LICENSE-2.0.html#contributions)
-    covers them.
-+ Push your changes to a topic branch in your fork of the repository.
-+ Submit a _Pull Request_ to the corresponding repository in the `apache` organization.
-  * Verify _Files Changed_ shows only your intended changes and does not
-  include additional files like `target/*.class`
-+ Update your JIRA ticket and include a link to the pull request in the ticket.
-
-If you prefer to not use GitHub, then you can instead use
-`git format-patch` (or `svn diff`) and attach the patch file to the JIRA issue.
-
-
-Additional Resources
---------------------
-
-+ [Contributing patches](https://commons.apache.org/patches.html)
-+ [Apache Commons Geometry Hull JIRA project page][jira]
-+ [Contributor License Agreement][cla]
-+ [General GitHub documentation](https://help.github.com/)
-+ [GitHub pull request documentation](https://help.github.com/articles/creating-a-pull-request/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ `#apache-commons` IRC channel on `irc.freenode.net`
-
-[cla]:https://www.apache.org/licenses/#clas
-[jira]:https://issues.apache.org/jira/browse/GEOMETRY
diff --git a/commons-geometry-hull/LICENSE.txt b/commons-geometry-hull/LICENSE.txt
deleted file mode 100644
index 261eeb9..0000000
--- a/commons-geometry-hull/LICENSE.txt
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/commons-geometry-hull/NOTICE.txt b/commons-geometry-hull/NOTICE.txt
deleted file mode 100644
index 8d9849f..0000000
--- a/commons-geometry-hull/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Commons Geometry
-Copyright 2020 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/commons-geometry-hull/README.md b/commons-geometry-hull/README.md
deleted file mode 100644
index 8ab4e1f..0000000
--- a/commons-geometry-hull/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: readme-md-template.md                                 |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:readme-md                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Apache Commons Geometry Hull
-===================
-
-[![Build Status](https://travis-ci.org/apache/commons-geometry-hull.svg?branch=master)](https://travis-ci.org/apache/commons-geometry-hull)
-[![Coverage Status](https://coveralls.io/repos/apache/commons-geometry-hull/badge.svg?branch=master)](https://coveralls.io/r/apache/commons-geometry-hull)
-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.commons/commons-geometry-hull/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.apache.commons/commons-geometry-hull/)
-[![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)
-
-Algorithms for computing convex hulls.
-
-Documentation
--------------
-
-More information can be found on the [Apache Commons Geometry Hull homepage](https://commons.apache.org/proper/commons-geometry).
-The [JavaDoc](https://commons.apache.org/proper/commons-geometry/javadocs/api-release) can be browsed.
-Questions related to the usage of Apache Commons Geometry Hull should be posted to the [user mailing list][ml].
-
-Where can I get the latest release?
------------------------------------
-You can download source and binaries from our [download page](https://commons.apache.org/proper/commons-geometry/download_geometry.cgi).
-
-Alternatively you can pull it from the central Maven repositories:
-
-```xml
-<dependency>
-  <groupId>org.apache.commons</groupId>
-  <artifactId>commons-geometry-hull</artifactId>
-  <version>1.0-beta1</version>
-</dependency>
-```
-
-Contributing
-------------
-
-We accept Pull Requests via GitHub. The [developer mailing list][ml] is the main channel of communication for contributors.
-There are some guidelines which will make applying PRs easier for us:
-+ No tabs! Please use spaces for indentation.
-+ Respect the code style.
-+ Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-+ Provide JUnit tests for your changes and make sure your changes don't break any existing tests by running ```mvn clean test```.
-
-If you plan to contribute on a regular basis, please consider filing a [contributor license agreement](https://www.apache.org/licenses/#clas).
-You can learn more about contributing via GitHub in our [contribution guidelines](CONTRIBUTING.md).
-
-License
--------
-This code is under the [Apache Licence v2](https://www.apache.org/licenses/LICENSE-2.0).
-
-See the `NOTICE.txt` file for required notices and attributions.
-
-Donations
----------
-You like Apache Commons Geometry Hull? Then [donate back to the ASF](https://www.apache.org/foundation/contributing.html) to support the development.
-
-Additional Resources
---------------------
-
-+ [Apache Commons Homepage](https://commons.apache.org/)
-+ [Apache Issue Tracker (JIRA)](https://issues.apache.org/jira/browse/GEOMETRY)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ `#apache-commons` IRC channel on `irc.freenode.org`
-
-[ml]:https://commons.apache.org/mail-lists.html
diff --git a/commons-geometry-hull/pom.xml b/commons-geometry-hull/pom.xml
deleted file mode 100644
index d12b4e4..0000000
--- a/commons-geometry-hull/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-         xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>commons-geometry-hull</artifactId>
-  <name>Apache Commons Geometry Hull</name>
-
-  <description>Algorithms for computing convex hulls.</description>
-
-  <properties>
-    <!-- OSGi -->
-    <commons.osgi.symbolicName>org.apache.commons.geometry.hull</commons.osgi.symbolicName>
-    <commons.osgi.export>org.apache.commons.geometry.hull.*</commons.osgi.export>
-    <!-- Java 9+ -->
-    <commons.automatic.module.name>org.apache.commons.geometry.hull</commons.automatic.module.name>
-    <!-- Workaround to avoid duplicating config files. -->
-    <geometry.parent.dir>${basedir}/..</geometry.parent.dir>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-euclidean</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-core</artifactId>
-      <version>${project.version}</version>
-      <classifier>tests</classifier>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-euclidean</artifactId>
-      <version>${project.version}</version>
-      <classifier>tests</classifier>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-client-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-simple</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-rng-sampling</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- testing -->
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHull.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHull.java
deleted file mode 100644
index 09a7477..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHull.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull;
-
-import java.util.List;
-
-import org.apache.commons.geometry.core.Point;
-import org.apache.commons.geometry.core.Region;
-
-/**
- * This class represents a convex hull.
- *
- * @param <P> Point implementation type.
- */
-public interface ConvexHull<P extends Point<P>> {
-
-    /** Get the vertices of the convex hull.
-     * @return vertices of the convex hull
-     */
-    List<P> getVertices();
-
-    /** Return the region representing the convex hull. This will return
-     * null in cases where the hull does not define a region with non-zero
-     * size, such as when only a single unique point exists or when all points
-     * are collinear.
-     * @return the region representing by the convex hull or null if the
-     *      convex hull does not define a region of non-zero size
-     */
-    Region<P> getRegion();
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHullGenerator.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHullGenerator.java
deleted file mode 100644
index 3db030b..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/ConvexHullGenerator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull;
-
-import java.util.Collection;
-
-import org.apache.commons.geometry.core.Point;
-
-/**
- * Interface for convex hull generators.
- *
- * @param <P> Type of the {@link Point}
- *
- * @see <a href="http://en.wikipedia.org/wiki/Convex_hull">Convex Hull (Wikipedia)</a>
- * @see <a href="http://mathworld.wolfram.com/ConvexHull.html">Convex Hull (MathWorld)</a>
- */
-public interface ConvexHullGenerator<P extends Point<P>> {
-    /**
-     * Build a convex hull from the set of input points.
-     *
-     * @param points the set of input points
-     * @return the convex hull
-     * @throws IllegalStateException if generator fails to generate a convex hull for
-     *      the given set of input points
-     */
-    ConvexHull<P> generate(Collection<P> points);
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AbstractConvexHullGenerator2D.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AbstractConvexHullGenerator2D.java
deleted file mode 100644
index 45649d9..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AbstractConvexHullGenerator2D.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-
-/**
- * Abstract base class for convex hull generators in the two-dimensional Euclidean space.
- */
-abstract class AbstractConvexHullGenerator2D implements ConvexHullGenerator2D {
-
-    /** Precision context used to compare floating point numbers. */
-    private final Precision.DoubleEquivalence precision;
-
-    /**
-     * Indicates if collinear points on the hull shall be present in the output.
-     * If {@code false}, only the extreme points are added to the hull.
-     */
-    private final boolean includeCollinearPoints;
-
-    /**
-     * Simple constructor.
-     *
-     * @param includeCollinearPoints indicates if collinear points on the hull shall be
-     * added as hull vertices
-     * @param precision precision context used to compare floating point numbers
-     */
-    protected AbstractConvexHullGenerator2D(final boolean includeCollinearPoints,
-            final Precision.DoubleEquivalence precision) {
-        this.includeCollinearPoints = includeCollinearPoints;
-        this.precision = precision;
-    }
-
-    /** Get the object used to determine floating point equality for this region.
-     * @return the floating point precision context for the instance
-     */
-    public Precision.DoubleEquivalence getPrecision() {
-        return precision;
-    }
-
-    /**
-     * Returns if collinear points on the hull will be added as hull vertices.
-     * @return {@code true} if collinear points are added as hull vertices, or {@code false}
-     * if only extreme points are present.
-     */
-    public boolean isIncludeCollinearPoints() {
-        return includeCollinearPoints;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public ConvexHull2D generate(final Collection<Vector2D> points) {
-        Collection<Vector2D> hullVertices;
-        if (points.size() < 2) {
-            hullVertices = points;
-        } else {
-            hullVertices = findHullVertices(points);
-        }
-
-        if (!isConvex(hullVertices)) {
-            throw new IllegalStateException("Convex hull algorithm failed to generate solution");
-        }
-
-        return new ConvexHull2D(hullVertices, precision);
-    }
-
-    /**
-     * Find the convex hull vertices from the set of input points.
-     * @param points the set of input points
-     * @return the convex hull vertices in CCW winding
-     */
-    protected abstract Collection<Vector2D> findHullVertices(Collection<Vector2D> points);
-
-    /** Return true if the given vertices define a convex hull.
-     * @param vertices the hull vertices
-     * @return {@code true} if the vertices form a convex hull, {@code false} otherwise
-     */
-    private boolean isConvex(final Collection<Vector2D> vertices) {
-        final int size = vertices.size();
-
-        if (size < 3) {
-            // 1 or 2 points always define a convex set
-            return true;
-        }
-
-        final Iterator<Vector2D> it = vertices.iterator();
-
-        Vector2D p1 = it.next();
-        Vector2D p2 = it.next();
-        Vector2D p3;
-
-        Vector2D v1;
-        Vector2D v2;
-
-        while (it.hasNext()) {
-            p3 = it.next();
-
-            v1 = p1.vectorTo(p2);
-            v2 = p2.vectorTo(p3);
-
-            // negative signed areas mean a clockwise winding
-            if (precision.compare(v1.signedArea(v2), 0.0) < 0) {
-                return false;
-            }
-
-            p1 = p2;
-            p2 = p3;
-        }
-
-        return true;
-    }
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristic.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristic.java
deleted file mode 100644
index 15be662..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristic.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-
-/**
- * A simple heuristic to improve the performance of convex hull algorithms.
- * <p>
- * The heuristic is based on the idea of a convex quadrilateral, which is formed by
- * four points with the lowest and highest x / y coordinates. Any point that lies inside
- * this quadrilateral can not be part of the convex hull and can thus be safely discarded
- * before generating the convex hull itself.
- * <p>
- * The complexity of the operation is O(n), and may greatly improve the time it takes to
- * construct the convex hull afterwards, depending on the point distribution.
- *
- * @see <a href="http://en.wikipedia.org/wiki/Convex_hull_algorithms#Akl-Toussaint_heuristic">
- * Akl-Toussaint heuristic (Wikipedia)</a>
- */
-public final class AklToussaintHeuristic {
-
-    /** Hide utility constructor. */
-    private AklToussaintHeuristic() {
-    }
-
-    /**
-     * Returns a point set that is reduced by all points for which it is safe to assume
-     * that they are not part of the convex hull.
-     *
-     * @param points the original point set
-     * @return a reduced point set, useful as input for convex hull algorithms
-     */
-    public static Collection<Vector2D> reducePoints(final Collection<Vector2D> points) {
-
-        // find the leftmost point
-        int size = 0;
-        Vector2D minX = null;
-        Vector2D maxX = null;
-        Vector2D minY = null;
-        Vector2D maxY = null;
-        for (final Vector2D p : points) {
-            if (minX == null || p.getX() < minX.getX()) {
-                minX = p;
-            }
-            if (maxX == null || p.getX() > maxX.getX()) {
-                maxX = p;
-            }
-            if (minY == null || p.getY() < minY.getY()) {
-                minY = p;
-            }
-            if (maxY == null || p.getY() > maxY.getY()) {
-                maxY = p;
-            }
-            size++;
-        }
-
-        if (size < 4) {
-            return points;
-        }
-
-        final List<Vector2D> quadrilateral = buildQuadrilateral(minY, maxX, maxY, minX);
-        // if the quadrilateral is not well formed, e.g. only 2 points, do not attempt to reduce
-        if (quadrilateral.size() < 3) {
-            return points;
-        }
-
-        final List<Vector2D> reducedPoints = new ArrayList<>(quadrilateral);
-        for (final Vector2D p : points) {
-            // check all points if they are within the quadrilateral
-            // in which case they can not be part of the convex hull
-            if (!insideQuadrilateral(p, quadrilateral)) {
-                reducedPoints.add(p);
-            }
-        }
-
-        return reducedPoints;
-    }
-
-    /**
-     * Build the convex quadrilateral with the found corner points (with min/max x/y coordinates).
-     *
-     * @param points the respective points with min/max x/y coordinate
-     * @return the quadrilateral
-     */
-    private static List<Vector2D> buildQuadrilateral(final Vector2D... points) {
-        final List<Vector2D> quadrilateral = new ArrayList<>();
-        for (final Vector2D p : points) {
-            if (!quadrilateral.contains(p)) {
-                quadrilateral.add(p);
-            }
-        }
-        return quadrilateral;
-    }
-
-    /**
-     * Checks if the given point is located within the convex quadrilateral.
-     * @param point the point to check
-     * @param quadrilateralPoints the convex quadrilateral, represented by 4 points
-     * @return {@code true} if the point is inside the quadrilateral, {@code false} otherwise
-     */
-    private static boolean insideQuadrilateral(final Vector2D point,
-                                               final List<? extends Vector2D> quadrilateralPoints) {
-
-        Vector2D v1 = quadrilateralPoints.get(0);
-        Vector2D v2 = quadrilateralPoints.get(1);
-
-        if (point.equals(v1) || point.equals(v2)) {
-            return true;
-        }
-
-        // get the location of the point relative to the first two vertices
-        final double last = signedAreaPoints(v1, v2, point);
-        final int size = quadrilateralPoints.size();
-        // loop through the rest of the vertices
-        for (int i = 1; i < size; i++) {
-            v1 = v2;
-            v2 = quadrilateralPoints.get((i + 1) == size ? 0 : i + 1);
-
-            if (point.equals(v2)) {
-                return true;
-            }
-
-            // do side of line test: multiply the last location with this location
-            // if they are the same sign then the operation will yield a positive result
-            // -x * -y = +xy, x * y = +xy, -x * y = -xy, x * -y = -xy
-            if (last * signedAreaPoints(v1, v2, point) < 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /** Compute the signed area of the parallelogram formed by vectors between the given points. The first
-     * vector points from {@code p0} to {@code p1} and the second from {@code p0} to {@code p3}.
-     * @param p0 first point
-     * @param p1 second point
-     * @param p2 third point
-     * @return signed area of parallelogram formed by vectors between the given points
-     */
-    private static double signedAreaPoints(final Vector2D p0, final Vector2D p1, final Vector2D p2) {
-        return p0.vectorTo(p1).signedArea(p0.vectorTo(p2));
-    }
-
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2D.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2D.java
deleted file mode 100644
index cf6cf50..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2D.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.euclidean.twod.ConvexArea;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.geometry.euclidean.twod.path.LinePath;
-import org.apache.commons.geometry.hull.ConvexHull;
-import org.apache.commons.numbers.core.Precision;
-
-/**
- * This class represents a convex hull in two-dimensional Euclidean space.
- */
-public final class ConvexHull2D implements ConvexHull<Vector2D> {
-
-    /** Vertices for the convex hull, in order. */
-    private final List<Vector2D> vertices;
-
-    /** Polyline path for the convex hull. */
-    private final LinePath path;
-
-    /** Simple constructor; no validation is performed.
-     * @param vertices the vertices of the convex hull; callers are responsible for ensuring that
-     *      the given vertices are in order, unique, and define a convex hull.
-     * @param precision precision context used to compare floating point numbers
-     */
-    ConvexHull2D(final Collection<Vector2D> vertices, final Precision.DoubleEquivalence precision) {
-        this.vertices = Collections.unmodifiableList(new ArrayList<>(vertices));
-        this.path = buildHullPath(vertices, precision);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public List<Vector2D> getVertices() {
-        return vertices;
-    }
-
-    /** Get a path defining the convex hull. The path will contain
-     * <ul>
-     *      <li>zero segments if the hull consists of only a single point,</li>
-     *      <li>one segment if the hull consists of two points,</li>
-     *      <li>three or more segments defining a closed loop if the hull consists of more than
-     *          two non-collinear points.</li>
-     * </ul>
-     * @return polyline path defining the convex hull
-     */
-    public LinePath getPath() {
-        return path;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public ConvexArea getRegion() {
-        return path.isClosed() ?
-                ConvexArea.convexPolygonFromPath(path) :
-                null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(getClass().getSimpleName())
-            .append("[vertices= ")
-            .append(getVertices())
-            .append(']');
-
-        return sb.toString();
-    }
-
-    /** Build a polyline representing the path for a convex hull.
-     * @param vertices convex hull vertices
-     * @param precision precision context used to compare floating point values
-     * @return path for the convex hull defined by the given vertices
-     */
-    private static LinePath buildHullPath(final Collection<Vector2D> vertices,
-            final Precision.DoubleEquivalence precision) {
-        if (vertices.size() < 2) {
-            return LinePath.empty();
-        }
-
-        final boolean closeLoop = vertices.size() > 2;
-
-        return LinePath.builder(precision)
-                .appendVertices(vertices)
-                .build(closeLoop);
-    }
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2D.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2D.java
deleted file mode 100644
index bd8caa7..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2D.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.Collection;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.geometry.hull.ConvexHullGenerator;
-
-/**
- * Interface for convex hull generators in the two-dimensional Euclidean space.
- */
-public interface ConvexHullGenerator2D extends ConvexHullGenerator<Vector2D> {
-
-    /** {@inheritDoc} */
-    @Override
-    ConvexHull2D generate(Collection<Vector2D> points);
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChain.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChain.java
deleted file mode 100644
index b521727..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChain.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.geometry.euclidean.twod.Lines;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-
-/**
- * Implements Andrew's monotone chain method to generate the convex hull of a finite set of
- * points in the two-dimensional Euclidean space.
- * <p>
- * The runtime complexity is O(n log n), with n being the number of input points. If the
- * point set is already sorted (by x-coordinate), the runtime complexity is O(n).
- * <p>
- * The implementation is not sensitive to collinear points on the hull. The parameter
- * {@code includeCollinearPoints} allows to control the behavior with regard to collinear points.
- * If {@code true}, all points on the boundary of the hull will be added to the hull vertices,
- * otherwise only the extreme points will be present. By default, collinear points are not added
- * as hull vertices.
- * <p>
- *
- * @see <a href="http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain">
- * Andrew's monotone chain algorithm (Wikibooks)</a>
- */
-public class MonotoneChain extends AbstractConvexHullGenerator2D {
-
-    /** Create a new instance that only includes extreme points as hull vertices.
-     * @param precision precision context used to compare floating point numbers
-     */
-    public MonotoneChain(final Precision.DoubleEquivalence precision) {
-        this(false, precision);
-    }
-
-    /** Create a new instance with the given parameters.
-     * @param includeCollinearPoints whether collinear points shall be added as hull vertices
-     * @param precision precision context used to compare floating point numbers
-     */
-    public MonotoneChain(final boolean includeCollinearPoints, final Precision.DoubleEquivalence precision) {
-        super(includeCollinearPoints, precision);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Collection<Vector2D> findHullVertices(final Collection<Vector2D> points) {
-
-        final List<Vector2D> pointsSortedByXAxis = new ArrayList<>(points);
-
-        // sort the points in increasing order on the x-axis
-        pointsSortedByXAxis.sort((o1, o2) -> {
-            final Precision.DoubleEquivalence precision = getPrecision();
-            // need to take the tolerance value into account, otherwise collinear points
-            // will not be handled correctly when building the upper/lower hull
-            final int cmp = precision.compare(o1.getX(), o2.getX());
-            if (cmp == 0) {
-                return precision.compare(o1.getY(), o2.getY());
-            } else {
-                return cmp;
-            }
-        });
-
-        // build lower hull
-        final List<Vector2D> lowerHull = new ArrayList<>();
-        for (final Vector2D p : pointsSortedByXAxis) {
-            updateHull(p, lowerHull);
-        }
-
-        // build upper hull
-        final List<Vector2D> upperHull = new ArrayList<>();
-        for (int idx = pointsSortedByXAxis.size() - 1; idx >= 0; idx--) {
-            final Vector2D p = pointsSortedByXAxis.get(idx);
-            updateHull(p, upperHull);
-        }
-
-        // concatenate the lower and upper hulls
-        // the last point of each list is omitted as it is repeated at the beginning of the other list
-        final List<Vector2D> hullVertices = new ArrayList<>(lowerHull.size() + upperHull.size() - 2);
-        for (int idx = 0; idx < lowerHull.size() - 1; idx++) {
-            hullVertices.add(lowerHull.get(idx));
-        }
-        for (int idx = 0; idx < upperHull.size() - 1; idx++) {
-            hullVertices.add(upperHull.get(idx));
-        }
-
-        // special case: if the lower and upper hull may contain only 1 point if all are identical
-        if (hullVertices.isEmpty() && !lowerHull.isEmpty()) {
-            hullVertices.add(lowerHull.get(0));
-        }
-
-        return hullVertices;
-    }
-
-    /**
-     * Update the partial hull with the current point.
-     *
-     * @param point the current point
-     * @param hull the partial hull
-     */
-    private void updateHull(final Vector2D point, final List<Vector2D> hull) {
-        final Precision.DoubleEquivalence precision = getPrecision();
-
-        if (hull.size() == 1) {
-            // ensure that we do not add an identical point
-            final Vector2D p1 = hull.get(0);
-            if (p1.eq(point, precision)) {
-                return;
-            }
-        }
-
-        while (hull.size() >= 2) {
-            final int size = hull.size();
-            final Vector2D p1 = hull.get(size - 2);
-            final Vector2D p2 = hull.get(size - 1);
-
-            final double offset = Lines.fromPoints(p1, p2, precision).offset(point);
-            if (precision.eqZero(offset)) {
-                // the point is collinear to the line (p1, p2)
-
-                final double distanceToCurrent = p1.distance(point);
-                if (precision.eqZero(distanceToCurrent) || precision.eqZero(p2.distance(point))) {
-                    // the point is assumed to be identical to either p1 or p2
-                    return;
-                }
-
-                final double distanceToLast = p1.distance(p2);
-                if (isIncludeCollinearPoints()) {
-                    final int index = distanceToCurrent < distanceToLast ? size - 1 : size;
-                    hull.add(index, point);
-                } else {
-                    if (distanceToCurrent > distanceToLast) {
-                        hull.remove(size - 1);
-                        hull.add(point);
-                    }
-                }
-                return;
-            } else if (offset > 0) {
-                hull.remove(size - 1);
-            } else {
-                break;
-            }
-        }
-        hull.add(point);
-    }
-}
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/package-info.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/package-info.java
deleted file mode 100644
index ca9ae62..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/euclidean/twod/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- * <p>
- * This package provides algorithms to generate the convex hull
- * for a set of points in an two-dimensional Euclidean space.
- * </p>
- *
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
diff --git a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/package-info.java b/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/package-info.java
deleted file mode 100644
index c52c08c..0000000
--- a/commons-geometry-hull/src/main/java/org/apache/commons/geometry/hull/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- * <p>
- * This package provides interfaces and classes related to the convex hull problem.
- * </p>
- *
- */
-package org.apache.commons.geometry.hull;
diff --git a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/DocumentationExamplesTest.java b/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/DocumentationExamplesTest.java
deleted file mode 100644
index 6a00f91..0000000
--- a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/DocumentationExamplesTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
-import org.apache.commons.geometry.euclidean.twod.ConvexArea;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.geometry.hull.euclidean.twod.ConvexHull2D;
-import org.apache.commons.geometry.hull.euclidean.twod.MonotoneChain;
-import org.apache.commons.numbers.core.Precision;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-/** This class contains code listed as examples in the user guide and other documentation.
- * If any portion of this code changes, the corresponding examples in the documentation <em>must</em> be updated.
- */
-class DocumentationExamplesTest {
-
-    private static final double TEST_EPS = 1e-15;
-
-    @Test
-    void testMonotoneChainExample() {
-        final Precision.DoubleEquivalence precision = Precision.doubleEquivalenceOfEpsilon(1e-10);
-
-        // create a list of input points for the algorithm
-        final List<Vector2D> pts = Arrays.asList(
-                    Vector2D.ZERO,
-                    Vector2D.of(0.5, 0.5),
-                    Vector2D.of(0, 0.5),
-                    Vector2D.of(0, 1),
-                    Vector2D.of(0.25, 0.1),
-                    Vector2D.of(1, 0),
-                    Vector2D.of(1, 1),
-                    Vector2D.of(0.75, 0.9)
-                );
-
-        // create an instance of the monotone chain convex hull generator
-        final MonotoneChain mc = new MonotoneChain(precision);
-
-        // compute the convex hull
-        final ConvexHull2D hull = mc.generate(pts);
-
-        // list the vertices from the input that were used in the hull
-        final List<Vector2D> vertices = hull.getVertices(); // [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)]
-
-        // get the hull as a region
-        final ConvexArea region = hull.getRegion();
-        final boolean containsAll = pts.stream().allMatch(region::contains); // true - region contains all input points
-
-        // ---
-        Assertions.assertEquals(4, vertices.size());
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, vertices.get(0), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(1, 0), vertices.get(1), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(1, 1), vertices.get(2), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(0, 1), vertices.get(3), TEST_EPS);
-
-        Assertions.assertTrue(containsAll);
-    }
-}
diff --git a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristicTest.java b/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristicTest.java
deleted file mode 100644
index 0f08c8d..0000000
--- a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/AklToussaintHeuristicTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.Collection;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-
-/**
- * Test class for AklToussaintHeuristic.
- */
-class AklToussaintHeuristicTest extends ConvexHullGenerator2DAbstractTest {
-
-    @Override
-    protected ConvexHullGenerator2D createConvexHullGenerator(final boolean includeCollinearPoints) {
-        return new MonotoneChain(includeCollinearPoints, TEST_PRECISION);
-    }
-
-    @Override
-    protected Collection<Vector2D> reducePoints(final Collection<Vector2D> points) {
-        return AklToussaintHeuristic.reducePoints(points);
-    }
-
-}
diff --git a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2DTest.java b/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2DTest.java
deleted file mode 100644
index 85ad53c..0000000
--- a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2DTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.core.GeometryTestUtils;
-import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.geometry.euclidean.twod.path.LinePath;
-import org.apache.commons.numbers.core.Precision;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class ConvexHull2DTest {
-
-    private static final double TEST_EPS = 1e-10;
-
-    private static final Precision.DoubleEquivalence TEST_PRECISION =
-            Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
-
-    @Test
-    void testProperties_noPoints() {
-        // act
-        final ConvexHull2D hull = new ConvexHull2D(Collections.emptyList(), TEST_PRECISION);
-
-        // assert
-        Assertions.assertEquals(0, hull.getVertices().size());
-
-        final LinePath path = hull.getPath();
-        Assertions.assertEquals(0, path.getElements().size());
-
-        final List<Vector2D> pathVertices = path.getVertexSequence();
-        Assertions.assertEquals(0, pathVertices.size());
-
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testProperties_singlePoint() {
-        // arrange
-        final List<Vector2D> vertices = Collections.singletonList(Vector2D.Unit.PLUS_X);
-
-        // act
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // assert
-        Assertions.assertEquals(vertices, hull.getVertices());
-
-        final LinePath path = hull.getPath();
-        Assertions.assertEquals(0, path.getElements().size());
-
-        final List<Vector2D> pathVertices = path.getVertexSequence();
-        Assertions.assertEquals(0, pathVertices.size());
-
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testProperties_twoPoints() {
-        // arrange
-        final List<Vector2D> vertices = Arrays.asList(Vector2D.Unit.PLUS_X, Vector2D.Unit.PLUS_Y);
-
-        // act
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // assert
-        Assertions.assertEquals(vertices, hull.getVertices());
-
-        final LinePath path = hull.getPath();
-        Assertions.assertEquals(1, path.getElements().size());
-
-        final List<Vector2D> pathVertices = path.getVertexSequence();
-        Assertions.assertEquals(2, pathVertices.size());
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(0), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(1), TEST_EPS);
-
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testProperties_threePoints() {
-        // arrange
-        final List<Vector2D> vertices = Arrays.asList(Vector2D.ZERO, Vector2D.Unit.PLUS_X, Vector2D.Unit.PLUS_Y);
-
-        // act
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // assert
-        Assertions.assertEquals(vertices, hull.getVertices());
-
-        final LinePath path = hull.getPath();
-        Assertions.assertEquals(3, path.getElements().size());
-
-        final List<Vector2D> pathVertices = path.getVertexSequence();
-        Assertions.assertEquals(4, pathVertices.size());
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(0), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(1), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(2), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(3), TEST_EPS);
-
-        Assertions.assertEquals(0.5, hull.getRegion().getSize(), TEST_EPS);
-    }
-
-    @Test
-    void testProperties_fourPoints() {
-        // arrange
-        final List<Vector2D> vertices = Arrays.asList(Vector2D.ZERO, Vector2D.Unit.PLUS_X,
-                Vector2D.of(1, 1), Vector2D.Unit.PLUS_Y);
-
-        // act
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // assert
-        Assertions.assertEquals(vertices, hull.getVertices());
-
-        final LinePath path = hull.getPath();
-        Assertions.assertEquals(4, path.getElements().size());
-
-        final List<Vector2D> pathVertices = path.getVertexSequence();
-        Assertions.assertEquals(5, pathVertices.size());
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(0), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_X, pathVertices.get(1), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.of(1, 1), pathVertices.get(2), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.Unit.PLUS_Y, pathVertices.get(3), TEST_EPS);
-        EuclideanTestUtils.assertCoordinatesEqual(Vector2D.ZERO, pathVertices.get(4), TEST_EPS);
-
-        Assertions.assertEquals(1.0, hull.getRegion().getSize(), TEST_EPS);
-    }
-
-    @Test
-    void testVertexListCannotBeModified() {
-        // arrange
-        final List<Vector2D> vertices = new ArrayList<>();
-        vertices.add(Vector2D.Unit.PLUS_X);
-
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // act
-        final List<Vector2D> hullVertices = hull.getVertices();
-
-        // assert
-        Assertions.assertNotSame(vertices, hullVertices);
-
-        Assertions.assertThrows(UnsupportedOperationException.class, () -> hullVertices.add(Vector2D.Unit.PLUS_Y));
-    }
-
-    @Test
-    void testToString() {
-        // arrange
-        final List<Vector2D> vertices = Collections.singletonList(Vector2D.Unit.PLUS_X);
-        final ConvexHull2D hull = new ConvexHull2D(vertices, TEST_PRECISION);
-
-        // act
-        final String str = hull.toString();
-
-        // assert
-        GeometryTestUtils.assertContains("ConvexHull2D[vertices= [(1", str);
-    }
-}
diff --git a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2DAbstractTest.java b/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2DAbstractTest.java
deleted file mode 100644
index e30d5cc..0000000
--- a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2DAbstractTest.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.geometry.core.Region;
-import org.apache.commons.geometry.core.RegionLocation;
-import org.apache.commons.geometry.euclidean.twod.ConvexArea;
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.apache.commons.numbers.core.Sum;
-import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.simple.RandomSource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * Abstract base test class for 2D convex hull generators.
- */
-public abstract class ConvexHullGenerator2DAbstractTest {
-
-    protected static final double TEST_EPS = 1e-10;
-
-    protected static final Precision.DoubleEquivalence TEST_PRECISION =
-            Precision.doubleEquivalenceOfEpsilon(TEST_EPS);
-
-    protected ConvexHullGenerator2D generator;
-
-    protected UniformRandomProvider random;
-
-    protected abstract ConvexHullGenerator2D createConvexHullGenerator(boolean includeCollinearPoints);
-
-    protected Collection<Vector2D> reducePoints(final Collection<Vector2D> points) {
-        // do nothing by default, may be overridden by other tests
-        return points;
-    }
-
-    @BeforeEach
-    public void setUp() {
-        // by default, do not include collinear points
-        generator = createConvexHullGenerator(false);
-        random = RandomSource.create(RandomSource.MT, 10);
-    }
-
-    // ------------------------------------------------------------------------------
-
-    @Test
-    void testEmpty() {
-        // act
-        final ConvexHull2D hull = generator.generate(Collections.emptyList());
-
-        // assert
-        Assertions.assertEquals(0, hull.getVertices().size());
-        Assertions.assertEquals(0, hull.getPath().getElements().size());
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testOnePoint() {
-        // arrange
-        final List<Vector2D> points = createRandomPoints(1);
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        Assertions.assertEquals(1, hull.getVertices().size());
-        Assertions.assertEquals(0, hull.getPath().getElements().size());
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testTwoPoints() {
-        // arrange
-        final List<Vector2D> points = createRandomPoints(2);
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        Assertions.assertEquals(2, hull.getVertices().size());
-        Assertions.assertEquals(1, hull.getPath().getElements().size());
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testAllIdentical() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(1, 1));
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        Assertions.assertEquals(1, hull.getVertices().size());
-        Assertions.assertEquals(0, hull.getPath().getElements().size());
-        Assertions.assertNull(hull.getRegion());
-    }
-
-    @Test
-    void testConvexHull() {
-        // execute 100 random variations
-        for (int i = 0; i < 100; i++) {
-            // randomize the size from 4 to 100
-            final int size = (int) Math.floor(random.nextDouble() * 96.0 + 4.0);
-
-            final List<Vector2D> points = createRandomPoints(size);
-
-            // act
-            final ConvexHull2D hull = generator.generate(reducePoints(points));
-
-            // assert
-            checkConvexHull(points, hull);
-        }
-    }
-
-    @Test
-    void testCollinearPoints() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(4, 1));
-        points.add(Vector2D.of(10, 1));
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        checkConvexHull(points, hull);
-    }
-
-    @Test
-    void testCollinearPointsReverse() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(10, 1));
-        points.add(Vector2D.of(4, 1));
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        checkConvexHull(points, hull);
-    }
-
-    @Test
-    void testCollinearPointsIncluded() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(4, 1));
-        points.add(Vector2D.of(10, 1));
-
-        // act
-        final ConvexHull2D hull = createConvexHullGenerator(true).generate(points);
-
-        // assert
-        checkConvexHull(points, hull, true);
-    }
-
-    @Test
-    void testCollinearPointsIncludedReverse() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(10, 1));
-        points.add(Vector2D.of(4, 1));
-
-        // act
-        final ConvexHull2D hull = createConvexHullGenerator(true).generate(points);
-
-        // assert
-        checkConvexHull(points, hull, true);
-    }
-
-    @Test
-    void testIdenticalPoints() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(4, 1));
-        points.add(Vector2D.of(1, 1));
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        checkConvexHull(points, hull);
-    }
-
-    @Test
-    void testIdenticalPoints2() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(4, 1));
-        points.add(Vector2D.of(1, 1));
-
-        // act
-        final ConvexHull2D hull = createConvexHullGenerator(true).generate(points);
-
-        // assert
-        checkConvexHull(points, hull, true);
-    }
-
-    @Test
-    void testClosePoints() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(2, 2));
-        points.add(Vector2D.of(2, 4));
-        points.add(Vector2D.of(4, 1));
-        points.add(Vector2D.of(1.00001, 1));
-
-        // act
-        final ConvexHull2D hull = generator.generate(points);
-
-        // assert
-        checkConvexHull(points, hull);
-    }
-
-    @Test
-    void testCollinearPointOnExistingBoundary() {
-        // --- arrange
-        // MATH-1135: check that collinear points on the hull are handled correctly
-        //            when only a minimal hull shall be constructed
-        final Collection<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(7.3152, 34.7472));
-        points.add(Vector2D.of(6.400799999999997, 34.747199999999985));
-        points.add(Vector2D.of(5.486399999999997, 34.7472));
-        points.add(Vector2D.of(4.876799999999999, 34.7472));
-        points.add(Vector2D.of(4.876799999999999, 34.1376));
-        points.add(Vector2D.of(4.876799999999999, 30.48));
-        points.add(Vector2D.of(6.0959999999999965, 30.48));
-        points.add(Vector2D.of(6.0959999999999965, 34.1376));
-        points.add(Vector2D.of(7.315199999999996, 34.1376));
-        points.add(Vector2D.of(7.3152, 30.48));
-
-        // --- act
-        final ConvexHull2D hull = createConvexHullGenerator(false).generate(points);
-
-        // --- assert
-        checkConvexHull(points, hull);
-    }
-
-    @Test
-    void testCollinearPointsInAnyOrder_threeCollinearPoints() {
-        // --- arrange
-        // MATH-1148: collinear points on the hull might be in any order
-        //            make sure that they are processed in the proper order
-        //            for each algorithm.
-
-        final List<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(16.078200000000184, -36.52519999989808));
-        points.add(Vector2D.of(19.164300000000186, -36.52519999989808));
-        points.add(Vector2D.of(19.1643, -25.28136477910407));
-        points.add(Vector2D.of(19.1643, -17.678400000004157));
-
-        // --- act/assert
-        ConvexHull2D hull = createConvexHullGenerator(false).generate(points);
-        checkConvexHull(points, hull);
-
-        hull = createConvexHullGenerator(true).generate(points);
-        checkConvexHull(points, hull, true);
-    }
-
-    @Test
-    void testCollinearPointsInAnyOrder_multipleCollinearPoints() {
-        // --- arrange
-        // MATH-1148: collinear points on the hull might be in any order
-        //            make sure that they are processed in the proper order
-        //            for each algorithm.
-
-        final List<Vector2D> points = new ArrayList<>();
-        points.add(Vector2D.of(0, -29.959696875));
-        points.add(Vector2D.of(0, -31.621809375));
-        points.add(Vector2D.of(0, -28.435696875));
-        points.add(Vector2D.of(0, -33.145809375));
-        points.add(Vector2D.of(3.048, -33.145809375));
-        points.add(Vector2D.of(3.048, -31.621809375));
-        points.add(Vector2D.of(3.048, -29.959696875));
-        points.add(Vector2D.of(4.572, -33.145809375));
-        points.add(Vector2D.of(4.572, -28.435696875));
-
-        // --- act/assert
-        ConvexHull2D hull = createConvexHullGenerator(false).generate(points);
-        checkConvexHull(points, hull);
-
-        hull = createConvexHullGenerator(true).generate(points);
-        checkConvexHull(points, hull, true);
-    }
-
-    @Test
-    void testIssue1123() {
-        // arrange
-        final List<Vector2D> points = new ArrayList<>();
-
-        final int[][] data = {
-                {-11, -1}, {-11, 0}, {-11, 1},
-                {-10, -3}, {-10, -2}, {-10, -1}, {-10, 0}, {-10, 1},
-                {-10, 2}, {-10, 3}, {-9, -4}, {-9, -3}, {-9, -2},
-                {-9, -1}, {-9, 0}, {-9, 1}, {-9, 2}, {-9, 3},
-                {-9, 4}, {-8, -5}, {-8, -4}, {-8, -3}, {-8, -2},
-                {-8, -1}, {-8, 0}, {-8, 1}, {-8, 2}, {-8, 3},
-                {-8, 4}, {-8, 5}, {-7, -6}, {-7, -5}, {-7, -4},
-                {-7, -3}, {-7, -2}, {-7, -1}, {-7, 0}, {-7, 1},
-                {-7, 2}, {-7, 3}, {-7, 4}, {-7, 5}, {-7, 6},
-                {-6, -7}, {-6, -6}, {-6, -5}, {-6, -4}, {-6, -3},
-                {-6, -2}, {-6, -1}, {-6, 0}, {-6, 1}, {-6, 2},
-                {-6, 3}, {-6, 4}, {-6, 5}, {-6, 6}, {-6, 7},
-                {-5, -7}, {-5, -6}, {-5, -5}, {-5, -4}, {-5, -3},
-                {-5, -2}, {-5, 4}, {-5, 5}, {-5, 6}, {-5, 7},
-                {-4, -7}, {-4, -6}, {-4, -5}, {-4, -4}, {-4, -3},
-                {-4, -2}, {-4, 4}, {-4, 5}, {-4, 6}, {-4, 7},
-                {-3, -8}, {-3, -7}, {-3, -6}, {-3, -5}, {-3, -4},
-                {-3, -3}, {-3, -2}, {-3, 4}, {-3, 5}, {-3, 6},
-                {-3, 7}, {-3, 8}, {-2, -8}, {-2, -7}, {-2, -6},
-                {-2, -5}, {-2, -4}, {-2, -3}, {-2, -2}, {-2, 4},
-                {-2, 5}, {-2, 6}, {-2, 7}, {-2, 8}, {-1, -8},
-                {-1, -7}, {-1, -6}, {-1, -5}, {-1, -4}, {-1, -3},
-                {-1, -2}, {-1, 4}, {-1, 5}, {-1, 6}, {-1, 7},
-                {-1, 8}, {0, -8}, {0, -7}, {0, -6}, {0, -5},
-                {0, -4}, {0, -3}, {0, -2}, {0, 4}, {0, 5}, {0, 6},
-                {0, 7}, {0, 8}, {1, -8}, {1, -7}, {1, -6}, {1, -5},
-                {1, -4}, {1, -3}, {1, -2}, {1, -1}, {1, 0}, {1, 1},
-                {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7},
-                {1, 8}, {2, -8}, {2, -7}, {2, -6}, {2, -5},
-                {2, -4}, {2, -3}, {2, -2}, {2, -1}, {2, 0}, {2, 1},
-                {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7},
-                {2, 8}, {3, -8}, {3, -7}, {3, -6}, {3, -5},
-                {3, -4}, {3, -3}, {3, -2}, {3, -1}, {3, 0}, {3, 1},
-                {3, 2}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7},
-                {3, 8}, {4, -7}, {4, -6}, {4, -5}, {4, -4},
-                {4, -3}, {4, -2}, {4, -1}, {4, 0}, {4, 1}, {4, 2},
-                {4, 3}, {4, 4}, {4, 5}, {4, 6}, {4, 7}, {5, -7},
-                {5, -6}, {5, -5}, {5, -4}, {5, -3}, {5, -2},
-                {5, -1}, {5, 0}, {5, 1}, {5, 2}, {5, 3}, {5, 4},
-                {5, 5}, {5, 6}, {5, 7}, {6, -7}, {6, -6}, {6, -5},
-                {6, -4}, {6, -3}, {6, -2}, {6, -1}, {6, 0}, {6, 1},
-                {6, 2}, {6, 3}, {6, 4}, {6, 5}, {6, 6}, {6, 7},
-                {7, -6}, {7, -5}, {7, -4}, {7, -3}, {7, -2},
-                {7, -1}, {7, 0}, {7, 1}, {7, 2}, {7, 3}, {7, 4},
-                {7, 5}, {7, 6}, {8, -5}, {8, -4}, {8, -3}, {8, -2},
-                {8, -1}, {8, 0}, {8, 1}, {8, 2}, {8, 3}, {8, 4},
-                {8, 5}, {9, -4}, {9, -3}, {9, -2}, {9, -1}, {9, 0},
-                {9, 1}, {9, 2}, {9, 3}, {9, 4}, {10, -3}, {10, -2},
-                {10, -1}, {10, 0}, {10, 1}, {10, 2}, {10, 3},
-                {11, -1}, {11, 0}, {11, 1}
-            };
-
-        for (final int[] line : data) {
-            points.add(Vector2D.of(line[0], line[1]));
-        }
-
-        final Vector2D[] referenceHull = {
-            Vector2D.of(-11.0, -1.0),
-            Vector2D.of(-10.0, -3.0),
-            Vector2D.of(-6.0, -7.0),
-            Vector2D.of(-3.0, -8.0),
-            Vector2D.of(3.0, -8.0),
-            Vector2D.of(6.0, -7.0),
-            Vector2D.of(10.0, -3.0),
-            Vector2D.of(11.0, -1.0),
-            Vector2D.of(11.0, 1.0),
-            Vector2D.of(10.0, 3.0),
-            Vector2D.of(6.0, 7.0),
-            Vector2D.of(3.0, 8.0),
-            Vector2D.of(-3.0, 8.0),
-            Vector2D.of(-6.0, 7.0),
-            Vector2D.of(-10.0, 3.0),
-            Vector2D.of(-11.0, 1.0),
-        };
-
-        // act
-        final ConvexHull2D convHull = generator.generate(points);
-        final Region<Vector2D> hullRegion = convHull.getRegion();
-
-        // assert
-        Assertions.assertEquals(274.0, hullRegion.getSize(), 1.0e-12);
-        double perimeter = 0;
-        for (int i = 0; i < referenceHull.length; ++i) {
-            perimeter += referenceHull[i].distance(
-                                           referenceHull[(i + 1) % referenceHull.length]);
-        }
-        Assertions.assertEquals(perimeter, hullRegion.getBoundarySize(), 1.0e-12);
-
-        for (final Vector2D vector2D : referenceHull) {
-            Assertions.assertEquals(RegionLocation.BOUNDARY, hullRegion.classify(vector2D));
-        }
-
-    }
-
-    // ------------------------------------------------------------------------------
-
-    protected final List<Vector2D> createRandomPoints(final int size) {
-        // create the cloud container
-        final List<Vector2D> points = new ArrayList<>(size);
-        // fill the cloud with a random distribution of points
-        for (int i = 0; i < size; i++) {
-            points.add(Vector2D.of(random.nextDouble() * 2.0 - 1.0, random.nextDouble() * 2.0 - 1.0));
-        }
-        return points;
-    }
-
-    protected final void checkConvexHull(final Collection<Vector2D> points, final ConvexHull2D hull) {
-        checkConvexHull(points, hull, false);
-    }
-
-    protected final void checkConvexHull(final Collection<Vector2D> points, final ConvexHull2D hull,
-                                         final boolean includesCollinearPoints) {
-        Assertions.assertNotNull(hull);
-        Assertions.assertTrue(isConvex(hull, includesCollinearPoints));
-        checkPointsInsideHullRegion(points, hull, includesCollinearPoints);
-    }
-
-    // verify that the constructed hull is really convex
-    protected final boolean isConvex(final ConvexHull2D hull, final boolean includesCollinearPoints) {
-
-        final List<Vector2D> points = hull.getVertices();
-        int sign = 0;
-        final int size = points.size();
-
-        for (int i = 0; i < size; i++) {
-            final Vector2D p1 = points.get(i == 0 ? size - 1 : i - 1);
-            final Vector2D p2 = points.get(i);
-            final Vector2D p3 = points.get(i == size - 1 ? 0 : i + 1);
-
-            final Vector2D d1 = p2.subtract(p1);
-            final Vector2D d2 = p3.subtract(p2);
-
-            Assertions.assertTrue(d1.norm() > 1e-10);
-            Assertions.assertTrue(d2.norm() > 1e-10);
-
-            final double cross = Sum.create()
-                    .addProduct(d1.getX(), d2.getY())
-                    .addProduct(-d1.getY(), d2.getX()).getAsDouble();
-            final int cmp = Precision.compareTo(cross, 0.0, TEST_EPS);
-
-            if (sign != 0 && cmp != sign) {
-                if (!includesCollinearPoints || cmp != 0) {
-                    // in case of collinear points the cross product will be zero
-                    return false;
-                }
-            }
-
-            sign = cmp;
-        }
-
-        return true;
-    }
-
-    // verify that all points are inside the convex hull region
-    protected final void checkPointsInsideHullRegion(final Collection<? extends Vector2D> points,
-                                                     final ConvexHull2D hull,
-                                                     final boolean includesCollinearPoints) {
-
-        final Collection<Vector2D> hullVertices = hull.getVertices();
-        final ConvexArea region = hull.getRegion();
-
-        for (final Vector2D p : points) {
-            final RegionLocation location = region.classify(p);
-            Assertions.assertNotEquals(RegionLocation.OUTSIDE, location);
-
-            if (location == RegionLocation.BOUNDARY && includesCollinearPoints) {
-                Assertions.assertTrue(hullVertices.contains(p));
-            }
-        }
-    }
-}
diff --git a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChainTest.java b/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChainTest.java
deleted file mode 100644
index 004a57f..0000000
--- a/commons-geometry-hull/src/test/java/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChainTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.geometry.hull.euclidean.twod;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.commons.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.numbers.core.Precision;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-/**
- * Test class for MonotoneChain.
- */
-class MonotoneChainTest extends ConvexHullGenerator2DAbstractTest {
-
-    @Override
-    protected ConvexHullGenerator2D createConvexHullGenerator(final boolean includeCollinearPoints) {
-        return new MonotoneChain(includeCollinearPoints, TEST_PRECISION);
-    }
-
-    // ------------------------------------------------------------------------------
-
-    @Test
-    void testConvergenceException() {
-        // arrange
-        final Collection<Vector2D> points = new ArrayList<>();
-
-        points.add(Vector2D.of(1, 1));
-        points.add(Vector2D.of(1, 5));
-        points.add(Vector2D.of(0, 7));
-        points.add(Vector2D.of(1, 10));
-        points.add(Vector2D.of(1, 20));
-        points.add(Vector2D.of(20, 20));
-        points.add(Vector2D.of(20, 40));
-        points.add(Vector2D.of(40, 1));
-
-        // act/assert
-        Assertions.assertThrows(IllegalStateException.class,
-                () ->  new MonotoneChain(true, Precision.doubleEquivalenceOfEpsilon(1)).generate(points));
-    }
-}
diff --git a/commons-geometry-io-core/pom.xml b/commons-geometry-io-core/pom.xml
index e21f30d..c2f3abb 100644
--- a/commons-geometry-io-core/pom.xml
+++ b/commons-geometry-io-core/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-io-core</artifactId>
diff --git a/commons-geometry-hull/src/site/resources/profile.jacoco b/commons-geometry-io-core/src/site/resources/profile.jacoco
similarity index 100%
rename from commons-geometry-hull/src/site/resources/profile.jacoco
rename to commons-geometry-io-core/src/site/resources/profile.jacoco
diff --git a/commons-geometry-hull/src/site/site.xml b/commons-geometry-io-core/src/site/site.xml
similarity index 90%
rename from commons-geometry-hull/src/site/site.xml
rename to commons-geometry-io-core/src/site/site.xml
index 54b485f..3974ae8 100644
--- a/commons-geometry-hull/src/site/site.xml
+++ b/commons-geometry-io-core/src/site/site.xml
@@ -28,10 +28,11 @@
       <item name="Overview" href="/index.html"/>
       <item name="Latest API docs (development)"
             href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-hull/javadocs/api-1.0/index.html"/> -->
+      <item name="Javadoc (1.0 release)"
+            href="https://commons.apache.org/geometry/commons-geometry-io-core/javadocs/api-1.0/index.html"/>
     </menu>
 
+
     <head>
       <![CDATA[<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
       </script>]]>
diff --git a/commons-geometry-io-euclidean/pom.xml b/commons-geometry-io-euclidean/pom.xml
index f915f2f..d4db59b 100644
--- a/commons-geometry-io-euclidean/pom.xml
+++ b/commons-geometry-io-euclidean/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-io-euclidean</artifactId>
diff --git a/commons-geometry-enclosing/src/site/resources/profile.jacoco b/commons-geometry-io-euclidean/src/site/resources/profile.jacoco
similarity index 100%
rename from commons-geometry-enclosing/src/site/resources/profile.jacoco
rename to commons-geometry-io-euclidean/src/site/resources/profile.jacoco
diff --git a/commons-geometry-hull/src/site/site.xml b/commons-geometry-io-euclidean/src/site/site.xml
similarity index 90%
copy from commons-geometry-hull/src/site/site.xml
copy to commons-geometry-io-euclidean/src/site/site.xml
index 54b485f..3758451 100644
--- a/commons-geometry-hull/src/site/site.xml
+++ b/commons-geometry-io-euclidean/src/site/site.xml
@@ -28,10 +28,11 @@
       <item name="Overview" href="/index.html"/>
       <item name="Latest API docs (development)"
             href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-hull/javadocs/api-1.0/index.html"/> -->
+      <item name="Javadoc (1.0 release)"
+            href="https://commons.apache.org/geometry/commons-geometry-io-euclidean/javadocs/api-1.0/index.html"/>
     </menu>
 
+
     <head>
       <![CDATA[<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
       </script>]]>
diff --git a/commons-geometry-spherical/pom.xml b/commons-geometry-spherical/pom.xml
index a299ada..a61fa51 100644
--- a/commons-geometry-spherical/pom.xml
+++ b/commons-geometry-spherical/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry-spherical</artifactId>
@@ -52,11 +52,6 @@
       <artifactId>commons-geometry-euclidean</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-geometry-enclosing</artifactId>
-      <version>${project.version}</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.commons</groupId>
diff --git a/commons-geometry-spherical/src/site/site.xml b/commons-geometry-spherical/src/site/site.xml
index 523c589..9f8b54f 100644
--- a/commons-geometry-spherical/src/site/site.xml
+++ b/commons-geometry-spherical/src/site/site.xml
@@ -28,8 +28,8 @@
       <item name="Overview" href="/index.html"/>
       <item name="Latest API docs (development)"
             href="apidocs/index.html"/>
-      <!-- <item name="Javadoc (1.0 release)"
-                 href="https://commons.apache.org/geometry/commons-geometry-spherical/javadocs/api-1.0/index.html"/> -->
+      <item name="Javadoc (1.0 release)"
+            href="https://commons.apache.org/geometry/commons-geometry-spherical/javadocs/api-1.0/index.html"/>
     </menu>
 
     <head>
diff --git a/dist-archive/pom.xml b/dist-archive/pom.xml
index 0fd1da1..bcf46f3 100644
--- a/dist-archive/pom.xml
+++ b/dist-archive/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-geometry-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.0</version>
   </parent>
 
   <artifactId>commons-geometry</artifactId>
@@ -117,44 +117,6 @@
           <classifier>javadoc</classifier>
         </dependency>
 
-        <!-- Module: Enclosing -->
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-enclosing</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-enclosing</artifactId>
-          <version>${project.version}</version>
-          <classifier>sources</classifier>
-        </dependency>
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-enclosing</artifactId>
-          <version>${project.version}</version>
-          <classifier>javadoc</classifier>
-        </dependency>
-
-        <!-- Module: Hull -->
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-hull</artifactId>
-          <version>${project.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-hull</artifactId>
-          <version>${project.version}</version>
-          <classifier>sources</classifier>
-        </dependency>
-        <dependency>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-geometry-hull</artifactId>
-          <version>${project.version}</version>
-          <classifier>javadoc</classifier>
-        </dependency>
-
         <!-- Module: IO Core -->
         <dependency>
           <groupId>org.apache.commons</groupId>
diff --git a/pom.xml b/pom.xml
index 340639f..22b30aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
   </parent>
 
   <artifactId>commons-geometry-parent</artifactId>
-  <version>1.0-SNAPSHOT</version>
+  <version>1.0</version>
   <packaging>pom</packaging>
   <name>Apache Commons Geometry</name>
   <description>The Apache Commons Geometry project provides geometric types and utilities.</description>
@@ -44,7 +44,7 @@
     <!-- do not use snapshot suffix here -->
     <commons.release.version>1.0</commons.release.version>
     <commons.release.desc>(requires Java 8+)</commons.release.desc>
-    <!-- <commons.rc.version>RC1</commons.rc.version> -->
+    <commons.rc.version>RC1</commons.rc.version>
     <commons.binary.suffix>-bin</commons.binary.suffix>
 
     <commons.jira.id>GEOMETRY</commons.jira.id>
@@ -105,8 +105,6 @@
     <module>commons-geometry-core</module>
     <module>commons-geometry-euclidean</module>
     <module>commons-geometry-spherical</module>
-    <module>commons-geometry-hull</module>
-    <module>commons-geometry-enclosing</module>
     <module>commons-geometry-io-core</module>
     <module>commons-geometry-io-euclidean</module>
   </modules>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e1c3805..261a7dc 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -53,7 +53,7 @@
   </properties>
   <body>
 
-        <release version="1.0" date="TBD" description="
+        <release version="1.0" date="2021-08-15" description="
 This is the first major release of Apache Commons Geometry.
 
 Apache Commons Geometry 1.0 contains the following library modules:
diff --git a/src/changes/release-notes.vm b/src/changes/release-notes.vm
new file mode 100644
index 0000000..cc1b18c
--- /dev/null
+++ b/src/changes/release-notes.vm
@@ -0,0 +1,140 @@
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##  http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+
+              ${project.name} ${version} RELEASE NOTES
+
+The ${developmentTeam} is pleased to announce the release of ${finalName}
+
+$introduction.replaceAll("(?<!\015)\012", "
+")
+
+## N.B. the available variables are described here:
+## http://maven.apache.org/plugins/maven-changes-plugin/examples/using-a-custom-announcement-template.html
+##
+## Hack to improve layout: replace all pairs of spaces with a single new-line
+$release.description.replaceAll("  ", "
+")
+
+#if ($release.getActions().size() == 0)
+No changes defined in this version.
+#else
+Changes in this version include:
+
+## indent to be used if there is no issue attribute.
+## should be the same as the indent in the changes.xml file
+## less 2 spaces for the 'o' and trailing space
+#set($indent='          ')
+#if ($release.getActions('add').size() !=0)
+New features:
+#foreach($actionItem in $release.getActions('add'))
+## Use replaceAll to fix up LF-only line ends on Windows.
+#set($action=$actionItem.getAction().replaceAll("\n","
+"))
+#if ($actionItem.getIssue())
+#set($issue=$actionItem.getIssue())
+#else
+#set($issue="")
+#end
+#if ($actionItem.getDueTo())
+#set($dueto=$actionItem.getDueTo())
+#else
+#set($dueto="")
+#end
+o#if($!issue != "") $issue: #else$indent#end ${action} #if($!dueto != "")Thanks to $dueto. #end
+
+#set($issue="")
+#set($dueto="")
+#end 
+#end
+
+#if ($release.getActions('fix').size() !=0)
+Fixed Bugs:
+#foreach($actionItem in $release.getActions('fix'))
+## Use replaceAll to fix up LF-only line ends on Windows.
+#set($action=$actionItem.getAction().replaceAll("\n","
+"))
+#if ($actionItem.getIssue())
+#set($issue=$actionItem.getIssue())
+#else
+#set($issue="")
+#end
+#if ($actionItem.getDueTo())
+#set($dueto=$actionItem.getDueTo())
+#else
+#set($dueto="")
+#end
+o#if($!issue != "") $issue: #else$indent#end ${action} #if($!dueto != "")Thanks to $dueto. #end
+
+#set($issue="")
+#set($dueto="")
+#end
+#end
+
+#if ($release.getActions('update').size() !=0)
+Changes:
+#foreach($actionItem in $release.getActions('update'))
+## Use replaceAll to fix up LF-only line ends on Windows.
+#set($action=$actionItem.getAction().replaceAll("\n","
+"))
+#if ($actionItem.getIssue())
+#set($issue=$actionItem.getIssue())
+#else
+#set($issue="")
+#end
+#if ($actionItem.getDueTo())
+#set($dueto=$actionItem.getDueTo())
+#else
+#set($dueto="")
+#end
+o#if($!issue != "") $issue: #else$indent#end ${action} #if($!dueto != "")Thanks to $dueto. #end
+
+#set($issue="")
+#set($dueto="")
+#end
+#end
+
+#if ($release.getActions('remove').size() !=0)
+Removed:
+#foreach($actionItem in $release.getActions('remove'))
+## Use replaceAll to fix up LF-only line ends on Windows.
+#set($action=$actionItem.getAction().replaceAll("\n","
+"))
+#if ($actionItem.getIssue())
+#set($issue=$actionItem.getIssue())
+#else
+#set($issue="")
+#end
+#if ($actionItem.getDueTo())
+#set($dueto=$actionItem.getDueTo())
+#else
+#set($dueto="")
+#end
+o#if($!issue != "") $issue: #else$indent#end ${action} #if($!dueto != "")Thanks to $dueto. #end
+
+#set($issue="")
+#set($dueto="")
+#end
+#end
+## End of main loop
+#end
+
+For complete information on ${project.name}, including instructions on how to submit bug reports,
+patches, or suggestions for improvement, see the ${project.name} website:
+
+${project.url}
+
+
diff --git a/src/main/resources/spotbugs/spotbugs-exclude-filter.xml b/src/main/resources/spotbugs/spotbugs-exclude-filter.xml
index a3d2782..06a8333 100644
--- a/src/main/resources/spotbugs/spotbugs-exclude-filter.xml
+++ b/src/main/resources/spotbugs/spotbugs-exclude-filter.xml
@@ -65,14 +65,10 @@
       <Class name="org.apache.commons.geometry.euclidean.twod.path.LinePath"/>
       <Class name="org.apache.commons.geometry.euclidean.twod.EmbeddedTreeLineSubset"/>
 
-      <Class name="org.apache.commons.geometry.enclosing.EnclosingBall"/>
-
       <Class name="org.apache.commons.geometry.spherical.twod.EmbeddedTreeGreatCircleSubset"/>
       <Class name="org.apache.commons.geometry.spherical.twod.RegionBSPTree2S"/>
       <Class name="org.apache.commons.geometry.spherical.twod.GreatArcPath"/>
 
-      <Class name="org.apache.commons.geometry.hull.euclidean.twod.ConvexHull2D"/>
-
       <Class name="org.apache.commons.geometry.io.core.internal.SimpleTextParser"/>
       <Class name="org.apache.commons.geometry.io.core.output.StreamGeometryOutput"/>
 
diff --git a/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt b/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt
new file mode 100644
index 0000000..ba2e707
--- /dev/null
+++ b/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt
@@ -0,0 +1,78 @@
+
+              Apache Commons Geometry 1.0 RELEASE NOTES
+
+The Apache Commons Geometry team is pleased to announce the release of
+commons-geometry-parent-1.0
+
+The Apache Commons Geometry project provides geometric types and utilities.
+
+This is the first major release of Apache Commons Geometry.
+Apache Commons Geometry 1.0 contains the following library modules:
+ commons-geometry-core (requires Java 8+)
+ commons-geometry-euclidean (requires Java 8+)
+ commons-geometry-spherical (requires Java 8+)
+ commons-geometry-io-core (requires Java 8+)
+ commons-geometry-io-euclidean (requires Java 8+)
+
+Changes in this version include:
+
+New features:
+o GEOMETRY-118:  Add coordinate-specific transform methods to AffineTransformMatrixXD classes,
+        e.g. "applyX", "applyY", "applyZ".
+o GEOMETRY-95:  Add solid geometry tutorial.
+o GEOMETRY-120:  Add SimpleTriangleMeshBuilder.addFace(int[]) method as alternative to
+        addFace(int, int, int).
+o GEOMETRY-117:  Add shear methods to AffineTransformMatrix2D. Thanks to Christoph Läubrich.
+o GEOMETRY-119:  Add VectorXD.normalizeOrNull() methods so that callers can detect normalization
+        failures without needing to catch an exception.
+o GEOMETRY-115:  Add modules for IO functionality: commons-geometry-io-core,
+        commons-geometry-io-euclidean.
+o GEOMETRY-108:  Add BoundaryList interface and implementation classes.
+
+Fixed Bugs:
+o GEOMETRY-116:  Fix incorrect OSGi headers. Reported by Christoph Läubrich.
+
+Changes:
+o GEOMETRY-138:  Do not use checked exceptions in IO modules.
+o GEOMETRY-13:  Use Norms.EUCLIDEAN from Commons Numbers to compute 3D Euclidean norm values.
+o GEOMETRY-126:  Replace VectorXD.linearCombination methods with VectorXD.Sum classes. Use
+        Sum class from Commons Numbers for computing internal linear combinations.
+o GEOMETRY-124:  Replace DoublePrecisionContext with Precision.DoubleEquivalence from
+        Commons Numbers.
+o GEOMETRY-109:  Rename the BoundarySourceXX.from() static factory methods to "of" to better
+        match the JDK's Stream.of() method.
+o GEOMETRY-103:  Migrate unit tests to JUnit 5. Thanks to Arturo Bernal.
+
+
+For complete information on Apache Commons Geometry, including instructions on how to submit
+        bug reports, patches, or suggestions for improvement, see the Apache Commons Geometry
+        website:
+
+https://commons.apache.org/proper/commons-geometry/
+
+
+=============================================================================
+
+              Apache Commons Geometry 1.0-beta1 RELEASE NOTES
+
+The Apache Commons Geometry team is pleased to announce the release of
+Apache Commons Geometry 1.0-beta1
+
+The Apache Commons Geometry project provides geometric types and utilities.
+
+This is a beta release of Apache Commons Geometry. No guarantees are made regarding the stability
+of the API or compatibility with future releases.
+
+Apache Commons Geometry 1.0-beta1 contains the following library modules:
+ commons-geometry-core (requires Java 8+)
+ commons-geometry-euclidean (requires Java 8+)
+ commons-geometry-spherical (requires Java 8+)
+ commons-geometry-hull (requires Java 8+)
+ commons-geometry-enclosing (requires Java 8+)
+
+No changes defined in this version.
+
+For complete information on Apache Commons Geometry, including instructions on how to submit bug
+reports, patches, or suggestions for improvement, see the Apache Commons Geometry website:
+
+https://commons.apache.org/proper/commons-geometry/
diff --git a/src/site/site.xml b/src/site/site.xml
index 2e99eff..1d8a9b0 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -76,8 +76,6 @@
       <item name="Core Interfaces" href="/userguide/index.html#interfaces"/>
       <item name="Euclidean Space" href="/userguide/index.html#euclidean"/>
       <item name="Spherical Space" href="/userguide/index.html#spherical"/>
-      <item name="Convex Hull" href="/userguide/index.html#hull"/>
-      <item name="Enclosing" href="/userguide/index.html#enclosing"/>
     </menu>
     <menu name="Tutorials">
       <item name="BSP Trees" href="/tutorials/bsp-tree.html" />
diff --git a/src/site/xdoc/download_geometry.xml b/src/site/xdoc/download_geometry.xml
index 5535862..0a6db06 100644
--- a/src/site/xdoc/download_geometry.xml
+++ b/src/site/xdoc/download_geometry.xml
@@ -113,32 +113,32 @@
       </p>
     </subsection>
     </section>
-    <section name="Apache Commons Geometry 1.0-beta1 (requires Java 8+)">
+    <section name="Apache Commons Geometry 1.0 (requires Java 8+)">
       <subsection name="Binaries">
         <table>
           <tr>
-              <td><a href="[preferred]/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.tar.gz">commons-geometry-1.0-beta1-bin.tar.gz</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.tar.gz.sha512">sha512</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.tar.gz.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/geometry/binaries/commons-geometry-1.0-bin.tar.gz">commons-geometry-1.0-bin.tar.gz</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-bin.tar.gz.sha512">sha512</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-bin.tar.gz.asc">pgp</a></td>
           </tr>
           <tr>
-              <td><a href="[preferred]/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.zip">commons-geometry-1.0-beta1-bin.zip</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.zip.sha512">sha512</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-beta1-bin.zip.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/geometry/binaries/commons-geometry-1.0-bin.zip">commons-geometry-1.0-bin.zip</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-bin.zip.sha512">sha512</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/binaries/commons-geometry-1.0-bin.zip.asc">pgp</a></td>
           </tr>
         </table>
       </subsection>
       <subsection name="Source">
         <table>
           <tr>
-              <td><a href="[preferred]/commons/geometry/source/commons-geometry-1.0-beta1-src.tar.gz">commons-geometry-1.0-beta1-src.tar.gz</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-beta1-src.tar.gz.sha512">sha512</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-beta1-src.tar.gz.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/geometry/source/commons-geometry-1.0-src.tar.gz">commons-geometry-1.0-src.tar.gz</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-src.tar.gz.sha512">sha512</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-src.tar.gz.asc">pgp</a></td>
           </tr>
           <tr>
-              <td><a href="[preferred]/commons/geometry/source/commons-geometry-1.0-beta1-src.zip">commons-geometry-1.0-beta1-src.zip</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-beta1-src.zip.sha512">sha512</a></td>
-              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-beta1-src.zip.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/geometry/source/commons-geometry-1.0-src.zip">commons-geometry-1.0-src.zip</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-src.zip.sha512">sha512</a></td>
+              <td><a href="https://www.apache.org/dist/commons/geometry/source/commons-geometry-1.0-src.zip.asc">pgp</a></td>
           </tr>
         </table>
       </subsection>
diff --git a/src/site/xdoc/release-history.xml b/src/site/xdoc/release-history.xml
index a8388f7..ec9d456 100644
--- a/src/site/xdoc/release-history.xml
+++ b/src/site/xdoc/release-history.xml
@@ -25,6 +25,9 @@
       <table>
         <tr><th>Version</th><th>Release date (YYYY-MM-DD)</th><th>Required Java Version</th><th>Release notes</th></tr>
         <tr>
+          <td>1.0</td><td>2021-08-15</td><td>8+</td><td><a href="release-notes/RELEASE-NOTES-1.0.txt">release notes for 1.0</a></td>
+        </tr>
+        <tr>
           <td>1.0-beta1</td><td>2020-07-20</td><td>8+</td><td><a href="release-notes/RELEASE-NOTES-1.0-beta1.txt">release notes for 1.0-beta1</a></td>
         </tr>
       </table>
diff --git a/src/site/xdoc/userguide/index.xml b/src/site/xdoc/userguide/index.xml
index fdfc9c7..eecd58f 100644
--- a/src/site/xdoc/userguide/index.xml
+++ b/src/site/xdoc/userguide/index.xml
@@ -79,17 +79,6 @@
             </li>
           </ul>
         </li>
-        <li>
-          <a href="#hull">Convex Hull</a>
-          <ul>
-            <li>
-              <a href="#hull_euclidean_2d">Euclidean 2D</a>
-            </li>
-          </ul>
-        </li>
-        <li>
-          <a href="#enclosing">Enclosing</a>
-        </li>
       </ul>
     </section>
 
@@ -126,14 +115,6 @@
           <a class="code" href="../commons-geometry-io-euclidean/index.html">commons-geometry-io-euclidean</a> - Provides
           classes for IO operations on Euclidean data formats, such STL and OBJ.
         </li>
-        <li>
-          <a class="code" href="../commons-geometry-hull/index.html">commons-geometry-hull</a> - Provides implementations
-          of convex hull algorithms.
-        </li>
-        <li>
-          <a class="code" href="../commons-geometry-enclosing/index.html">commons-geometry-enclosing</a> - Provides implementations
-          of enclosing ball algorithms.
-        </li>
       </ul>
     </section>
 
@@ -1113,127 +1094,6 @@
       </subsection>
 
     </section>
-
-    <section name="Convex Hull" id="hull">
-      <p>
-        A <a href="http://en.wikipedia.org/wiki/Convex_hull">convex hull</a> of a region or shape in the smallest convex
-        set of points that completely contains the shape. For example, if a set of points in Euclidean 2D space are
-        represented by nails in a flat piece of wood, then the convex hull of that shape would be the path made by a
-        rubber band wrapped around all of the nails. Similarly, in Euclidean 3D space, the convex hull of a shape can be
-        visualized as the result of "shrink-wrapping" the shape with a very tight, non-flexible material.
-      </p>
-      <p>
-        A number of convex hull algorithms exist, for various spaces and dimensions, and it is the goal of the
-        <span class="code">commons-geometry-hull</span> module to provide implementations of these algorithms.
-      </p>
-
-      <subsection name="Convex Hull - Euclidean 2D" id="hull_euclidean_2d">
-        <h4>Primary Classes</h4>
-        <ul>
-          <li>
-            <a class="code" href="../commons-geometry-hull/apidocs/org/apache/commons/geometry/hull/euclidean/twod/ConvexHullGenerator2D.html">ConvexHullGenerator2D</a> -
-            Interface for classes that implement convex hull algorithms in Euclidean 2D space.
-          </li>
-          <li>
-            <a class="code" href="../commons-geometry-hull/apidocs/org/apache/commons/geometry/hull/euclidean/twod/ConvexHull2D.html">ConvexHull2D</a> -
-            Class representing output from convex hull operations.
-          </li>
-          <li>
-            <a class="code" href="../commons-geometry-hull/apidocs/org/apache/commons/geometry/hull/euclidean/twod/MonotoneChain.html">MonotoneChain</a> -
-            Class implementing
-            <a href="http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain">Andrew's monotone chain algorithm</a>
-            for computing convex hulls.
-          </li>
-        </ul>
-
-        <h4>Examples</h4>
-
-        <h5>Monotone Chain</h5>
-        <source>
-Precision.DoubleEquivalence precision = Precision.doubleEquivalenceOfEpsilon(1e-10);
-
-// create a list of input points for the algorithm
-List&lt;Vector2D&gt; pts = Arrays.asList(
-            Vector2D.ZERO,
-            Vector2D.of(0.5, 0.5),
-            Vector2D.of(0, 0.5),
-            Vector2D.of(0, 1),
-            Vector2D.of(0.25, 0.1),
-            Vector2D.of(1, 0),
-            Vector2D.of(1, 1),
-            Vector2D.of(0.75, 0.9)
-        );
-
-// create an instance of the monotone chain convex hull generator
-MonotoneChain mc = new MonotoneChain(precision);
-
-// compute the convex hull
-ConvexHull2D hull = mc.generate(pts);
-
-// list the vertices from the input that were used in the hull
-List&lt;Vector2D&gt; vertices = hull.getVertices(); // [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)]
-
-// get the hull as a region
-ConvexArea region = hull.getRegion();
-boolean containsAll = pts.stream().allMatch(region::contains); // true - region contains all input points
-        </source>
-      </subsection>
-    </section>
-
-    <section name="Enclosing" id="enclosing">
-      <p>
-      The <a href="https://en.wikipedia.org/wiki/Bounding_sphere">smallest enclosing ball problem</a> is the
-      mathematical problem of locating the n-sphere with the smallest radius that encloses a given set of points.
-      This module contains implementations of algorithms for solving this problem.
-      </p>
-
-      <h4>Primary Classes</h4>
-      <ul>
-        <li>
-          <a class="code" href="../commons-geometry-enclosing/apidocs/org/apache/commons/geometry/enclosing/Encloser.html">Encloser</a> -
-          Interface for classes that solve the smallest enclosing ball problem.
-        </li>
-        <li>
-          <a class="code" href="../commons-geometry-enclosing/apidocs/org/apache/commons/geometry/enclosing/EnclosingBall.html">EnclosingBall</a> -
-          Class containing the result of smallest enclosing ball computation.
-        </li>
-        <li>
-          <a class="code" href="../commons-geometry-enclosing/apidocs/org/apache/commons/geometry/enclosing/WelzlEncloser.html">WelzlEncloser</a> -
-          Class implementing a space-independent version of
-          <a href="http://www.inf.ethz.ch/personal/emo/PublFiles/SmallEnclDisk_LNCS555_91.pdf">Emo Welzl's algorithm</a>
-          for computing the smallest enclosing ball of a set of points. Specialized classes exist for Euclidean 2D space
-          (<a class="code" href="../commons-geometry-enclosing/apidocs/org/apache/commons/geometry/enclosing/euclidean/twod/WelzlEncloser2D.html">WelzlEncloser2D</a>)
-          and Euclidean 3D space
-          (<a class="code" href="../commons-geometry-enclosing/apidocs/org/apache/commons/geometry/enclosing/euclidean/threed/WelzlEncloser3D.html">WelzlEncloser3D</a>).
-        </li>
-      </ul>
-
-      <h4>Examples</h4>
-
-      <h5>WelzlEncloser3D</h5>
-      <source>
-Precision.DoubleEquivalence precision = Precision.doubleEquivalenceOfEpsilon(1e-10);
-
-List&lt;Vector3D&gt; points = Arrays.asList(
-            Vector3D.of(0, 0, 1),
-            Vector3D.of(0.75, 0, 1),
-            Vector3D.of(2, 0, 1),
-            Vector3D.of(1, 0, 2)
-        );
-
-// compute the enclosing ball
-WelzlEncloser3D encloser = new WelzlEncloser3D(precision);
-
-EnclosingBall&lt;Vector3D&gt; sphere = encloser.enclose(points);
-
-// check the generated ball
-Vector3D center = sphere.getCenter(); // (1, 0, 1)
-double radius = sphere.getRadius(); // 1.0
-boolean containsCenter = sphere.contains(center); // true
-boolean containsOrigin = sphere.contains(Vector3D.ZERO); // false
-      </source>
-    </section>
-
   </body>
 
 </document>
