sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 01/02: Removal of modules to be excluded from Apache SIS 1.0 release: sis-shapefile, sis-javafx, sis-cql, sis-potrayal, sis-webapp. https://lists.apache.org/thread.html/cb68740d4ac47a577e4231a705c89b466ff46c83ac4c24f908bd18ae@%3Cdev.sis.apache.org%3E
Date Wed, 11 Sep 2019 19:20:52 GMT
This is an automated email from the ASF dual-hosted git repository.

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

commit 0717fffeea092d35157def097d43aeb01e01fb72
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Wed Sep 11 21:11:02 2019 +0200

    Removal of modules to be excluded from Apache SIS 1.0 release: sis-shapefile, sis-javafx, sis-cql, sis-potrayal, sis-webapp.
    https://lists.apache.org/thread.html/cb68740d4ac47a577e4231a705c89b466ff46c83ac4c24f908bd18ae@%3Cdev.sis.apache.org%3E
---
 application/pom.xml                                |   15 -
 application/sis-javafx/pom.xml                     |  117 --
 .../src/main/java/org/apache/sis/gui/Main.java     |  204 ---
 .../org/apache/sis/gui/dataset/FeatureTable.java   |  169 ---
 .../org/apache/sis/gui/dataset/ResourceTree.java   |  243 ----
 .../org/apache/sis/gui/metadata/MetadataNode.java  |  228 ----
 .../apache/sis/gui/metadata/MetadataOverview.java  |  403 ------
 .../org/apache/sis/gui/metadata/ResourceView.java  |  399 ------
 .../org/apache/sis/gui/referencing/CRSButton.java  |   79 --
 .../org/apache/sis/gui/referencing/CRSChooser.java |  116 --
 .../org/apache/sis/gui/referencing/CRSTable.java   |  349 ------
 .../java/org/apache/sis/gui/referencing/Code.java  |   89 --
 .../org/apache/sis/gui/referencing/WKTPane.java    |   68 -
 .../org/apache/sis/internal/gui/FXUtilities.java   |   91 --
 .../org/apache/sis/internal/gui/FontGlyphs.java    |  143 ---
 .../org/apache/sis/internal/gui/Resources.java     |  168 ---
 .../apache/sis/internal/gui/Resources.properties   |   26 -
 .../sis/internal/gui/Resources_fr.properties       |   31 -
 .../org/apache/sis/internal/gui/package-info.java  |   31 -
 .../apache/sis/gui/metadata/WorldMap360x180.png    |  Bin 1886 -> 0 bytes
 .../org/apache/sis/gui/referencing/CRSChooser.fxml |   30 -
 .../org/apache/sis/gui/referencing/proj_conic.png  |  Bin 591 -> 0 bytes
 .../org/apache/sis/gui/referencing/proj_geo.png    |  Bin 834 -> 0 bytes
 .../org/apache/sis/gui/referencing/proj_square.png |  Bin 519 -> 0 bytes
 .../org/apache/sis/gui/referencing/proj_stereo.png |  Bin 959 -> 0 bytes
 .../org/apache/sis/gui/referencing/proj_utm.png    |  Bin 681 -> 0 bytes
 .../org/apache/sis/test/suite/package-info.txt     |    3 -
 application/sis-webapp/pom.xml                     |  124 --
 .../java/org/apache/sis/index/tree/GeoRSSData.java |  177 ---
 .../org/apache/sis/index/tree/QuadTreeReader.java  |  163 ---
 .../org/apache/sis/services/LocationServlet.java   |  479 --------
 .../src/main/resources/sis-location-config.xml     |   28 -
 .../src/main/webapp/META-INF/context.xml           |   29 -
 .../sis-webapp/src/main/webapp/WEB-INF/web.xml     |   32 -
 application/sis-webapp/src/main/webapp/demo.jsp    |  321 -----
 .../src/main/webapp/images/sis_logo_small.png      |  Bin 35560 -> 0 bytes
 core/pom.xml                                       |    1 -
 core/sis-portrayal/pom.xml                         |  141 ---
 .../org/apache/sis/internal/map/MapContext.java    |   79 --
 .../java/org/apache/sis/internal/map/MapGroup.java |   66 -
 .../java/org/apache/sis/internal/map/MapItem.java  |   88 --
 .../java/org/apache/sis/internal/map/MapLayer.java |  104 --
 .../org/apache/sis/internal/map/package-info.java  |   34 -
 .../org/apache/sis/test/suite/package-info.txt     |    3 -
 ide-project/NetBeans/build.xml                     |   16 -
 ide-project/NetBeans/nbproject/build-impl.xml      |   85 +-
 ide-project/NetBeans/nbproject/genfiles.properties |    4 +-
 ide-project/NetBeans/nbproject/project.properties  |    6 -
 ide-project/NetBeans/nbproject/project.xml         |    6 -
 storage/pom.xml                                    |    1 -
 storage/sis-shapefile/pom.xml                      |  132 --
 .../apache/sis/internal/shapefile/AutoChecker.java |  185 ---
 ...nvalidRecordNumberForDirectAccessException.java |   65 -
 .../SQLNoDirectAccessAvailableException.java       |   50 -
 .../shapefile/SQLShapefileNotFoundException.java   |   50 -
 .../internal/shapefile/ShapefileByteReader.java    |  466 -------
 .../internal/shapefile/ShapefileDescriptor.java    |  201 ---
 .../shapefile/jdbc/AbstractDbase3ByteReader.java   |  283 -----
 .../sis/internal/shapefile/jdbc/AbstractJDBC.java  |  162 ---
 .../internal/shapefile/jdbc/CommonByteReader.java  |  132 --
 .../sis/internal/shapefile/jdbc/DBFDriver.java     |  145 ---
 .../shapefile/jdbc/DBase3FieldDescriptor.java      |  150 ---
 .../sis/internal/shapefile/jdbc/DBaseDataType.java |  103 --
 .../internal/shapefile/jdbc/Dbase3ByteReader.java  |  130 --
 .../internal/shapefile/jdbc/MappedByteReader.java  |  309 -----
 .../jdbc/SQLConnectionClosedException.java         |   63 -
 .../jdbc/SQLDbaseFileNotFoundException.java        |   50 -
 .../jdbc/SQLInvalidDbaseFileFormatException.java   |   50 -
 .../jdbc/connection/AbstractConnection.java        |  418 -------
 .../shapefile/jdbc/connection/DBFConnection.java   |  336 -----
 .../connection/SQLClosingIOFailureException.java   |   63 -
 .../shapefile/jdbc/connection/package-info.java    |   19 -
 .../jdbc/metadata/AbstractDatabaseMetaData.java    |  202 ---
 .../jdbc/metadata/DBFDatabaseMetaData.java         | 1300 --------------------
 .../jdbc/metadata/DBFResultSetMataData.java        |  473 -------
 .../shapefile/jdbc/metadata/package-info.java      |   21 -
 .../sis/internal/shapefile/jdbc/package-info.java  |   26 -
 .../jdbc/resultset/AbstractResultSet.java          |  707 -----------
 .../jdbc/resultset/BuiltInMemoryResultSet.java     |  196 ---
 ...iltInMemoryResultSetForCatalogNamesListing.java |   51 -
 ...DBFBuiltInMemoryResultSetForColumnsListing.java |  460 -------
 .../DBFBuiltInMemoryResultSetForSchemaListing.java |   51 -
 .../DBFBuiltInMemoryResultSetForTablesListing.java |   88 --
 ...uiltInMemoryResultSetForTablesTypesListing.java |   74 --
 .../jdbc/resultset/DBFRecordBasedResultSet.java    |  609 ---------
 .../shapefile/jdbc/resultset/DBFResultSet.java     |  965 ---------------
 .../resultset/SQLIllegalColumnIndexException.java  |   76 --
 .../jdbc/resultset/SQLNoResultException.java       |   63 -
 .../jdbc/resultset/SQLNoSuchFieldException.java    |   76 --
 .../jdbc/resultset/SQLNotDateException.java        |   89 --
 .../jdbc/resultset/SQLNotNumericException.java     |   89 --
 .../shapefile/jdbc/resultset/package-info.java     |   21 -
 .../shapefile/jdbc/sql/ClauseResolver.java         |  391 ------
 .../jdbc/sql/ConditionalClauseResolver.java        |   38 -
 .../shapefile/jdbc/sql/CrudeSQLParser.java         |  137 ---
 .../jdbc/sql/SQLIllegalParameterException.java     |   89 --
 .../jdbc/sql/SQLInvalidStatementException.java     |   63 -
 .../sql/SQLUnsupportedParsingFeatureException.java |   63 -
 .../internal/shapefile/jdbc/sql/package-info.java  |   20 -
 .../jdbc/statement/AbstractStatement.java          |  308 -----
 .../shapefile/jdbc/statement/DBFStatement.java     |  244 ----
 .../shapefile/jdbc/statement/package-info.java     |   19 -
 .../sis/internal/shapefile/package-info.java       |   25 -
 .../storage/shapefile/DataStoreQueryException.java |   53 -
 .../shapefile/DataStoreQueryResultException.java   |   53 -
 .../shapefile/DbaseFileNotFoundException.java      |   53 -
 .../sis/storage/shapefile/InputFeatureStream.java  |  376 ------
 .../shapefile/InvalidDbaseFileFormatException.java |   36 -
 .../shapefile/InvalidShapefileFormatException.java |   52 -
 .../apache/sis/storage/shapefile/ShapeFile.java    |  210 ----
 .../sis/storage/shapefile/ShapeTypeEnum.java       |   77 --
 .../shapefile/ShapefileNotFoundException.java      |   53 -
 .../apache/sis/storage/shapefile/package-info.java |   30 -
 .../shapefile/ShapefileByteReader.properties       |   36 -
 .../shapefile/ShapefileByteReader_fr.properties    |   36 -
 .../jdbc/AbstractDbase3ByteReader.properties       |   14 -
 .../jdbc/AbstractDbase3ByteReader_fr.properties    |   14 -
 .../shapefile/jdbc/AbstractJDBC.properties         |   23 -
 .../shapefile/jdbc/AbstractJDBC_fr.properties      |    1 -
 .../shapefile/jdbc/CommonByteReader.properties     |    3 -
 .../jdbc/DBase3FieldDescriptor.properties          |    7 -
 .../jdbc/DBase3FieldDescriptor_fr.properties       |    1 -
 .../shapefile/jdbc/MappedByteReader.properties     |   30 -
 .../shapefile/jdbc/MappedByteReader_fr.properties  |   30 -
 .../jdbc/connection/AbstractConnection.properties  |    6 -
 .../connection/AbstractConnection_fr.properties    |    6 -
 .../jdbc/connection/DBFConnection.properties       |   49 -
 .../jdbc/connection/DBFConnection_fr.properties    |   39 -
 .../jdbc/metadata/DBFResultSetMataData.properties  |   14 -
 .../metadata/DBFResultSetMataData_fr.properties    |    4 -
 .../jdbc/resultset/AbstractResultSet.properties    |    1 -
 .../jdbc/resultset/AbstractResultSet_fr.properties |    1 -
 ...ltInMemoryResultSetForColumnsListing.properties |    8 -
 ...nMemoryResultSetForColumnsListing_fr.properties |    8 -
 ...iltInMemoryResultSetForTablesListing.properties |    2 -
 ...MemoryResultSetForTablesTypesListing.properties |    2 -
 .../resultset/DBFRecordBasedResultSet.properties   |   28 -
 .../DBFRecordBasedResultSet_fr.properties          |   28 -
 .../jdbc/resultset/DBFResultSet.properties         |   10 -
 .../jdbc/resultset/DBFResultSet_fr.properties      |    4 -
 .../shapefile/jdbc/sql/ClauseResolver.properties   |   25 -
 .../jdbc/sql/ClauseResolver_fr.properties          |   16 -
 .../shapefile/jdbc/sql/CrudeSQLParser.properties   |   12 -
 .../jdbc/statement/DBFStatement.properties         |   22 -
 .../jdbc/statement/DBFStatement_fr.properties      |   12 -
 .../shapefile/InputFeatureStream.properties        |    9 -
 .../shapefile/InputFeatureStream_fr.properties     |    9 -
 .../jdbc/AbstractTestBaseForInternalJDBC.java      |   68 -
 .../internal/shapefile/jdbc/DBFConnectionTest.java |   92 --
 .../internal/shapefile/jdbc/DBFResultSetTest.java  |  205 ---
 .../internal/shapefile/jdbc/DBFStatementTest.java  |   97 --
 .../apache/sis/internal/shapefile/jdbc/readme.txt  |   58 -
 .../shapefile/jdbc/sql/WhereClauseTest.java        |  140 ---
 .../sis/storage/shapefile/ShapeFileTest.java       |  206 ----
 .../apache/sis/test/suite/ShapefileTestSuite.java  |   44 -
 .../org/apache/sis/test/suite/package-info.txt     |    3 -
 .../shapefile/ABRALicenseePt_4326_clipped.dbf      |  Bin 5861 -> 0 bytes
 .../shapefile/ABRALicenseePt_4326_clipped.prj      |    1 -
 .../shapefile/ABRALicenseePt_4326_clipped.shp      |  Bin 184 -> 0 bytes
 .../shapefile/ABRALicenseePt_4326_clipped.shx      |  Bin 124 -> 0 bytes
 .../org/apache/sis/storage/shapefile/NOTES.md      |   12 -
 .../shapefile/SignedBikeRoute_4326_clipped.dbf     |  Bin 7363 -> 0 bytes
 .../shapefile/SignedBikeRoute_4326_clipped.prj     |    1 -
 .../shapefile/SignedBikeRoute_4326_clipped.shp     |  Bin 1148 -> 0 bytes
 .../shapefile/SignedBikeRoute_4326_clipped.shx     |  Bin 148 -> 0 bytes
 165 files changed, 16 insertions(+), 17999 deletions(-)

diff --git a/application/pom.xml b/application/pom.xml
index ce30987..4791faf 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -113,24 +113,9 @@
 
   <!-- ===========================================================
            Sub-modules included in the build in dependency order.
-           JavaFX module is built only if PATH_TO_FX environment
-           variable is set.
        =========================================================== -->
   <modules>
     <module>sis-console</module>
-    <module>sis-webapp</module>
     <module>sis-openoffice</module>
   </modules>
-  <profiles>
-    <profile>
-      <activation>
-        <property>
-          <name>env.PATH_TO_FX</name>
-        </property>
-      </activation>
-      <modules>
-        <module>sis-javafx</module>
-      </modules>
-    </profile>
-  </profiles>
 </project>
diff --git a/application/sis-javafx/pom.xml b/application/sis-javafx/pom.xml
deleted file mode 100644
index 636d3ee..0000000
--- a/application/sis-javafx/pom.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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 xmlns              = "http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi          = "http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
-                               http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sis</groupId>
-    <artifactId>application</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-
-  <!-- ===========================================================
-           Module Description
-       =========================================================== -->
-  <groupId>org.apache.sis.application</groupId>
-  <artifactId>sis-javafx</artifactId>
-  <name>Apache SIS application for JavaFX</name>
-  <description>
-    Client application for JavaFX.
-    This module require the JavaFX environment to be pre-installed.
-    See https://openjfx.io/openjfx-docs/#install-javafx for details.
-  </description>
-
-
-  <!-- ===========================================================
-           Developers and Contributors
-       =========================================================== -->
-  <developers>
-    <developer>
-      <name>Johann Sorel</name>
-      <id>jsorel</id>
-      <email>johann.sorel@geomatys.com</email>
-      <organization>Geomatys</organization>
-      <organizationUrl>http://www.geomatys.com</organizationUrl>
-      <timezone>+1</timezone>
-      <roles>
-        <role>developer</role>
-      </roles>
-    </developer>
-  </developers>
-
-
-  <!-- ===========================================================
-           Build configuration
-       =========================================================== -->
-  <build>
-    <plugins>
-      <!-- To be removed after SIS has been fully modularized. -->
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <release>9</release>
-          <compilerArgs>
-            <arg>--module-path</arg> <arg>${env.PATH_TO_FX}</arg>
-            <arg>--add-modules</arg> <arg>javafx.graphics,javafx.controls,javafx.fxml,javafx.swing</arg>
-          </compilerArgs>
-        </configuration>
-      </plugin>
-
-      <!-- Anticipation for Java 9 -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Automatic-Module-Name>
-                org.apache.sis.gui
-              </Automatic-Module-Name>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-
-  <!-- ===========================================================
-           Dependencies
-       =========================================================== -->
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-metadata</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
-      <artifactId>material-design-icons</artifactId>
-      <version>3.0.1</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/Main.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/Main.java
deleted file mode 100644
index ae06570..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/Main.java
+++ /dev/null
@@ -1,204 +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.sis.gui;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import javafx.application.Application;
-import javafx.application.Platform;
-import javafx.scene.Scene;
-import javafx.scene.control.Menu;
-import javafx.scene.control.MenuBar;
-import javafx.scene.control.MenuItem;
-import javafx.scene.control.SeparatorMenuItem;
-import javafx.scene.input.KeyCombination;
-import javafx.scene.layout.BorderPane;
-import javafx.stage.FileChooser;
-import javafx.stage.Stage;
-import org.apache.sis.gui.metadata.ResourceView;
-import org.apache.sis.internal.gui.Resources;
-import org.apache.sis.internal.storage.Capability;
-import org.apache.sis.internal.storage.StoreMetadata;
-import org.apache.sis.storage.DataStoreProvider;
-import org.apache.sis.storage.DataStores;
-import org.apache.sis.util.ArraysExt;
-import org.apache.sis.util.resources.Vocabulary;
-
-
-/**
- * Entry point for Apache SIS application.
- * Current implementation shows a {@link ResourceView} on which user can drop the files to open.
- * The content shown by this {@code Main} class may change in any future Apache SIS version.
- *
- * @author  Smaniotto Enzo
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class Main extends Application {
-    /**
-     * The primary stage onto which the application scene is set.
-     */
-    private Stage window;
-
-    /**
-     * The main content of this application. For now this is the metadata viewer.
-     * In a future version it may be another component.
-     */
-    private ResourceView content;
-
-    /**
-     * The file filters to use in the dialog box shown by the "File" ▶ "Open" menu.
-     * This array is created when first needed.
-     *
-     * @see #createFileFilters()
-     */
-    private FileChooser.ExtensionFilter[] openFilters;
-
-    /**
-     * The last filter used by the {@link #open()} action.
-     */
-    private FileChooser.ExtensionFilter lastFilter;
-
-    /**
-     * Creates a new Apache SIS application.
-     */
-    public Main() {
-    }
-
-    /**
-     * Invoked by JavaFX for starting the application.
-     * This method is called on the JavaFX Application Thread.
-     *
-     * @param window  the primary stage onto which the application scene will be be set.
-     */
-    @Override
-    public void start(final Stage window) {
-        this.window = window;
-        final Vocabulary vocabulary = Vocabulary.getResources((Locale) null);
-        /*
-         * Configure the menu bar. For most menu item, the action is to invoke a method
-         * of the same name in this application class (e.g. open()).
-         */
-        final MenuBar menus = new MenuBar();
-        final Menu file = new Menu(vocabulary.getString(Vocabulary.Keys.File));
-        {
-            final MenuItem open = new MenuItem(vocabulary.getMenuLabel(Vocabulary.Keys.Open));
-            open.setAccelerator(KeyCombination.keyCombination("Shortcut+O"));
-            open.setOnAction(e -> open());
-
-            final MenuItem exit = new MenuItem(vocabulary.getString(Vocabulary.Keys.Exit));
-            exit.setOnAction(e -> Platform.exit());
-            file.getItems().addAll(open, new SeparatorMenuItem(), exit);
-        }
-        menus.getMenus().add(file);
-        /*
-         * Set the main content and show.
-         */
-        content = new ResourceView();
-        final BorderPane pane = new BorderPane();
-        pane.setTop(menus);
-        pane.setCenter(content.pane);
-        Scene scene = new Scene(pane);
-        window.setTitle("Apache Spatial Information System");
-        window.setScene(scene);
-        window.setWidth(800);
-        window.setHeight(650);
-        window.show();
-    }
-
-    /**
-     * Creates the file filters for the dialog box to shown in "File" ▶ "Open" and "File" ▶ "Save" menus.
-     *
-     * @todo Iterate only over the classes in JDK9, without initializing the providers.
-     */
-    private void createFileFilters() {
-        final Resources res = Resources.getInstance();
-        final Set<String> allSuffixes = new LinkedHashSet<>();
-        final List<FileChooser.ExtensionFilter> openFilters = new ArrayList<>();
-//      final List<FileChooser.ExtensionFilter> saveFilters = new ArrayList<>();
-        /*
-         * Add an "All files (*.*)" filter only for the Open action.
-         * The Save action will need to specify a specific filter.
-         */
-        openFilters.add(new FileChooser.ExtensionFilter(res.getString(Resources.Keys.AllFiles), "*.*"));
-        for (DataStoreProvider provider : DataStores.providers()) {
-            final StoreMetadata md = provider.getClass().getAnnotation(StoreMetadata.class);
-            if (md != null) {
-                final String[] suffixes = md.fileSuffixes();
-                if (suffixes.length != 0) {
-                    final boolean canOpen = ArraysExt.contains(md.capabilities(), Capability.READ);
-//                  final boolean canSave = ArraysExt.contains(md.capabilities(), Capability.WRITE);
-                    for (int i=0; i < suffixes.length; i++) {
-                        final String fs = "*.".concat(suffixes[i]);
-                        suffixes[i] = fs;
-                        if (canOpen) {
-                            allSuffixes.add(fs);
-                        }
-                    }
-                    final FileChooser.ExtensionFilter f = new FileChooser.ExtensionFilter(
-                                    md.formatName() + " (" + suffixes[0] + ')', suffixes);
-                    if (canOpen) openFilters.add(f);
-//                  if (canSave) saveFilters.add(f);
-                }
-            }
-        }
-        /*
-         * Add a filter for all geospatial files in second position, after "All files" and before
-         * the filters for specific formats. This will be the default filter for the "Open" action.
-         */
-        openFilters.add(1, new FileChooser.ExtensionFilter(res.getString(Resources.Keys.GeospatialFiles),
-                            allSuffixes.toArray(new String[allSuffixes.size()])));
-        this.openFilters = openFilters.toArray(new FileChooser.ExtensionFilter[openFilters.size()]);
-//      this.saveFilters = saveFilters.toArray(new FileChooser.ExtensionFilter[saveFilters.size()]);
-    }
-
-    /**
-     * Invoked when the user selects "File" ▶ "Open" menu.
-     * Users can select an arbitrary amount of files or directories.
-     * The effect is the same as dragging the files in the "resources tree" window.
-     */
-    private void open() {
-        if (openFilters == null) {
-            createFileFilters();
-            lastFilter = openFilters[1];
-        }
-        final FileChooser chooser = new FileChooser();
-        chooser.setTitle(Resources.format(Resources.Keys.OpenDataFile));
-        chooser.getExtensionFilters().addAll(openFilters);
-        chooser.setSelectedExtensionFilter(lastFilter);
-        final List<File> files = chooser.showOpenMultipleDialog(window);
-        if (files != null) {
-            lastFilter = chooser.getSelectedExtensionFilter();
-            content.open(files);
-        }
-    }
-
-    /**
-     * Starts the Apache SIS application.
-     *
-     * @param args  ignored.
-     */
-    public static void main(final String[] args) {
-        launch(args);
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/FeatureTable.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/FeatureTable.java
deleted file mode 100644
index dd5ec20..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/FeatureTable.java
+++ /dev/null
@@ -1,169 +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.sis.gui.dataset;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Iterator;
-import java.util.ResourceBundle;
-import java.util.MissingResourceException;
-import java.util.stream.Stream;
-import java.util.stream.Collectors;
-import javafx.collections.FXCollections;
-import javafx.scene.control.Label;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
-import javafx.scene.control.TreeItem;
-import javafx.scene.control.TreeView;
-import javafx.scene.layout.BorderPane;
-import javafx.beans.property.SimpleObjectProperty;
-import org.apache.sis.feature.AbstractFeature;
-import org.apache.sis.feature.AbstractIdentifiedType;
-import org.opengis.geometry.Geometry;
-import org.apache.sis.internal.util.CheckedArrayList;
-import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.storage.FeatureSet;
-import org.apache.sis.storage.Resource;
-
-
-/**
- *
- * @author  Johann Sorel (Geomatys)
- * @author  Smaniotto Enzo
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class FeatureTable extends BorderPane {
-    /**
-     * Contains ResourceBundles indexed by table names.
-     */
-    private final Map<String, ResourceBundle> bundles = new HashMap<>();
-
-    private String bundlePrefix;
-
-    private String generateFinalColumnName(final AbstractIdentifiedType prop) {
-        Map<String, Map.Entry<String, String>> labelInfo = (Map) prop.getDesignation();
-        final String labelName = prop.getName().toString();
-        String columnName = labelName;
-        String tableName = null;
-        /*
-         * If exists, explore labelInfo to retrive table and column respect to this label.
-         */
-        if (labelInfo != null) {
-            final Map.Entry<String, String> entry = labelInfo.get(labelName);
-            if (entry != null) {
-                if (entry.getKey() != null) {
-                    tableName = entry.getKey();
-                } else {
-                    tableName = null;
-                }
-                if (entry.getValue() != null) {
-                    columnName = entry.getValue();
-                } else {
-                    columnName = labelName;
-                }
-            }
-        }
-        /*
-         * If table name is not null, try to found resourcebundle for this table.
-         */
-        if (tableName != null) {
-            /*
-             * If there isn't resource bundles (or not for the curruen table), try to generate.
-             */
-            if (bundles.get(tableName) == null) {
-                if (bundlePrefix != null) {
-                    bundles.put(tableName, ResourceBundle.getBundle(bundlePrefix + tableName));
-                }
-            }
-        }
-        final ResourceBundle bundle = bundles.get(tableName);
-        String finalColumnName;
-        if (labelName == null) {
-            finalColumnName = "";
-        } else if (bundle == null) {
-            if (!labelName.equals(columnName)) {
-                finalColumnName = columnName + " as " + labelName;
-            } else {
-                finalColumnName = columnName;
-            }
-        } else {
-            try {
-                if (!labelName.equals(columnName)) {
-                    finalColumnName = bundle.getString(columnName) + " as " + labelName;
-                } else {
-                    finalColumnName = bundle.getString(columnName);
-                }
-            } catch (MissingResourceException ex) {
-                if (!labelName.equals(columnName)) {
-                    finalColumnName = columnName + " as " + labelName;
-                } else {
-                    finalColumnName = columnName;
-                }
-            }
-        }
-        return finalColumnName;
-    }
-
-    public FeatureTable(Resource res, int i) throws DataStoreException {
-        TableView<AbstractFeature> ttv = new TableView<>();
-        final ScrollPane scroll = new ScrollPane(ttv);
-        scroll.setFitToHeight(true);
-        scroll.setFitToWidth(true);
-        ttv.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
-        ttv.setTableMenuButtonVisible(true);
-        ttv.setFixedCellSize(100);
-        scroll.setPrefSize(600, 400);
-        scroll.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
-        setCenter(scroll);
-        final List<AbstractFeature> list;
-        if (res instanceof FeatureSet) {
-            try (Stream<AbstractFeature> stream = ((FeatureSet) res).features(false)) {
-                list = stream.collect(Collectors.toList());
-                ttv.setItems(FXCollections.observableArrayList(list));
-                for (AbstractIdentifiedType pt : list.get(0).getType().getProperties(false)) {
-                    final TableColumn<AbstractFeature, BorderPane> column = new TableColumn<>(generateFinalColumnName(pt));
-                    column.setCellValueFactory((TableColumn.CellDataFeatures<AbstractFeature, BorderPane> param) -> {
-                        final Object val = param.getValue().getPropertyValue(pt.getName().toString());
-                        if (val instanceof Geometry) {
-                            return new SimpleObjectProperty<>(new BorderPane(new Label("{geometry}")));
-                        } else {
-                            SimpleObjectProperty<BorderPane> sop = new SimpleObjectProperty<>();
-                            if (val instanceof CheckedArrayList<?>) {
-                                Iterator<String> it = ((CheckedArrayList<String>) val).iterator();
-                                TreeItem<String> ti = new TreeItem<>(it.next());
-                                while (it.hasNext()) {
-                                    ti.getChildren().add(new TreeItem<>(it.next()));
-                                }
-                                BorderPane bp = new BorderPane(new TreeView<>(ti));
-                                sop.setValue(bp);
-                                return sop;
-                            } else {
-                                sop.setValue(new BorderPane(new Label(String.valueOf(val))));
-                                return sop;
-                            }
-                        }
-                    });
-                    ttv.getColumns().add(column);
-                }
-            }
-        }
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceTree.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceTree.java
deleted file mode 100644
index 751d256..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceTree.java
+++ /dev/null
@@ -1,243 +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.sis.gui.dataset;
-
-import java.awt.Color;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.ObservableList;
-import javafx.geometry.Pos;
-import javafx.scene.control.ContentDisplay;
-import javafx.scene.control.TreeItem;
-import javafx.scene.control.TreeTableCell;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableRow;
-import javafx.scene.control.TreeTableView;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.text.TextAlignment;
-import javafx.util.Callback;
-import org.apache.sis.internal.gui.FontGlyphs;
-import org.apache.sis.metadata.iso.citation.Citations;
-import org.apache.sis.internal.util.CollectionsExt;
-import org.apache.sis.storage.Aggregate;
-import org.apache.sis.storage.DataStore;
-import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.storage.FeatureSet;
-import org.apache.sis.storage.Resource;
-import org.opengis.metadata.Metadata;
-import org.opengis.metadata.citation.Citation;
-import org.opengis.metadata.identification.Identification;
-import org.opengis.util.InternationalString;
-
-
-/**
- * Tree viewer displaying a {@link Resource} hierarchy.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class ResourceTree extends TreeTableView<Resource> {
-
-    private static final Image ICON_VECTOR = FontGlyphs.createImage("\uE922",18,Color.GRAY);
-    private static final Image ICON_FOLDER = FontGlyphs.createImage("\uE2C8",18,Color.GRAY);
-    private static final Image ICON_STORE = FontGlyphs.createImage("\uE2C7",18,Color.GRAY);
-    private static final Image ICON_OTHER = FontGlyphs.createImage("\uE24D",18,Color.GRAY);
-
-    public ResourceTree() {
-        getColumns().add(new ResourceNameColumn());
-        setColumnResizePolicy(CONSTRAINED_RESIZE_POLICY);
-    }
-
-    /**
-     * Get root {@link Resource} of this tree.
-     *
-     * @return root {@link Resource}, may be null
-     */
-    public Resource getResource() {
-        final TreeItem<Resource> root = getRoot();
-        return root == null ? null : root.getValue();
-    }
-
-    /**
-     * Set root {@link Resource} of this tree.
-     *
-     * @param resource can be null
-     */
-    public void setResource(Resource resource) {
-        if (resource == null) {
-            setRoot(null);
-        } else {
-            setRoot(new ResourceItem(resource));
-        }
-    }
-
-    /**
-     * Find an appropriate icon for given resource.
-     *
-     * @param resource resource to test
-     * @return image icon
-     */
-    private static Image getTypeIcon(Resource resource){
-        if (resource instanceof FeatureSet) {
-            return ICON_VECTOR;
-        } else if (resource instanceof DataStore) {
-            return ICON_STORE;
-        } else if (resource instanceof Aggregate) {
-            return ICON_FOLDER;
-        } else {
-            // Unspecific resource type
-            return ICON_OTHER;
-        }
-    }
-
-    /**
-     * Returns a label for a resource. Current implementation builds a string containing the resource title
-     * if non-ambiguous, followed by filename in order to resolve ambiguity that may be caused by different
-     * files having the same resource identification in their metadata.
-     *
-     * @param  name      the result of {@link DataStore#getDisplayName()}, or {@code null} if unknown.
-     * @param  metadata  the result of {@link DataStore#getMetadata()} (may be {@code null}).
-     */
-    private static String getTitle(final String name, final Metadata metadata) {
-        if (metadata != null) {
-            String title = null;
-            for (final Identification identification : CollectionsExt.nonNull(metadata.getIdentificationInfo())) {
-                final Citation citation = identification.getCitation();
-                if (citation != null) {
-                    final InternationalString i18n = citation.getTitle();
-                    String id;
-                    if (i18n != null) {
-                        id = i18n.toString();                   // TODO: use display locale.
-                    } else {
-                        id = Citations.getIdentifier(identification.getCitation());
-                    }
-                    if (id != null && !(id = id.trim()).isEmpty()) {
-                        if (title == null) {
-                            title = id;
-                        } else if (!title.equals(id)) {
-                            return name;                        // Ambiguity - will use the filename instead.
-                        }
-                    }
-                }
-            }
-            if (title != null) {
-                if (name != null) {
-                    title += " (" + name + ')';
-                }
-                return title;
-            }
-        }
-        return name;
-    }
-
-
-    private static class ResourceItem extends TreeItem<Resource> {
-
-        private final Resource resource;
-        private boolean isFirstTimeChildren = true;
-
-        public ResourceItem(Resource res) {
-            super(res);
-            this.resource = res;
-        }
-
-        @Override
-        public ObservableList<TreeItem<Resource>> getChildren() {
-            if (isFirstTimeChildren) {
-                isFirstTimeChildren = false;
-                super.getChildren().setAll(buildChildren());
-            }
-            return super.getChildren();
-        }
-
-        @Override
-        public boolean isLeaf() {
-            return !(resource instanceof Aggregate);
-        }
-
-        private List<TreeItem<Resource>> buildChildren() {
-            if (resource instanceof Aggregate) {
-                final List<TreeItem<Resource>> lst = new ArrayList<>();
-                try {
-                    for (Resource res : ((Aggregate) resource).components()) {
-                        lst.add(new ResourceItem(res));
-                    }
-                } catch (DataStoreException ex) {
-                    ex.printStackTrace();                   // TODO: need better handling.
-                }
-                return lst;
-            }
-            return Collections.emptyList();
-        }
-    }
-
-    private static class ResourceNameColumn extends TreeTableColumn<Resource,String> {
-
-        public ResourceNameColumn() {
-            super("Resource");
-            setCellValueFactory(new Callback<CellDataFeatures<Resource, String>, javafx.beans.value.ObservableValue<java.lang.String>>() {
-                @Override
-                public ObservableValue<String> call(CellDataFeatures<Resource, String> param) {
-                    final Resource res = param.getValue().getValue();
-                    final String name = (res instanceof DataStore) ? ((DataStore) res).getDisplayName() : null;
-                    try {
-                        return new SimpleObjectProperty<>(getTitle(name, res.getMetadata()));
-                    } catch (DataStoreException ex) {
-                        return new SimpleObjectProperty<>(ex.getMessage());
-                    }
-                }
-            });
-            setCellFactory((TreeTableColumn<Resource, String> param) -> new Cell());
-            setEditable(true);
-            setPrefWidth(200);
-            setMinWidth(120);
-            setResizable(true);
-        }
-    }
-
-    private static class Cell extends TreeTableCell<Resource, String> {
-
-        @Override
-        public void updateItem(String item, boolean empty) {
-            super.updateItem(item, empty);
-            setText(item);
-            setGraphic(null);
-            setContentDisplay(ContentDisplay.LEFT);
-            setAlignment(Pos.CENTER_LEFT);
-            setTextAlignment(TextAlignment.LEFT);
-            setWrapText(false);
-            if (empty) return;
-
-            final TreeTableRow<Resource> row = getTreeTableRow();
-            if (row == null) {
-                return;
-            }
-            final TreeItem<Resource> ti = row.getTreeItem();
-            if (ti == null) {
-                return;
-            }
-            final Resource resource = ti.getValue();
-            setGraphic(new ImageView(getTypeIcon(resource)));
-        }
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataNode.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataNode.java
deleted file mode 100644
index 39fb007..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataNode.java
+++ /dev/null
@@ -1,228 +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.sis.gui.metadata;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Predicate;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.scene.control.TreeItem;
-import javafx.scene.control.TreeTableColumn;
-import javafx.scene.control.TreeTableView;
-import org.apache.sis.util.collection.TableColumn;
-import org.apache.sis.util.collection.TreeTable;
-import org.opengis.referencing.ReferenceSystem;
-
-
-/**
- *
- * @author Siddhesh Rane
- */
-final class MetadataNode extends TreeTableView<TreeTable.Node> {
-
-    private static final Predicate<TreeTable.Node> HIDE_EMPTY_LEAF = t -> !t.isLeaf() || t.getValue(TableColumn.VALUE) != null;
-    private static final Predicate<TreeTable.Node> EXPAND_SINGLE_CHILD = node -> node.getChildren().size() == 1 || node.getParent() == null;
-
-    private TreeTable treeTable;
-    private TreeTableColumn<TreeTable.Node, String> nameColumn;
-    private TreeTableColumn<TreeTable.Node, TreeTable.Node> valueColumn;
-    private TreeTableColumn<TreeTable.Node, String> textColumn;
-
-    private final ObjectProperty<Predicate<TreeTable.Node>> createTreeItemForNodeProperty = new SimpleObjectProperty<>(HIDE_EMPTY_LEAF);
-
-    /**
-     * A property containing predicate that returns true if the given
-     * {@link TreeTable.Node} must be shown as a {@link TreeItem} in the
-     * {@link TreeTableView}. By default return true for all nodes unless
-     * preferences are loaded
-     *
-     * @return The property containing the expansion predicate
-     */
-    private ObjectProperty<Predicate<TreeTable.Node>> createTreeItemForNodeProperty() {
-        return createTreeItemForNodeProperty;
-    }
-
-    private Predicate<TreeTable.Node> getCreateTreeItemForNode() {
-        return createTreeItemForNodeProperty.get();
-    }
-
-    private void setCreateTreeItemForNode(Predicate<TreeTable.Node> createTreeItemForNode) {
-        createTreeItemForNodeProperty.set(createTreeItemForNode);
-    }
-
-    private final SimpleObjectProperty<Predicate<TreeTable.Node>> expandNodeProperty = new SimpleObjectProperty<>(EXPAND_SINGLE_CHILD);
-
-    /**
-     * A property containing predicate that returns true if the given
-     * {@link TreeTable.Node} must be expanded in the {@link TreeTableView} to
-     * show its children by default.
-     *
-     * @return The property containing the expansion predicate
-     */
-    private ObjectProperty<Predicate<TreeTable.Node>> expandNodeProperty() {
-        return expandNodeProperty;
-    }
-
-    private Predicate<TreeTable.Node> getExpandNode() {
-        return expandNodeProperty.get();
-    }
-
-    private void setExpandNode(Predicate<TreeTable.Node> expandNode) {
-        expandNodeProperty.set(expandNode);
-    }
-
-    private void expandNodes(TreeItem<TreeTable.Node> root) {
-        if (root == null || root.isLeaf()) {
-            return;
-        }
-        root.setExpanded(getExpandNode().test(root.getValue()));
-        for (TreeItem<TreeTable.Node> child : root.getChildren()) {
-            expandNodes(child);
-        }
-    }
-
-    ObjectProperty<Comparator<TreeTable.Node>> order = new SimpleObjectProperty<>(Comparator.comparingInt(n -> 0));
-
-    /**
-     * the default order of sorting for rows of the tree table.
-     *
-     * @return
-     */
-    private ObjectProperty<Comparator<TreeTable.Node>> orderProperty() {
-        return order;
-    }
-
-    private void setOrder(Comparator c) {
-        order.set(c);
-    }
-
-    private Comparator<TreeTable.Node> getOrder() {
-        return order.get();
-    }
-
-    MetadataNode(TreeTable treeTable) {
-        this();
-        setTreeTable(treeTable);
-    }
-
-    private MetadataNode() {
-        createTableColumns();
-        setShowRoot(false);
-        setColumnResizePolicy(CONSTRAINED_RESIZE_POLICY);
-        expandNodeProperty.addListener(ob -> expandNodes(getRoot()));
-    }
-
-    /**
-     * Creates {@link TableColumn}s for name, identifier, value valueastext, but
-     * doesnt add them to the table. These columns can later be added according
-     * what all is contained by the TreeTable.
-     */
-    private void createTableColumns() {
-        //NAME column
-        nameColumn = new TreeTableColumn<>(TableColumn.NAME.getHeader().toString());
-        nameColumn.setCellValueFactory((param) -> {
-            CharSequence value = param.getValue().getValue().getValue(TableColumn.NAME);
-            return new SimpleStringProperty(Objects.toString(value, ""));
-        });
-
-        //TEXT column
-        textColumn = new TreeTableColumn<>(TableColumn.VALUE_AS_TEXT.getHeader().toString());
-        textColumn.setCellValueFactory((param) -> {
-            CharSequence value = param.getValue().getValue().getValue(TableColumn.VALUE_AS_TEXT);
-            return new SimpleStringProperty(Objects.toString(value, ""));
-        });
-
-        //VALUE column
-        valueColumn = new TreeTableColumn<>(TableColumn.VALUE.getHeader().toString());
-        valueColumn.setCellValueFactory((param) -> {
-            TreeTable.Node value = param.getValue().getValue();
-            SimpleObjectProperty ret = new SimpleObjectProperty(value.getValue(TableColumn.VALUE));
-            if (value.getValue(TableColumn.NAME).toString().equals("Reference system info")) {
-                ReferenceSystem newVal = (ReferenceSystem) ret.getValue();
-                ret.setValue(newVal.getName());
-            }
-            return ret;
-        });
-    }
-
-    private TreeTable getTreeTable() {
-        return treeTable;
-    }
-
-    private void setTreeTable(TreeTable treeTable) {
-        this.treeTable = treeTable;
-        if (treeTable == null) {
-            setRoot(null);
-            return;
-        }
-
-        List<TableColumn<?>> columns = treeTable.getColumns();
-        if (columns.contains(TableColumn.NAME)) {
-            if (nameColumn.getTreeTableView() == null) {
-                getColumns().add(nameColumn);
-            }
-        } else {
-            getColumns().remove(nameColumn);
-        }
-        if (columns.contains(TableColumn.VALUE)) {
-            if (valueColumn.getTreeTableView() == null) {
-                getColumns().add(valueColumn);
-            }
-        } else {
-            getColumns().remove(valueColumn);
-        }
-        if (columns.contains(TableColumn.VALUE_AS_TEXT)) {
-            if (textColumn.getTreeTableView() == null) {
-                getColumns().add(textColumn);
-            }
-        } else {
-            getColumns().remove(textColumn);
-        }
-        TreeItem<TreeTable.Node> rootItem = new TreeItem<>(treeTable.getRoot());
-        setRoot(rootItem);
-        rootItem.setExpanded(true);
-        updateRoot();
-    }
-
-    private void updateRoot() {
-        getRoot().getChildren().clear();
-        createTreeItems(getRoot(), treeTable.getRoot().getChildren());
-    }
-
-    private void createTreeItems(TreeItem<TreeTable.Node> rootItem, Collection<TreeTable.Node> children) {
-        for (TreeTable.Node node : children) {
-            TreeItem parent = rootItem;
-            //include this node in the tree table view?
-            if (getCreateTreeItemForNode().test(node)) {
-                parent = new TreeItem(node);
-                parent.setExpanded(getExpandNode().test(node));
-                rootItem.getChildren().add(parent);
-            }
-            if (!node.isLeaf()) {
-                createTreeItems(parent, node.getChildren());
-            }
-            if (parent.getChildren().size() > 1) {
-                Comparator<TreeItem<TreeTable.Node>> cp = Comparator.comparing(TreeItem<TreeTable.Node>::getValue, getOrder());
-                parent.getChildren().sort(cp);
-            }
-        }
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java
deleted file mode 100644
index b556230..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/MetadataOverview.java
+++ /dev/null
@@ -1,403 +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.sis.gui.metadata;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.DateFormat;
-import java.text.NumberFormat;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.event.ActionEvent;
-import javafx.event.Event;
-import javafx.geometry.Insets;
-import javafx.scene.Node;
-import javafx.scene.canvas.Canvas;
-import javafx.scene.control.ComboBox;
-import javafx.scene.control.Label;
-import javafx.scene.control.TitledPane;
-import javafx.scene.control.Toggle;
-import javafx.scene.control.ToggleButton;
-import javafx.scene.control.ToggleGroup;
-import javafx.scene.image.Image;
-import javafx.scene.layout.GridPane;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Priority;
-import javafx.scene.layout.StackPane;
-import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import org.opengis.metadata.Metadata;
-import org.opengis.metadata.citation.CitationDate;
-import org.opengis.metadata.extent.Extent;
-import org.opengis.metadata.extent.GeographicBoundingBox;
-import org.opengis.metadata.extent.GeographicDescription;
-import org.opengis.metadata.extent.GeographicExtent;
-import org.opengis.metadata.identification.DataIdentification;
-import org.opengis.metadata.identification.Identification;
-import org.opengis.metadata.identification.TopicCategory;
-import org.opengis.metadata.spatial.Dimension;
-import org.opengis.metadata.spatial.SpatialRepresentation;
-import org.opengis.metadata.spatial.SpatialRepresentationType;
-import org.opengis.referencing.ReferenceSystem;
-import org.opengis.util.InternationalString;
-import org.apache.sis.metadata.iso.DefaultMetadata;
-import org.apache.sis.metadata.iso.spatial.DefaultGridSpatialRepresentation;
-import org.apache.sis.util.iso.Types;
-
-
-/**
- * Metadata Viewer.
- *
- * @author  Smaniotto Enzo
- * @version 1.0
- * @since   1.0
- * @module
- */
-class MetadataOverview extends StackPane {
-
-    private final Metadata metadata;
-    final String fromFile;
-    private final Locale locale = Locale.getDefault();
-
-    public MetadataOverview(final DefaultMetadata md, final String fromFile) {
-        this.metadata = md;
-        this.fromFile = fromFile;
-        VBox root = new VBox();
-        root.setStyle("-fx-background-color: linear-gradient(to bottom right, #aeb7c4, #fafafa);");
-
-        // Creation of the differents views.
-        VBox summaryView = createSummaryView();
-        MetadataNode advancedView = new MetadataNode(md.asTreeTable());
-        advancedView.setMaxHeight(Double.MAX_VALUE);
-        VBox.setVgrow(advancedView, Priority.ALWAYS);
-
-        // Create and configure view selection buttons.
-        ToggleGroup buttonGroup = new ToggleGroup();
-        ToggleButton tb1 = new ToggleButton("Summary");
-        ToggleButton tb2 = new ToggleButton("Advanced");
-        tb1.setStyle("-fx-text-fill: white; -fx-font-family: Arial Narrow;-fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); -fx-padding: 0.8em;");
-        tb2.setStyle("-fx-text-fill: white; -fx-font-family: Arial Narrow;-fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); -fx-padding: 0.8em;");
-
-        tb1.setToggleGroup(buttonGroup);
-        tb1.setSelected(true);
-        tb1.setDisable(true);
-        tb2.setToggleGroup(buttonGroup);
-        buttonGroup.selectToggle(tb1);
-        buttonGroup.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) -> {
-            if (tb2.isSelected()) {
-                tb2.setDisable(true);
-                root.getChildren().remove(summaryView);
-                root.getChildren().add(advancedView);
-                tb1.setDisable(false);
-            } else {
-                tb1.setDisable(true);
-                root.getChildren().add(summaryView);
-                root.getChildren().remove(advancedView);
-                tb2.setDisable(false);
-            }
-        });
-
-        HBox toggleGroupLayout = new HBox();
-        toggleGroupLayout.getChildren().addAll(tb1, tb2);
-        toggleGroupLayout.setPadding(new Insets(0, 0, 10, 0));
-
-        root.getChildren().add(toggleGroupLayout);
-        root.getChildren().add(summaryView);
-
-        this.getChildren().add(root);
-    }
-
-    private VBox createSummaryView() {
-        VBox vb = new VBox();
-        TitledPane idPane = new TitledPane("Identification info", createIdGridPane());
-        GridPane createSpatialGridPane = createSpatialGridPane();
-        vb.getChildren().add(idPane);
-        if (!createSpatialGridPane.getChildren().isEmpty()) {
-            TitledPane spatialPane = new TitledPane("Spatial representation", createSpatialGridPane);
-            vb.getChildren().add(spatialPane);
-        }
-        return vb;
-    }
-
-    private GridPane createIdGridPane() {
-        GridPane gp = new GridPane();
-        gp.setHgap(10.00);
-        int j = 0, k = 1;
-
-        HashMap<String, Identification> m = new HashMap<>();
-        ComboBox<String> comboBox = createComboBox(m);
-        comboBox.setStyle("-fx-font-weight: bold; -fx-font-size: 2em;");
-        if (!comboBox.isVisible()) {
-            Label la = new Label(comboBox.getValue());
-            la.setStyle("-fx-font-weight: bold; -fx-font-size: 2em;");
-            gp.add(la, j, k++, 2, 1);
-        } else {
-            gp.add(comboBox, j, k++, 2, 1);
-        }
-
-        GridPane gpi = new GridPane();
-        gpi.setHgap(10.00);
-
-        comboBox.setOnAction(e -> {
-            gpi.getChildren().clear();
-            DataIdentification id = (DataIdentification) m.get(comboBox.getValue());
-            if (comboBox.getValue().equals("No data to show")) {
-                return;
-            }
-
-            // Show the abstract or the credit, the topic category, the creation date, the type of data, the representation system info and also the geographical area.
-            Object ab = id.getAbstract();
-            if (ab != null) {
-                InternationalString abs = (InternationalString) ab;
-                Label crd = new Label("Abstract");
-                Label crdValue = new Label(abs.toString(locale));
-                crdValue.setWrapText(true);
-                gpi.add(crd, 0, 1);
-                gpi.add(crdValue, 1, 1);
-            } else {
-                Collection<String> credits = id.getCredits();
-                if (!credits.isEmpty()) {
-                    String credit = credits.iterator().next();
-                    Label crd = new Label("Credit");
-                    Label crdValue = new Label(credit.toString());
-                    crdValue.setWrapText(true);
-                    gpi.add(crd, 0, 1);
-                    gpi.add(crdValue, 1, 1);
-                }
-            }
-
-            Collection<TopicCategory> tcs = id.getTopicCategories();
-            if (!tcs.isEmpty()) {
-                TopicCategory tc = tcs.iterator().next();
-                Label topicC = new Label("Topic Category");
-                Label topicValue = new Label(tc.toString());
-                topicValue.setWrapText(true);
-                gpi.add(topicC, 0, 2);
-                gpi.add(topicValue, 1, 2);
-            }
-
-            if (!id.getCitation().getDates().isEmpty()) {
-                CitationDate dateAndType = id.getCitation().getDates().iterator().next();
-                DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, locale);
-                String dateStr = dateFormat.format(dateAndType.getDate());
-                String s = dateAndType.getDateType().toString();
-                s = s.replace("DateType[", "");
-                s = s.replace("]", "");
-                Label dt = new Label("Date type: " + s.toLowerCase());
-                Label dtValue = new Label(dateStr);
-                dtValue.setWrapText(true);
-                gpi.add(dt, 0, 3);
-                gpi.add(dtValue, 1, 3);
-            }
-
-            if (id instanceof DataIdentification) {
-                Label topicC = new Label("Object type");
-                Label topicValue = new Label("Data");
-                topicValue.setWrapText(true);
-                gpi.add(topicC, 0, 4);
-                gpi.add(topicValue, 1, 4);
-            } else {
-                Label topicC = new Label("Object type");
-                Label topicValue = new Label("Service");
-                topicValue.setWrapText(true);
-                gpi.add(topicC, 0, 4);
-                gpi.add(topicValue, 1, 4);
-            }
-
-            Collection<SpatialRepresentationType> spatialRepresentationTypes = id.getSpatialRepresentationTypes();
-            Iterator<SpatialRepresentationType> its = spatialRepresentationTypes.iterator();
-            String typeList = "Spatial representation type: ";
-            while (its.hasNext()) {
-                SpatialRepresentationType spatialRepresentationType = its.next();
-                typeList += spatialRepresentationType.toString().toLowerCase(locale).replace("spatialrepresentationtype[", "").replace(']', '\0') + ", ";
-            }
-            if (!typeList.equals("Spatial representation type: ")) {
-                Label list = new Label(typeList.substring(0, typeList.length() - 2));
-                list.setWrapText(true);
-                gpi.add(list, 0, 5, 2, 1);
-            }
-
-            Collection<? extends Extent> exs = id.getExtents();
-            if (!exs.isEmpty()) {
-                Extent ex = exs.iterator().next();
-                Collection<? extends GeographicExtent> ges = ex.getGeographicElements();
-                Iterator<? extends GeographicExtent> it = ges.iterator();
-                while (it.hasNext()) {
-                    GeographicExtent ge = it.next();
-                    Label geoEx = new Label("Zone");
-                    Label geoExValue = new Label(ge.toString());
-                    geoExValue.setWrapText(true);
-                    if (ge instanceof GeographicBoundingBox) {
-                        geoEx.setText("");
-                        GeographicBoundingBox gbd = (GeographicBoundingBox) ge;
-                        geoExValue.setText("");
-                        Canvas c = createMap(gbd.getNorthBoundLatitude(), gbd.getEastBoundLongitude(), gbd.getSouthBoundLatitude(), gbd.getWestBoundLongitude());
-                        if (c != null) {
-                            gpi.add(c, 0, 6, 2, 1);
-                        } else {
-                            geoEx.setText("Impossible to load the map.");
-                            gpi.add(geoEx, 0, 6);
-                            gpi.add(geoExValue, 1, 6);
-                        }
-                    } else if (ge instanceof GeographicDescription) {
-                        geoEx.setText("Geographic description");
-                        GeographicDescription gd = (GeographicDescription) ge;
-                        geoExValue.setText(gd.getGeographicIdentifier().getCode());
-                    }
-                }
-            }
-        });
-
-        Event.fireEvent(comboBox, new ActionEvent());
-        gp.add(gpi, j, k++, 2, 1);
-
-        int ind = 0;
-        for (Node n : gp.getChildren()) {
-            if (ind++ != 0) {
-                n.setStyle("-fx-padding: 0 83 10 0;");
-            } else {
-                n.setStyle("-fx-padding: 0 0 10 0; -fx-font-weight: bold; -fx-font-size: 2em;");
-            }
-        }
-        gpi.getChildren().forEach(n -> n.setStyle("-fx-padding: 0 0 10 0;"));
-
-        return gp;
-    }
-
-    private Canvas createMap(double north, double east, double south, double west) {
-        Canvas can = new Canvas();
-        Image image = null;
-        try (InputStream in = MetadataOverview.class.getResourceAsStream("WorldMap360x180.png")) {
-            image = new Image(in);
-        } catch (IOException e) {
-            // TODO
-        }
-        if (image.errorProperty().getValue()) {
-            return null;
-        }
-
-        double height = image.getHeight();
-        double width = image.getWidth();
-
-        can.setHeight(height);
-        can.setWidth(width);
-        can.getGraphicsContext2D().drawImage(image, 0, 0, width, height);
-        can.getGraphicsContext2D().setStroke(Color.DARKBLUE);
-        can.getGraphicsContext2D().setGlobalAlpha(0.1);
-        double x = west + width / 2, y = height / 2 - north, w = east - west, h = north - south;
-        can.getGraphicsContext2D().strokeRect(x, y, w, h);
-        final double minRectSize = 6.0;
-        if (w < minRectSize) {
-            double difX = minRectSize - w;
-            x -= difX / 2;
-            w = minRectSize;
-        }
-        if (h < minRectSize) {
-            double difY = minRectSize - h;
-            y -= difY / 2;
-            h = minRectSize;
-        }
-        can.getGraphicsContext2D().fillRect(x, y, w, h);
-        can.getGraphicsContext2D().setGlobalAlpha(1.0);
-        can.getGraphicsContext2D().setStroke(Color.DARKBLUE);
-        can.getGraphicsContext2D().strokeRect(x, y, w, h);
-
-        return can;
-    }
-
-    private GridPane createSpatialGridPane() {
-        GridPane gp = new GridPane();
-        gp.setHgap(10.00);
-        gp.setVgap(10.00);
-        int j = 0, k = 1;
-
-        Collection<? extends ReferenceSystem> referenceSystemInfos = metadata.getReferenceSystemInfo();
-        if (!referenceSystemInfos.isEmpty()) {
-            ReferenceSystem referenceSystemInfo = referenceSystemInfos.iterator().next();
-            Label rsiValue = new Label("Reference system infos: " + referenceSystemInfo.getName().toString());
-            rsiValue.setWrapText(true);
-            gp.add(rsiValue, j, k++);
-        }
-
-        Collection<? extends SpatialRepresentation> sris = this.metadata.getSpatialRepresentationInfo();
-        if (sris.isEmpty()) {
-            return gp;
-        }
-        NumberFormat numberFormat = NumberFormat.getIntegerInstance(locale);
-        for (SpatialRepresentation sri : sris) {
-            String currentValue = "• ";
-            if (sri instanceof DefaultGridSpatialRepresentation) {
-                DefaultGridSpatialRepresentation sr = (DefaultGridSpatialRepresentation) sri;
-
-                Iterator<? extends Dimension> it = sr.getAxisDimensionProperties().iterator();
-                while (it.hasNext()) {
-                    Dimension dim = it.next();
-                    currentValue += numberFormat.format(dim.getDimensionSize()) + " " + Types.getCodeTitle(dim.getDimensionName()) + " * ";
-                }
-                currentValue = currentValue.substring(0, currentValue.length() - 3);
-                Label spRep = new Label(currentValue);
-                gp.add(spRep, j, k++, 2, 1);
-                if (sr.getCellGeometry() != null) {
-                    Label cellGeo = new Label("Cell geometry:");
-                    Label cellGeoValue = new Label(Types.getCodeTitle(sr.getCellGeometry()).toString());
-                    cellGeoValue.setWrapText(true);
-                    gp.add(cellGeo, j, k);
-                    gp.add(cellGeoValue, ++j, k++);
-                    j = 0;
-                }
-            }
-        }
-        return gp;
-    }
-
-    private ComboBox<String> createComboBox(final Map<String, Identification> m) {
-        ComboBox<String> cb = new ComboBox<>();
-        Collection<? extends Identification> ids = this.metadata.getIdentificationInfo();
-        ObservableList<String> options = FXCollections.observableArrayList();
-        int i = 1;
-        if (ids.size() > 1) {
-            for (Identification id : ids) {
-                String currentName;
-                if (id.getCitation() != null) {
-                    currentName = id.getCitation().getTitle().toString();
-                } else {
-                    currentName = Integer.toString(i);
-                }
-                options.add(currentName);
-                m.put(currentName, id);
-            }
-            cb.setItems(options);
-            cb.setValue(ids.iterator().next().getCitation().getTitle().toString());
-        } else if (ids.size() == 1) {
-            if (ids.iterator().next().getCitation() != null) {
-                m.put(ids.iterator().next().getCitation().getTitle().toString(), ids.iterator().next());
-                cb.setValue(ids.iterator().next().getCitation().getTitle().toString());
-                cb.setVisible(false);
-            }
-        } else {
-            cb.setValue("No data to show");
-            cb.setVisible(false);
-        }
-        return cb;
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/ResourceView.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/ResourceView.java
deleted file mode 100644
index d2fd25c..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/ResourceView.java
+++ /dev/null
@@ -1,399 +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.sis.gui.metadata;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javafx.collections.ListChangeListener;
-import javafx.collections.ObservableList;
-import javafx.concurrent.Task;
-import javafx.event.Event;
-import javafx.scene.Node;
-import javafx.scene.control.Alert;
-import javafx.scene.control.ContextMenu;
-import javafx.scene.control.Label;
-import javafx.scene.control.MenuItem;
-import javafx.scene.control.ProgressIndicator;
-import javafx.scene.control.TreeItem;
-import javafx.scene.control.TreeView;
-import javafx.scene.input.DataFormat;
-import javafx.scene.input.Dragboard;
-import javafx.scene.input.MouseButton;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.input.TransferMode;
-import javafx.scene.control.SplitPane;
-import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import org.apache.sis.gui.dataset.FeatureTable;
-import org.apache.sis.internal.storage.folder.FolderStoreProvider;
-import org.apache.sis.metadata.iso.DefaultMetadata;
-import org.apache.sis.storage.Aggregate;
-import org.apache.sis.storage.DataStore;
-import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.storage.DataStores;
-import org.apache.sis.storage.FeatureSet;
-import org.apache.sis.storage.Resource;
-import org.apache.sis.storage.StorageConnector;
-
-
-/**
- * Show resources available in data files.
- *
- * @author  Smaniotto Enzo
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class ResourceView {
-
-    private final TreeItem<Label> root = new TreeItem<>(new Label("Files"));
-
-    // Those variables are used to temporary fix a bug while the FeatureTable is open (the root item erase his childrens so their disappear of the TreeView). this will have to be corrected later.
-    private final ObservableList<TreeItem<Label>> temporarySauv;
-
-    private List<TreeItem<Label>> temp = new ArrayList<>();
-
-    public final SplitPane pane = new SplitPane();
-
-    //This map link the respective Tree Items to their own Label in order to keep the informations of the document's name and of it location (stocked in the Label) to the item in the TreeView. Usefull to know which element is selected.
-    private final Map<Label, TreeItem<?>> labelToItem = new HashMap<>();
-
-    // This List contain all the elements present in the TreeView, referenced by their id (set to the specific location of each file). Used to know if a file is already open.
-    private final List<String> labToTrv = new ArrayList<>();
-
-    private Label sauvLabel, parent;
-
-    public ResourceView() {
-        pane.setStyle("-fx-background-color: linear-gradient(to bottom right, #aeb7c4, #fafafa);");
-        final VBox dragTarget = new VBox();
-
-        root.setExpanded(true);
-        final TreeView<Label> resources = new TreeView<>(root);
-        resources.setStyle("-fx-background-color: rgba(77, 201, 68, 0.4);");
-        resources.setShowRoot(false);
-
-        resources.setOnDragOver(event -> {
-            if (event.getGestureSource() != dragTarget && event.getDragboard().hasFiles()) {
-                event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
-            }
-            event.consume();
-        });
-        resources.setOnDragDropped(event -> {
-            Dragboard db = event.getDragboard();
-            boolean success = false;
-
-            File firstFile = db.getFiles().get(0);
-            if (firstFile.isDirectory()) {
-                openDirectory(firstFile);
-                success = true;
-            } else {
-                if (db.hasFiles()) {
-                    success = true;
-                }
-                List<?> fileList = (List<?>) db.getContent(DataFormat.FILES); // To open multiple files in one drop.
-                for (Object item : fileList) {
-                    File f = (File) item;
-                    openFile(f);
-                }
-            }
-            event.setDropCompleted(success);
-            event.consume();
-        });
-
-        // Link to the temporary varaible see above. This is a temporary part.
-        temporarySauv = root.getChildren();
-        temporarySauv.addListener((ListChangeListener.Change<? extends TreeItem<Label>> c) -> {
-            c.next();
-            if (c.wasRemoved()) {
-                temp.addAll(c.getRemoved());
-            }
-        });
-
-        pane.getItems().add(resources);
-    }
-
-    // Get the view of the opened element, return null otherwise.
-    private Object getContent() {
-        final ObservableList<Node> items = pane.getItems();
-        if (items.size() >= 2) {
-            return items.get(1);
-        } else {
-            return null;
-        }
-    }
-
-    // Set the view of the opened element.
-    private void setContent(final Node content) {
-        final ObservableList<Node> items = pane.getItems();
-        if (items.size() >= 2) {
-            items.set(1, content);
-        } else {
-            items.add(content);
-        }
-    }
-
-    private void addContextMenu(Label lab) {
-        MenuItem close = new MenuItem("Close");
-        close.setOnAction(ac -> {
-            root.getChildren().remove(labelToItem.get(lab));
-            labelToItem.remove(lab);
-            labToTrv.remove(lab.getId());
-            final Object content = getContent();
-            if (content != null && content instanceof FeatureTable) {
-                pane.getItems().remove(1);
-            }
-            if (content != null && content instanceof MetadataOverview) {
-                if (lab.getId().equals(((MetadataOverview) content).fromFile)) {
-                    setContent(new Label("   Please choose a file to open   "));
-               }
-            }
-        });
-        MenuItem feature = new MenuItem("Open Feature");
-        feature.setOnAction(ac -> {
-            try {
-                DataStore ds = DataStores.open(lab.getId());
-                if (ds instanceof FeatureSet) {
-                    root.getChildren().remove(labelToItem.get(lab));
-                    addFeaturePanel(lab.getId());
-                }
-            } catch (DataStoreException ex) {
-                final Alert alert = new Alert(Alert.AlertType.ERROR);
-                alert.setTitle("An error has occurred");
-                lab.setWrapText(true);
-                lab.setMaxWidth(650);
-                VBox vb = new VBox();
-                vb.getChildren().add(lab);
-                alert.getDialogPane().setContent(vb);
-                alert.show();
-            }
-        });
-        ContextMenu cm = new ContextMenu(feature, close);
-        lab.setContextMenu(cm);
-    }
-
-    // Define what happens when an element of the TreeView is clicked.
-    private void setOnClick(Label lab) {
-        addContextMenu(lab);
-        lab.setOnMouseClicked(click -> {
-            if (click.getButton() == MouseButton.PRIMARY) {
-                if (sauvLabel != null) {
-                    sauvLabel.setTextFill(Color.BLACK);
-                }
-                addMetadatPanel(null, lab.getId());
-                sauvLabel = lab;
-                lab.setTextFill(Color.RED);
-            }
-        });
-    }
-
-    private void addFeaturePanel(String filePath) {
-        try {
-            DataStore ds = DataStores.open(filePath);
-            setContent(new FeatureTable(ds, 18));
-            root.getChildren().addAll(temp);
-            temp.clear();
-        } catch (DataStoreException e) {
-            final Alert alert = new Alert(Alert.AlertType.ERROR);
-            alert.setTitle("An error has occurred");
-            Label lab = new Label(e.getMessage());
-            lab.setWrapText(true);
-            lab.setMaxWidth(650);
-            VBox vb = new VBox();
-            vb.getChildren().add(lab);
-            alert.getDialogPane().setContent(vb);
-            alert.show();
-        }
-    }
-
-    private void addMetadatPanel(Resource res, String filePath) {
-        Task<MetadataOverview> task = new Task<MetadataOverview>() {
-            @Override
-            protected MetadataOverview call() throws DataStoreException {
-                MetadataOverview meta;
-                if (res != null) {
-                    meta = new MetadataOverview(((DefaultMetadata) res.getMetadata()), filePath);
-                } else {
-                    DataStore ds = DataStores.open(filePath);
-                    meta = new MetadataOverview(new DefaultMetadata(ds.getMetadata()), filePath);
-                }
-                return meta;
-            }
-        };
-        task.setOnSucceeded(wse -> {
-            final MetadataOverview meta = task.getValue();
-            setContent(meta);
-        });
-        task.setOnRunning(wse -> {
-            ProgressIndicator p = new ProgressIndicator(-1);
-            p.setPrefSize(17, 18);
-            setContent(p);
-        });
-        task.setOnFailed(wse -> {
-            final Alert alert = new Alert(Alert.AlertType.ERROR);
-            alert.setTitle("An error was occur");
-            Label lab = new Label(task.getException().getMessage());
-            lab.setWrapText(true);
-            lab.setMaxWidth(650);
-            VBox vb = new VBox();
-            vb.getChildren().add(lab);
-            alert.getDialogPane().setContent(vb);
-            alert.show();
-        });
-        final Thread thread = new Thread(task);
-        thread.setDaemon(true);
-        thread.start();
-    }
-
-    public void open(final List<File> files) {
-        for (final File file : files) {
-            if (file.isDirectory()) {
-                openDirectory(file);
-            } else {
-                openFile(file);
-            }
-        }
-    }
-
-    private void openFile(File f) {
-        Task<Void> t = new Task<Void>() {
-            @Override
-            protected Void call() throws DataStoreException {
-                MetadataOverview meta;
-                DataStore ds = DataStores.open(f.getAbsolutePath());
-                meta = new MetadataOverview(new DefaultMetadata(ds.getMetadata()), f.getAbsolutePath());
-                return null;
-            }
-        };
-        t.setOnSucceeded(ac -> {
-            Label label = new Label(f.getName());
-            label.setId(f.getAbsolutePath());
-            if (labToTrv.contains(f.getAbsolutePath())) {
-                for (Label elem : labelToItem.keySet()) {
-                    if (elem.getId().equals(f.getAbsolutePath())) {
-                        Event.fireEvent(elem, new MouseEvent(MouseEvent.MOUSE_CLICKED, 0, 0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true, true, true, true, true, true, true, null));
-                    }
-                }
-            } else {
-                setOnClick(label);
-                TreeItem<Label> tItem = new TreeItem<>(label);
-                labelToItem.put(label, tItem);
-                labToTrv.add(f.getAbsolutePath());
-                root.getChildren().add(tItem);
-            }
-        });
-        t.setOnFailed(ac -> {
-            final Alert alert = new Alert(Alert.AlertType.ERROR);
-            alert.setTitle("An error was occur");
-            Label lab = new Label(t.getException().getMessage());
-            lab.setWrapText(true);
-            lab.setMaxWidth(650);
-            VBox vb = new VBox();
-            vb.getChildren().add(lab);
-            alert.getDialogPane().setContent(vb);
-            alert.show();
-        });
-        final Thread thread = new Thread(t);
-        thread.setDaemon(true);
-        thread.start();
-    }
-
-    // For the directory, the methods "setOnClick" and "addContextMenu" are redefine inside.
-    private void openDirectory(File firstFile) {
-        if (!labToTrv.contains("[Aggregate] " + firstFile.getName())) {
-            DataStore resource = null;
-            try {
-                resource = FolderStoreProvider.INSTANCE.open(new StorageConnector(firstFile));
-            } catch (DataStoreException ex) {
-                ex.getMessage();                    // TODO: needs better handling.
-            }
-            if (resource instanceof Aggregate) {
-                parent = new Label("[Aggregate] " + firstFile.getName());
-                parent.setId(firstFile.getAbsolutePath());
-                Label cl = parent;
-                parent.setOnMouseClicked(click -> {
-                    if (click.getButton() == MouseButton.SECONDARY) {
-                        parent = cl;
-                    }
-                });
-                TreeItem<Label> ti = new TreeItem<>(parent);
-
-                MenuItem close = new MenuItem("Close");
-                close.setOnAction(ac -> {
-                    root.getChildren().remove(labelToItem.get(cl));
-                    labelToItem.remove(cl);
-                    labToTrv.remove(parent.getText());
-                    final Object content = getContent();
-                    if (content != null && content instanceof FeatureTable) {
-                        pane.getItems().remove(1);
-                    }
-                    if (content != null && content instanceof MetadataOverview) {
-                        if (parent.getId().equals(((MetadataOverview) content).fromFile)) {
-                            setContent(new Label("   Please choose a file to open   "));
-                        }
-                    }
-                });
-                ContextMenu cm = new ContextMenu(close);
-                parent.setContextMenu(cm);
-
-                try {
-                    for (Resource res : ((Aggregate) resource).components()) {
-                        Label lab = new Label(res.toString());
-                        lab.setOnMouseClicked(click -> {
-                            if (click.getButton() == MouseButton.PRIMARY) {
-                                if (sauvLabel != null) {
-                                    sauvLabel.setTextFill(Color.BLACK);
-                                }
-                                addMetadatPanel(res, cl.getId());
-                                sauvLabel = lab;
-                                lab.setTextFill(Color.RED);
-                            }
-                        });
-                        TreeItem<Label> tiChild = new TreeItem<>(lab);
-                        ti.getChildren().add(tiChild);
-                    }
-                } catch (DataStoreException ex) {
-                    final Alert alert = new Alert(Alert.AlertType.ERROR);
-                    alert.setTitle("An error was occur");
-                    Label lab = new Label(ex.getMessage());
-                    lab.setWrapText(true);
-                    lab.setMaxWidth(650);
-                    VBox vb = new VBox();
-                    vb.getChildren().add(lab);
-                    alert.getDialogPane().setContent(vb);
-                    alert.show();
-                }
-                root.getChildren().add(ti);
-                labToTrv.add(parent.getText());
-                labelToItem.put(parent, ti);
-            }
-        } else {                                                // If the file is already open.
-            if (sauvLabel != null) {
-                sauvLabel.setTextFill(Color.BLACK);
-            }
-            root.getChildren().forEach(elem -> {
-                if (elem.getValue().getText().equals("[Aggregate] " + firstFile.getName())) {
-                    sauvLabel = elem.getValue();
-                    elem.getValue().setTextFill(Color.RED);
-                }
-            });
-            setContent(new Label("   Please choose a file to open   "));
-        }
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSButton.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSButton.java
deleted file mode 100644
index b953613..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSButton.java
+++ /dev/null
@@ -1,79 +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.sis.gui.referencing;
-
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import javafx.scene.control.Button;
-import javafx.scene.image.ImageView;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-
-/**
- * Widget button used to select a {@link CoordinateReferenceSystem}.
- *
- *
- * @author Johann Sorel (Geomatys)
- * @version 0.8
- * @since   0.8
- * @module
- */
-public class CRSButton extends Button{
-
-    private final ObjectProperty<CoordinateReferenceSystem> crsProperty = new SimpleObjectProperty<>();
-
-    /**
-     * Create a new CRSButton with no {@link CoordinateReferenceSystem} defined.
-     */
-    public CRSButton() {
-        setText("-");
-
-        setOnAction(new EventHandler<ActionEvent>() {
-            @Override
-            public void handle(ActionEvent event) {
-                final CoordinateReferenceSystem crs = CRSChooser.showDialog(CRSButton.this, crsProperty.get());
-                crsProperty.set(crs);
-            }
-        });
-
-        //update button text when needed
-        crsProperty.addListener((ObservableValue<? extends CoordinateReferenceSystem> observable,
-                CoordinateReferenceSystem oldValue, CoordinateReferenceSystem newValue) -> {
-            if (newValue!=null) {
-                setText(newValue.getName().toString());
-                setGraphic(new ImageView(CRSTable.getIcon(newValue)));
-            } else {
-                setText(" - ");
-                setGraphic(null);
-            }
-        });
-    }
-
-    /**
-     * Returns the property containing the edited {@link CoordinateReferenceSystem}.
-     * This property can be modified and will send events.
-     * It can be used with JavaFx binding operations.
-     *
-     * @return Property containing the edited {@link CoordinateReferenceSystem}
-     */
-    public ObjectProperty<CoordinateReferenceSystem> crsProperty() {
-        return crsProperty;
-    }
-
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSChooser.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSChooser.java
deleted file mode 100644
index 690bf5b..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSChooser.java
+++ /dev/null
@@ -1,116 +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.sis.gui.referencing;
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.fxml.FXML;
-import javafx.scene.control.Alert;
-import javafx.scene.control.ButtonType;
-import javafx.scene.control.DialogPane;
-import javafx.scene.control.TextField;
-import javafx.scene.input.KeyEvent;
-import javafx.scene.layout.BorderPane;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.apache.sis.internal.gui.FXUtilities;
-
-
-/**
- * A list of Coordinate Reference Systems (CRS) from which the user can select.
- *
- * @author  Johann Sorel (Geomatys)
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class CRSChooser extends BorderPane {
-
-    @FXML
-    private BorderPane uiPane;
-
-    @FXML
-    private TextField uiSearch;
-
-    private CRSTable uiTable;
-
-    private final ObjectProperty<CoordinateReferenceSystem> crsProperty = new SimpleObjectProperty<>();
-    private boolean updateText;
-
-    /**
-     * Create a new CRSChooser with no {@link CoordinateReferenceSystem} defined.
-     */
-    public CRSChooser() {
-        try {
-            FXUtilities.loadJRXML(this, CRSChooser.class);
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
-        }
-        uiSearch.addEventHandler(KeyEvent.KEY_PRESSED, (KeyEvent event) -> {
-            if (updateText) return;
-            uiTable.searchCRS(uiSearch.getText());
-        });
-
-        uiTable = new CRSTable();
-        uiPane.setCenter(uiTable);
-
-        uiTable.crsProperty().bindBidirectional(crsProperty);
-
-        crsProperty.addListener((ObservableValue<? extends CoordinateReferenceSystem> observable,
-                              CoordinateReferenceSystem oldValue, CoordinateReferenceSystem newValue) -> {
-            uiTable.crsProperty().set(newValue);
-            if (newValue != null) {
-                updateText = true;
-                uiSearch.setText(newValue.getName().toString());
-                updateText = false;
-            }
-        });
-    }
-
-    /**
-     * Returns the property containing the edited {@link CoordinateReferenceSystem}.
-     * This property can be modified and will send events.
-     * It can be used with JavaFx binding operations.
-     *
-     * @return Property containing the edited {@link CoordinateReferenceSystem}
-     */
-    public ObjectProperty<CoordinateReferenceSystem> crsProperty(){
-        return crsProperty;
-    }
-
-    /**
-     * Show a modal dialog to select a {@link CoordinateReferenceSystem}.
-     *
-     * @param parent parent frame of widget.
-     * @param crs {@link CoordinateReferenceSystem} to edit.
-     * @return modified {@link CoordinateReferenceSystem}.
-     */
-    public static CoordinateReferenceSystem showDialog(Object parent, CoordinateReferenceSystem crs) {
-        final CRSChooser chooser = new CRSChooser();
-        chooser.crsProperty.set(crs);
-        final Alert alert = new Alert(Alert.AlertType.NONE);
-        final DialogPane pane = alert.getDialogPane();
-        pane.setContent(chooser);
-        alert.getButtonTypes().setAll(ButtonType.OK,ButtonType.CANCEL);
-        alert.setResizable(true);
-        final ButtonType res = alert.showAndWait().orElse(ButtonType.CANCEL);
-        return res == ButtonType.CANCEL ? null : chooser.crsProperty.get();
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSTable.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSTable.java
deleted file mode 100644
index 33db6d6..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/CRSTable.java
+++ /dev/null
@@ -1,349 +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.sis.gui.referencing;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import javafx.application.Platform;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.collections.FXCollections;
-import javafx.collections.ListChangeListener;
-import javafx.collections.ObservableList;
-import javafx.event.EventHandler;
-import javafx.geometry.Insets;
-import javafx.scene.control.Label;
-import javafx.scene.control.ProgressIndicator;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.SelectionMode;
-import javafx.scene.control.TableCell;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TablePosition;
-import javafx.scene.control.TableView;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.Background;
-import javafx.scene.layout.BackgroundFill;
-import javafx.scene.layout.CornerRadii;
-import javafx.util.Callback;
-import org.apache.sis.internal.gui.FontGlyphs;
-import org.apache.sis.internal.gui.FXUtilities;
-import org.apache.sis.io.wkt.FormattableObject;
-import org.apache.sis.metadata.iso.citation.Citations;
-import org.apache.sis.util.resources.Vocabulary;
-import org.opengis.referencing.IdentifiedObject;
-import org.opengis.referencing.crs.CRSAuthorityFactory;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.crs.GeographicCRS;
-import org.opengis.referencing.crs.ProjectedCRS;
-import org.opengis.referencing.operation.ConicProjection;
-import org.opengis.referencing.operation.CylindricalProjection;
-import org.opengis.referencing.operation.PlanarProjection;
-import org.opengis.referencing.operation.Projection;
-import org.opengis.util.FactoryException;
-
-/**
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-final class CRSTable extends ScrollPane {
-
-    private static final Color COLOR = new Color(30, 150, 250);
-    private static final Image ICON_GEO, ICON_SQUARE, ICON_STEREO, ICON_UTM, ICON_CONIC;
-    private static final Image ICON_UNKNOWN = FontGlyphs.createImage("\uE22F",16,COLOR);
-    static {
-        final Class<?> c = CRSTable.class;
-        final Dimension dim = new Dimension(16, 16);
-        try {
-            ICON_GEO    = FXUtilities.getImage(c, "proj_geo.png",    dim);
-            ICON_SQUARE = FXUtilities.getImage(c, "proj_square.png", dim);
-            ICON_STEREO = FXUtilities.getImage(c, "proj_stereo.png", dim);
-            ICON_UTM    = FXUtilities.getImage(c, "proj_utm.png",    dim);
-            ICON_CONIC  = FXUtilities.getImage(c, "proj_conic.png",  dim);
-        } catch (IOException e) {
-            throw new ExceptionInInitializerError(e);
-        }
-    }
-
-    private final ObjectProperty<CoordinateReferenceSystem> crsProperty = new SimpleObjectProperty<>();
-    private final TableView<Code> uiTable = new TableView<>();
-
-    private List<Code> allValues;
-
-    public CRSTable(){
-        uiTable.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
-        setContent(uiTable);
-        setFitToHeight(true);
-        setFitToWidth(true);
-
-        //add a loader while we load datas
-        final ProgressIndicator loading = new ProgressIndicator();
-        loading.setMaxWidth(60);
-        loading.setMaxHeight(60);
-        loading.setBackground(new Background(new BackgroundFill(new javafx.scene.paint.Color(0, 0, 0, 0), CornerRadii.EMPTY, Insets.EMPTY)));
-        loading.setProgress(-1);
-        uiTable.setPlaceholder(loading);
-        uiTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
-        uiTable.setTableMenuButtonVisible(false);
-
-        uiTable.getSelectionModel().getSelectedCells().addListener(new ListChangeListener<TablePosition>() {
-            @Override
-            public void onChanged(ListChangeListener.Change<? extends TablePosition> c) {
-                final ObservableList<TablePosition> cells = uiTable.getSelectionModel().getSelectedCells();
-                if (!cells.isEmpty()) {
-                    final TablePosition cell = cells.get(0);
-                    final Code code = uiTable.getItems().get(cell.getRow());
-                    try {
-                        crsProperty.set((CoordinateReferenceSystem) code.createObject());
-                    } catch (FactoryException ex) {
-                        error(ex);
-                    }
-                }
-            }
-        });
-
-        uiTable.getColumns().add(new TypeColumn());
-        uiTable.getColumns().add(new CodeColumn());
-        uiTable.getColumns().add(new DescColumn());
-        uiTable.getColumns().add(new WKTColumn());
-
-
-        //load list
-        new Thread(){
-            @Override
-            public void run() {
-                try {
-                    allValues = getCodes();
-                    Platform.runLater(() -> {
-                        uiTable.setItems(FXCollections.observableArrayList(allValues));
-                        uiTable.setPlaceholder(new Label(""));
-                    });
-                } catch (FactoryException ex) {
-                    error(ex);
-                }
-            }
-        }.start();
-    }
-
-    public ObjectProperty<CoordinateReferenceSystem> crsProperty(){
-        return crsProperty;
-    }
-
-    public void searchCRS(final String searchword){
-        filter(searchword);
-    }
-
-    private static void error(final Exception e) {
-        // TODO
-    }
-
-    /**
-     * Display only the CRS name that contains the specified keywords. The {@code keywords}
-     * argument is a space-separated list, usually provided by the user after he pressed the
-     * "Search" button.
-     *
-     * @param keywords space-separated list of keywords to look for.
-     */
-    private void filter(String keywords) {
-        List<Code> model = allValues;
-        if (keywords != null) {
-            final Locale locale = Locale.getDefault();
-            keywords = keywords.toLowerCase(locale).trim();
-            final String[] tokens = keywords.split("\\s+");
-            if (tokens.length != 0) {
-                model = new ArrayList<>();
-                scan:
-                for (Code code : allValues) {
-                    final String name = code.toString().toLowerCase(locale);
-                    for (int j=0; j<tokens.length; j++) {
-                        if (!name.contains(tokens[j])) {
-                            continue scan;
-                        }
-                    }
-                    model.add(code);
-                }
-            }
-        }
-        uiTable.getItems().setAll(model);
-    }
-
-    /**
-     * Returns a collection containing only the factories of the specified authority.
-     */
-    private static Collection<CRSAuthorityFactory> filter(
-            final Collection<? extends CRSAuthorityFactory> factories, final String authority){
-        final List<CRSAuthorityFactory> filtered = new ArrayList<>();
-        for (final CRSAuthorityFactory factory : factories) {
-            if (Citations.identifierMatches(factory.getAuthority(), authority)) {
-                filtered.add(factory);
-            }
-        }
-        return filtered;
-    }
-
-    private List<Code> getCodes() throws FactoryException{
-        final CRSAuthorityFactory factory = org.apache.sis.referencing.CRS.getAuthorityFactory(null);
-        final Set<String> strs = factory.getAuthorityCodes(CoordinateReferenceSystem.class);
-        final List<Code> codes = new ArrayList<>();
-        for (String str : strs) {
-            codes.add(new Code(factory, str));
-        }
-        return codes;
-    }
-
-    static Image getIcon(IdentifiedObject obj) {
-        Image icon = ICON_UNKNOWN;
-        if (obj instanceof GeographicCRS) {
-            icon = ICON_GEO;
-        } else if (obj instanceof ProjectedCRS) {
-            final ProjectedCRS pcrs = (ProjectedCRS) obj;
-            final Projection proj = pcrs.getConversionFromBase();
-
-            if (String.valueOf(proj.getName()).toLowerCase().contains("utm")) {
-                icon = ICON_UTM;
-            } else if (proj instanceof ConicProjection) {
-                icon = ICON_CONIC;
-            } else if (proj instanceof CylindricalProjection) {
-                icon = ICON_SQUARE;
-            } else if (proj instanceof PlanarProjection) {
-                icon = ICON_STEREO;
-            } else {
-                icon = ICON_SQUARE;
-            }
-        } else {
-            icon = ICON_SQUARE;
-        }
-        return icon;
-    }
-
-    private static class TypeColumn extends TableColumn<Code, Code> {
-
-        public TypeColumn() {
-            setEditable(false);
-            setPrefWidth(30);
-            setMinWidth(30);
-            setMaxWidth(30);
-            setCellValueFactory((CellDataFeatures<Code, Code> param) -> new SimpleObjectProperty<>(param.getValue()));
-            setCellFactory(new Callback<TableColumn<Code, Code>, TableCell<Code, Code>>() {
-
-                @Override
-                public TableCell<Code, Code> call(TableColumn<Code, Code> param) {
-                    return new TableCell<Code,Code>(){
-                        @Override
-                        protected void updateItem(Code item, boolean empty) {
-                            super.updateItem(item, empty);
-                            setGraphic(null);
-                            if (item!=null){
-                                Image icon = ICON_UNKNOWN;
-                                try {
-                                    final IdentifiedObject obj = item.createObject();
-                                    icon = getIcon(obj);
-                                } catch (FactoryException ex) {
-                                    error(ex);
-                                }
-                                setGraphic(new ImageView(icon));
-                            }
-                        }
-                    };
-                }
-            });
-        }
-
-    }
-
-    private static class CodeColumn extends TableColumn<Code, String> {
-
-        public CodeColumn() {
-            super(Vocabulary.format(Vocabulary.Keys.Code));
-            setEditable(false);
-            setPrefWidth(150);
-            setCellValueFactory((TableColumn.CellDataFeatures<Code, String> param) -> new SimpleObjectProperty<>(param.getValue().code));
-        }
-
-    }
-
-    private static class DescColumn extends TableColumn<Code, String> {
-
-        public DescColumn() {
-            super(Vocabulary.format(Vocabulary.Keys.Description));
-            setEditable(false);
-            setCellValueFactory((TableColumn.CellDataFeatures<Code, String> param) ->
-                    new SimpleObjectProperty<>(param.getValue().getDescription()));
-        }
-
-    }
-
-    private static class WKTColumn extends TableColumn<Code, Code> {
-
-        private static final Image ICON = FontGlyphs.createImage("\uE873",16,COLOR);
-
-        public WKTColumn() {
-            super("");
-            setEditable(false);
-            setPrefWidth(26);
-            setMinWidth(26);
-            setMaxWidth(26);
-            setCellValueFactory((CellDataFeatures<Code, Code> param) -> new SimpleObjectProperty<>(param.getValue()));
-            setCellFactory(new Callback<TableColumn<Code, Code>, TableCell<Code, Code>>() {
-
-                @Override
-                public TableCell<Code, Code> call(TableColumn<Code, Code> param) {
-                    return new TableCell<Code,Code>() {
-                        {
-                            setOnMouseClicked(new EventHandler<MouseEvent>() {
-                                @Override
-                                public void handle(MouseEvent event) {
-                                    final Code item = getItem();
-                                    if (item!=null) {
-                                        try {
-                                            final IdentifiedObject obj = getItem().createObject();
-                                            if (obj instanceof FormattableObject) {
-                                                WKTPane.showDialog(this, (FormattableObject) obj);
-                                            }
-                                        } catch (FactoryException ex) {
-                                            error(ex);
-                                        }
-                                    }
-                                }
-                            });
-                        }
-
-                        @Override
-                        protected void updateItem(Code item, boolean empty) {
-                            super.updateItem(item, empty);
-                            if (item !=null && !empty) {
-                                setGraphic(new ImageView(ICON));
-                            } else {
-                                setGraphic(null);
-                            }
-                        }
-                    };
-                }
-            });
-        }
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/Code.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/Code.java
deleted file mode 100644
index 59676d3..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/Code.java
+++ /dev/null
@@ -1,89 +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.sis.gui.referencing;
-
-import org.opengis.referencing.AuthorityFactory;
-import org.opengis.referencing.IdentifiedObject;
-import org.opengis.util.FactoryException;
-
-
-/**
- * Stores the code of a coordinate reference system (CRS) together with its description.
- * The description will be fetched when first needed and returned by {@link #toString()}.
- *
- * @author  Martin Desruisseaux (Geomatys)
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-final class Code {
-    /**
-     * The CRS code. Usually defined by EPSG, but other authorities are allowed.
-     */
-    final String code;
-
-    /**
-     * The CRS object description for the {@linkplain #code}, fetched when first needed.
-     * In Apache SIS implementation of EPSG factory, this is the CRS name.
-     */
-    private String name;
-
-    /**
-     * The authority factory to use for fetching the name. Will be set to {@code null} after
-     * {@linkplain #name} has been made available, in order to allow the garbage collector
-     * to do its work if possible.
-     */
-    private final AuthorityFactory factory;
-
-    /**
-     * Creates a code from the specified value.
-     */
-    Code(final AuthorityFactory factory, final String code) {
-        this.factory = factory;
-        this.code    = code;
-    }
-
-    /**
-     * Create the Object identified by code.
-     */
-    IdentifiedObject createObject() throws FactoryException{
-        return factory.createObject(code);
-    }
-
-    /**
-     * Returns a description of the object.
-     */
-    public String getDescription() {
-        if (name == null) try {
-            name = factory.getDescriptionText(code).toString();
-        } catch (FactoryException e) {
-            name = e.getLocalizedMessage();
-        }
-        return name;
-    }
-
-    /**
-     * Returns the name for this code.
-     *
-     * @todo Maybe we should use the widget Locale when invoking InternationalString.toString(...).
-     */
-    @Override
-    public String toString() {
-        return code + " - " + getDescription();
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/WKTPane.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/WKTPane.java
deleted file mode 100644
index b984d4c..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/WKTPane.java
+++ /dev/null
@@ -1,68 +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.sis.gui.referencing;
-
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
-import javafx.scene.control.Alert;
-import javafx.scene.control.ButtonType;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.DialogPane;
-import javafx.scene.control.TextArea;
-import javafx.scene.layout.BorderPane;
-import org.apache.sis.io.wkt.Convention;
-import org.apache.sis.io.wkt.FormattableObject;
-
-
-/**
- * Small panel to display an object as WKT in various conventions.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-final class WKTPane extends BorderPane {
-
-    private final ChoiceBox<Convention> choice = new ChoiceBox<>(FXCollections.observableArrayList(Convention.values()));
-    private final TextArea text = new TextArea();
-
-    public WKTPane(final FormattableObject obj) {
-        setTop(choice);
-        setCenter(text);
-
-        choice.valueProperty().addListener(new ChangeListener<Convention>() {
-            @Override
-            public void changed(ObservableValue<? extends Convention> observable, Convention oldValue, Convention newValue) {
-                text.setText(obj.toString(newValue));
-            }
-        });
-        choice.getSelectionModel().select(Convention.WKT1);
-    }
-
-    public static void showDialog(Object parent, FormattableObject candidate){
-        final WKTPane chooser = new WKTPane(candidate);
-
-        final Alert alert = new Alert(Alert.AlertType.NONE);
-        final DialogPane pane = alert.getDialogPane();
-        pane.setContent(chooser);
-        alert.getButtonTypes().setAll(ButtonType.OK);
-        alert.setResizable(true);
-        alert.showAndWait();
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FXUtilities.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FXUtilities.java
deleted file mode 100644
index 500c0b3..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FXUtilities.java
+++ /dev/null
@@ -1,91 +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.sis.internal.gui;
-
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import javax.imageio.ImageIO;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.image.Image;
-import javafx.embed.swing.SwingFXUtils;
-
-
-/**
- * JavaFX utilities for internal purpose only.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public final class FXUtilities {
-    /**
-     * Do not allow instantiation of this class.
-     */
-    private FXUtilities() {
-    }
-
-    /**
-     * Loads an image and resizes it to requested size.
-     *
-     * @param  loader  the class to use for loading the image.
-     * @param  path    path to image in the jar, relative to the {@code loader} class.
-     * @param  resize  the desired size, or {@code null} for no resizing.
-     * @return image resized to the given dimension.
-     * @throws IOException if the image can not be loaded.
-     *
-     * @deprecated we need a mechanism without dependency to AWT.
-     */
-    @Deprecated
-    public static Image getImage(final Class<?> loader, final String path, final Dimension resize) throws IOException {
-        BufferedImage img = ImageIO.read(loader.getResourceAsStream(path));
-        if (resize != null) {
-            final BufferedImage resized = new BufferedImage(resize.width, resize.height, BufferedImage.TYPE_INT_ARGB);
-            final Graphics2D g = resized.createGraphics();
-            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
-            g.drawImage(img, 0, 0, resize.width, resize.height, null);
-            g.dispose();
-            img = resized;
-        }
-        return SwingFXUtils.toFXImage(img, null);
-    }
-
-    /**
-     * Loads and initializes widget from JRXML definition provided in this module.
-     * The JRXML file shall be in the same package than the given {@code loader} class
-     * and have the same simple name followed by the {@code ".fxml"} extension.
-     *
-     * @param  target  the widget for which to load the JRXML file.
-     * @param  loader  the class to use for loading the file.
-     * @throws IOException if an error occurred while loading the JRXML file.
-     */
-    public static void loadJRXML(final Parent target, final Class<?> loader) throws IOException {
-        final FXMLLoader fxl = new FXMLLoader(loader.getResource(loader.getSimpleName() + ".fxml"), Resources.getInstance());
-        fxl.setRoot(target);
-        fxl.setController(target);
-        /*
-         * In some environements like OSGi, we must use the class loader of the widget
-         * (not the class loader of FXMLLoader).
-         */
-        fxl.setClassLoader(loader.getClassLoader());
-        fxl.load();
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FontGlyphs.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FontGlyphs.java
deleted file mode 100644
index 154e572..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FontGlyphs.java
+++ /dev/null
@@ -1,143 +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.sis.internal.gui;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.LinearGradientPaint;
-import java.awt.RenderingHints;
-import java.awt.geom.RoundRectangle2D;
-import java.awt.image.BufferedImage;
-import java.io.InputStream;
-import javafx.embed.swing.SwingFXUtils;
-import javafx.scene.image.Image;
-import org.apache.sis.util.ArgumentChecks;
-
-
-/**
- * Internal image tool to generate icons for javafx widgets.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- *
- * @deprecated This introduces a dependency to AWT, which we wish to avoid at this early stage.
- */
-@Deprecated
-public final class FontGlyphs {
-
-    private static Font FONT;
-
-    static {
-        try {
-            InputStream is = FontGlyphs.class.getResourceAsStream("/META-INF/resources/webjars/material-design-icons/3.0.1/MaterialIcons-Regular.ttf");
-            FONT = Font.createFont(Font.TRUETYPE_FONT, is);
-        } catch (Exception ex) {
-            ex.printStackTrace();
-            System.err.println("Font not loaded.  Using serif font.");
-            FONT = new Font("serif", Font.PLAIN, 24);
-        }
-    }
-
-    private FontGlyphs() {
-    }
-
-    /**
-     * Create a image icon from glyph code and color.
-     *
-     * @param text glyph codes
-     * @param size output image size
-     * @param textColor glyph color
-     * @return glyph image
-     */
-    public static Image createImage(String text, float size, Color textColor) {
-        return SwingFXUtils.toFXImage(createImage(text, textColor, FONT.deriveFont(size), null, null, true, false),null);
-    }
-
-    private static BufferedImage createImage(String text, Color textColor, Font font, Color bgColor, Insets insets, final boolean squareWanted, final boolean removeLeading) {
-        ArgumentChecks.ensureNonEmpty("Text to draw", text);
-        ArgumentChecks.ensureNonNull("Font to use", text);
-        if (insets == null) {
-            insets = new Insets(0, 0, 0, 0);
-        }
-
-        final int border = 0;
-        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
-        Graphics2D g = img.createGraphics();
-        final FontMetrics fm = g.getFontMetrics(font);
-        final int textSize = fm.stringWidth(text);
-
-        int width = textSize + border * 2 + insets.left + insets.right;
-        int height = fm.getHeight() + border * 2 + insets.top + insets.bottom;
-        if (removeLeading) {
-            height -= fm.getLeading();
-        }
-
-        // We want a square. We compute additional margin to draw icon and text in center of thee square.
-        final int additionalLeftInset;
-        final int additionalTopInset;
-        if (squareWanted) {
-            final int tmpWidth = width;
-            width = Math.max(width, height);
-            additionalLeftInset = (width - tmpWidth) / 2;
-
-            final int tmpHeight = height;
-            height = Math.max(width, height);
-            additionalTopInset = (height - tmpHeight) / 2;
-        } else {
-            additionalLeftInset = 0;
-            additionalTopInset = 0;
-        }
-
-        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        g = img.createGraphics();
-        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-        final RoundRectangle2D rect = new RoundRectangle2D.Double(0, 0, width - 1, img.getHeight() - 1, border, border);
-
-        if (bgColor != null) {
-            final Color brighter = new Color(
-                    Math.min(255, bgColor.getRed() + 100),
-                    Math.min(255, bgColor.getGreen() + 100),
-                    Math.min(255, bgColor.getBlue() + 100));
-
-            final LinearGradientPaint gradiant = new LinearGradientPaint(0, 0, 0, height, new float[]{0, 1}, new Color[]{brighter, bgColor});
-
-            g.setPaint(gradiant);
-            g.fill(rect);
-        }
-        int x = border + insets.left + additionalLeftInset;
-
-        //draw text
-        if (textColor != null) {
-            g.setColor(textColor);
-        }
-        g.setFont(font);
-        g.drawString(text, x, fm.getAscent() + border + insets.top + additionalTopInset);
-
-        if (bgColor != null) {
-            //draw border
-            g.setColor(Color.BLACK);
-            g.draw(rect);
-        }
-        return img;
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
deleted file mode 100644
index 678d1d9..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
+++ /dev/null
@@ -1,168 +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.sis.internal.gui;
-
-import java.net.URL;
-import java.util.MissingResourceException;
-import javax.annotation.processing.Generated;
-import org.apache.sis.util.resources.KeyConstants;
-import org.apache.sis.util.resources.IndexedResourceBundle;
-
-
-/**
- * Messages that are specific to the {@code sis-javafx} module.
- * Resources in this file should not be used by any other module. For resources shared by
- * all modules in the Apache SIS project, see {@link org.apache.sis.util.resources} package.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public final class Resources extends IndexedResourceBundle {
-    /**
-     * Resource keys. This class is used when compiling sources, but no dependencies to
-     * {@code Keys} should appear in any resulting class files. Since the Java compiler
-     * inlines final integer values, using long identifiers will not bloat the constant
-     * pools of compiled classes.
-     */
-    @Generated("org.apache.sis.util.resources.IndexedResourceCompiler")
-    public static final class Keys extends KeyConstants {
-        /**
-         * The unique instance of key constants handler.
-         */
-        static final Keys INSTANCE = new Keys();
-
-        /**
-         * For {@link #INSTANCE} creation only.
-         */
-        private Keys() {
-        }
-
-        /**
-         * All files
-         */
-        public static final short AllFiles = 3;
-
-        /**
-         * Coordinate Reference Systems
-         */
-        public static final short CRSs = 1;
-
-        /**
-         * Geospatial data files
-         */
-        public static final short GeospatialFiles = 4;
-
-        /**
-         * Open data file
-         */
-        public static final short OpenDataFile = 2;
-    }
-
-    /**
-     * Constructs a new resource bundle loading data from the given UTF file.
-     *
-     * @param resources  the path of the binary file containing resources, or {@code null} if
-     *        there is no resources. The resources may be a file or an entry in a JAR file.
-     */
-    public Resources(final URL resources) {
-        super(resources);
-    }
-
-    /**
-     * Returns the handle for the {@code Keys} constants.
-     *
-     * @return a handler for the constants declared in the inner {@code Keys} class.
-     */
-    @Override
-    protected KeyConstants getKeyConstants() {
-        return Keys.INSTANCE;
-    }
-
-    /**
-     * Returns resources in the default locale.
-     *
-     * @return resources in the default locale.
-     * @throws MissingResourceException if resources can not be found.
-     */
-    public static Resources getInstance() throws MissingResourceException {
-        return getBundle(Resources.class, null);
-    }
-
-    /**
-     * Gets a string for the given key from this resource bundle or one of its parents.
-     *
-     * @param  key  the key for the desired string.
-     * @return the string for the given key.
-     * @throws MissingResourceException if no object for the given key can be found.
-     */
-    public static String format(final short key) throws MissingResourceException {
-        return getInstance().getString(key);
-    }
-
-    /**
-     * Gets a string for the given key and replaces all occurrence of "{0}"
-     * with value of {@code arg0}.
-     *
-     * @param  key   the key for the desired string.
-     * @param  arg0  value to substitute to "{0}".
-     * @return the formatted string for the given key.
-     * @throws MissingResourceException if no object for the given key can be found.
-     */
-    public static String format(final short  key,
-                                final Object arg0) throws MissingResourceException
-    {
-        return getInstance().getString(key, arg0);
-    }
-
-    /**
-     * Gets a string for the given key and replaces all occurrence of "{0}",
-     * "{1}", with values of {@code arg0}, {@code arg1}.
-     *
-     * @param  key   the key for the desired string.
-     * @param  arg0  value to substitute to "{0}".
-     * @param  arg1  value to substitute to "{1}".
-     * @return the formatted string for the given key.
-     * @throws MissingResourceException if no object for the given key can be found.
-     */
-    public static String format(final short  key,
-                                final Object arg0,
-                                final Object arg1) throws MissingResourceException
-    {
-        return getInstance().getString(key, arg0, arg1);
-    }
-
-    /**
-     * Gets a string for the given key and replaces all occurrence of "{0}",
-     * "{1}", with values of {@code arg0}, {@code arg1}, etc.
-     *
-     * @param  key   the key for the desired string.
-     * @param  arg0  value to substitute to "{0}".
-     * @param  arg1  value to substitute to "{1}".
-     * @param  arg2  value to substitute to "{2}".
-     * @return the formatted string for the given key.
-     * @throws MissingResourceException if no object for the given key can be found.
-     */
-    public static String format(final short  key,
-                                final Object arg0,
-                                final Object arg1,
-                                final Object arg2) throws MissingResourceException
-    {
-        return getInstance().getString(key, arg0, arg1, arg2);
-    }
-}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
deleted file mode 100644
index 630609c..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
+++ /dev/null
@@ -1,26 +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.
-#
-
-#
-# Resources in this file are for "sis-javafx" usage only and should not be used by any other module.
-# For resources shared by all modules in the Apache SIS project, see "org.apache.sis.util.resources" package.
-#
-
-AllFiles          = All files
-CRSs              = Coordinate Reference Systems
-GeospatialFiles   = Geospatial data files
-OpenDataFile      = Open data file
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
deleted file mode 100644
index 9d73d9c..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
+++ /dev/null
@@ -1,31 +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.
-#
-
-#
-# Resources in this file are for "sis-javafx" usage only and should not be used by any other module.
-# For resources shared by all modules in the Apache SIS project, see "org.apache.sis.util.resources" package.
-#
-# Punctuation rules in French (source: http://unicode.org/udhr/n/notes_fra.html)
-#
-#   U+202F NARROW NO-BREAK SPACE  before  ; ! and ?
-#   U+00A0 NO-BREAK SPACE         before  :
-#
-
-AllFiles          = Tous les fichiers
-CRSs              = Syst\u00e8mes de r\u00e9f\u00e9rence des coordonn\u00e9es
-GeospatialFiles   = Fichiers de donn\u00e9es g\u00e9ospatiales
-OpenDataFile      = Ouvrir un fichier de donn\u00e9es
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/package-info.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/package-info.java
deleted file mode 100644
index 673060f..0000000
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/package-info.java
+++ /dev/null
@@ -1,31 +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.
- */
-
-/**
- * A set of helper classes for the SIS implementation.
- *
- * <STRONG>Do not use!</STRONG>
- *
- * This package is for internal use by SIS only. Classes in this package
- * may change in incompatible ways in any future version without notice.
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-package org.apache.sis.internal.gui;
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/metadata/WorldMap360x180.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/metadata/WorldMap360x180.png
deleted file mode 100644
index dd5cf6b..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/metadata/WorldMap360x180.png and /dev/null differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/CRSChooser.fxml b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/CRSChooser.fxml
deleted file mode 100644
index 7401b15..0000000
--- a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/CRSChooser.fxml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<?import javafx.geometry.*?>
-<?import java.lang.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-
-<fx:root maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" type="BorderPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
-  <top>
-    <GridPane hgap="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" vgap="10.0" BorderPane.alignment="CENTER">
-      <columnConstraints>
-        <ColumnConstraints hgrow="NEVER" />
-        <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" />
-        <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" prefWidth="100.0" />
-      </columnConstraints>
-      <rowConstraints>
-        <RowConstraints vgrow="NEVER" />
-        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="NEVER" />
-        <RowConstraints vgrow="NEVER" />
-      </rowConstraints>
-      <children>
-        <Label styleClass="property-key" text="%CRSs" GridPane.rowSpan="2" />
-        <TextField fx:id="uiSearch" GridPane.columnSpan="3" GridPane.rowIndex="2" />
-       </children>
-    </GridPane>
-  </top>
-  <center>
-    <BorderPane fx:id="uiPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" BorderPane.alignment="CENTER" />
-  </center>
-</fx:root>
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_conic.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_conic.png
deleted file mode 100644
index a062e1f..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_conic.png and /dev/null differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_geo.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_geo.png
deleted file mode 100644
index 6f9340c..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_geo.png and /dev/null differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_square.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_square.png
deleted file mode 100644
index 6e21c43..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_square.png and /dev/null differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_stereo.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_stereo.png
deleted file mode 100644
index d22f575..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_stereo.png and /dev/null differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_utm.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_utm.png
deleted file mode 100644
index d04a803..0000000
Binary files a/application/sis-javafx/src/main/resources/org/apache/sis/gui/referencing/proj_utm.png and /dev/null differ
diff --git a/application/sis-javafx/src/test/java/org/apache/sis/test/suite/package-info.txt b/application/sis-javafx/src/test/java/org/apache/sis/test/suite/package-info.txt
deleted file mode 100644
index ac895b5..0000000
--- a/application/sis-javafx/src/test/java/org/apache/sis/test/suite/package-info.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Different modules provide classes in this package - be careful about collisions.
-This package is initially defined by the sis-utility module, which also provides
-the package-info.java file.
diff --git a/application/sis-webapp/pom.xml b/application/sis-webapp/pom.xml
deleted file mode 100644
index 324f6bc..0000000
--- a/application/sis-webapp/pom.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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 xmlns              = "http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi          = "http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
-                               http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sis</groupId>
-    <artifactId>application</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-  <groupId>org.apache.sis.application</groupId>
-  <artifactId>sis-webapp</artifactId>
-  <packaging>war</packaging>
-  <name>Apache SIS web services layer</name>
-  <url>http://sis.apache.org</url>
-
-  <dependencies>
-    <dependency>
-      <groupId>javax</groupId>
-      <artifactId>javaee-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.geonames</groupId>
-      <artifactId>georss-rome</artifactId>
-      <version>0.9.8</version>
-      <!-- We have to specify the version here because georss-rome is intentionally excluded from
-           the dependency management of the root pom.xml. The problem is that the artifact filename
-           is "georss-rome", but the <artifactId> element in its pom.xml declares "georss" without
-           the "-rome" suffix, which causes some environments to complain about this inconsistency.
-           Omitting the declaration from the root pom.xml limits the inconvenience to this "sis-webapp"
-           module only. -->
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>reserve-ports</id>
-            <phase>pre-integration-test</phase>
-            <goals>
-              <goal>reserve-network-port</goal>
-            </goals>
-            <configuration>
-              <portNames>
-                <portName>jettyPort</portName>
-                <portName>stopPort</portName>
-              </portNames>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-maven-plugin</artifactId>
-        <configuration>
-          <stopKey>stopJetty</stopKey>
-          <stopPort>${stopPort}</stopPort>
-          <stopWait>4</stopWait>
-        </configuration>
-        <executions>
-          <execution>
-            <id>start-jetty</id>
-            <phase>pre-integration-test</phase>
-            <goals>
-              <goal>start</goal>
-            </goals>
-            <configuration>
-              <httpConnector>
-                <port>${jettyPort}</port>
-              </httpConnector>
-              <scanIntervalSeconds>0</scanIntervalSeconds>
-              <daemon>true</daemon>
-              <systemProperties>
-                <systemProperty>
-                  <name>org.apache.commons.logging.Log</name>
-                  <value>org.apache.commons.logging.impl.Jdk14Logger</value>
-                </systemProperty>
-                <systemProperty>
-                  <name>java.util.logging.config.file</name>
-                  <value>./src/test/resources/logging.properties</value>
-                </systemProperty>
-              </systemProperties>
-            </configuration>
-          </execution>
-          <execution>
-            <id>stop-jetty</id>
-            <phase>post-integration-test</phase>
-            <goals>
-              <goal>stop</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
diff --git a/application/sis-webapp/src/main/java/org/apache/sis/index/tree/GeoRSSData.java b/application/sis-webapp/src/main/java/org/apache/sis/index/tree/GeoRSSData.java
deleted file mode 100644
index e2c3277..0000000
--- a/application/sis-webapp/src/main/java/org/apache/sis/index/tree/GeoRSSData.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.sis.index.tree;
-
-//JDK imports
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.HashMap;
-
-//SIS imports
-import org.apache.sis.geometry.DirectPosition2D;
-
-//ROME imports
-import com.sun.syndication.feed.module.georss.GeoRSSModule;
-import com.sun.syndication.feed.rss.Item;
-
-/**
- * Implements QuadTreeData to store GeoRSS items into quad tree. Provides
- * methods to save and load GeoRSS items to and from file.
- *
- */
-public class GeoRSSData implements QuadTreeData {
-
-    private String filename;
-    private DirectPosition2D latLon;
-
-    /**
-     * Creates a GeoRSSData object that stores the name of the file that the
-     * entry's information is written to and the geo location of the entry.
-     *
-     * @param filename
-     *            filename where rss entry's info is stored
-     * @param latLon
-     *            geo location of the entry
-     */
-    public GeoRSSData(String filename, DirectPosition2D latLon) {
-        this.filename = filename;
-        this.latLon = latLon;
-    }
-
-    /**
-     * Returns the Java 2D x-coordinate for the longitude.
-     *
-     * @return the Java 2D x-coordinate
-     */
-    public double getX() {
-        return latLon.x + 180.0;
-    }
-
-    /**
-     * Returns the Java 2D y-coordinate for the latitude.
-     *
-     * @return the Java 2D y-coordinate
-     */
-    public double getY() {
-        return latLon.y + 90.0;
-    }
-
-
-    /* (non-Javadoc)
-    * @see org.apache.sis.storage.QuadTreeData#getLatLon()
-    */
-    @Override
-    public DirectPosition2D getLatLon() {
-    return this.latLon;
-    }
-
-    /**
-     * Returns the name of the file where the entry's info is saved.
-     *
-     * @return the name of the file where the entry's info is saved
-     */
-    public String getFileName() {
-        return this.filename;
-    }
-
-    /**
-     * Saves the GeoRSS entry to file.
-     *
-     * @param item
-     *            the Item object from Java ROME API containing the GeoRSS entry
-     * @param geoRSSModule
-     *            the Java ROME API GeoRSSModule to parse geo location
-     * @param directory
-     *            the path of the directory in which to save the file
-     */
-    public void saveToFile(Item item, GeoRSSModule geoRSSModule,
-            String directory) {
-      if (!new File(directory).exists()) new File(directory).mkdirs();
-        try {
-            BufferedWriter writer = new BufferedWriter(new FileWriter(directory
-                    + filename));
-            if (item.getTitle() != null) {
-                writer.write("title;" + item.getTitle().replace('\n', ' '));
-                writer.newLine();
-            }
-            if (item.getLink() != null) {
-                writer.write("link;" + item.getLink().replace('\n', ' '));
-                writer.newLine();
-            }
-            if (item.getSource() != null) {
-                writer.write("source;"
-                        + item.getSource().getValue().replace('\n', ' '));
-                writer.newLine();
-            }
-            if (item.getAuthor() != null) {
-                writer.write("author;" + item.getAuthor().replace('\n', ' '));
-                writer.newLine();
-            }
-            if (item.getDescription() != null) {
-                writer.write("description;"
-                        + item.getDescription().getValue().replace('\n', ' '));
-                writer.newLine();
-            }
-            writer.write("pubDate;" + item.getPubDate().toString());
-            writer.newLine();
-            writer.write("lat;" + geoRSSModule.getPosition().getLatitude());
-            writer.newLine();
-            writer.write("lon;" + geoRSSModule.getPosition().getLongitude());
-            writer.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Reads the file that contains the GeoRSS entry's information and returns a
-     * HashMap of key, value pairs where the key is the name of the element e.g.
-     * title, author.
-     *
-     * @param fullFileName
-     *            the full path to the file
-     * @return HashMap where the key is the name of the element and the value is
-     *         the data inside the element's tag
-     */
-    public static HashMap<String, String> loadFromFile(String fullFileName) {
-        HashMap<String, String> map = new HashMap<String, String>();
-        try {
-            BufferedReader reader = new BufferedReader(new FileReader(
-                    fullFileName));
-            String line = "";
-            while ((line = reader.readLine()) != null) {
-                int delimIndex = line.indexOf(';');
-                if (delimIndex != -1)
-                    map.put(line.substring(0, delimIndex), line.substring(
-                            delimIndex + 1, line.length()));
-            }
-            reader.close();
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return map;
-
-    }
-
-}
diff --git a/application/sis-webapp/src/main/java/org/apache/sis/index/tree/QuadTreeReader.java b/application/sis-webapp/src/main/java/org/apache/sis/index/tree/QuadTreeReader.java
deleted file mode 100644
index 63b1353..0000000
--- a/application/sis-webapp/src/main/java/org/apache/sis/index/tree/QuadTreeReader.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.sis.index.tree;
-
-//JDK imports
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-
-//SIS imports
-import org.apache.sis.geometry.DirectPosition2D;
-
-/**
- * Class to reload the quad tree index from file.
- *
- */
-public final class QuadTreeReader {
-  private QuadTreeReader() {
-  }
-
-  /**
-   * Loads the quad tree index from file.
-   *
-   * @param directory
-   *          the directory where the index files are located
-   * @param treeConfigFile
-   *          the name of the tree configuration file
-   * @param nodeFile
-   *          the name of the root node file
-   * @return fully loaded QuadTree
-   */
-  public static QuadTree readFromFile(final String directory,
-      final String treeConfigFile, final String nodeFile) {
-    QuadTree tree = new QuadTree();
-    readConfigFromFile(tree, directory, treeConfigFile);
-    readFromFile(tree, tree.getRoot(), directory, nodeFile);
-    return tree;
-  }
-
-  /**
-   * Read the quad tree configuration from file.
-   *
-   *  @param tree
-   *           the quad tree
-   *  @param directory
-   *           the directory where the configuration file is located
-   *  @param treeConfigFile
-   *           the name of the tree configuration file
-   */
-  private static void readConfigFromFile(QuadTree tree, String directory,
-      String treeConfigFile) {
-    try {
-      BufferedReader reader = new BufferedReader(new FileReader(directory
-          + treeConfigFile));
-      String line = "";
-      while ((line = reader.readLine()) != null) {
-        String[] tokens = line.split(";");
-        int capacity = Integer.parseInt(tokens[1]);
-        int depth = Integer.parseInt(tokens[3]);
-        tree.setCapacity(capacity);
-        tree.setDepth(depth);
-      }
-    } catch (FileNotFoundException e1) {
-      e1.printStackTrace();
-    } catch (NumberFormatException e) {
-      e.printStackTrace();
-    } catch (IOException e) {
-      e.printStackTrace();
-    }
-  }
-
-  /**
-   * Read the quad tree index from file.
-   *
-   * @param tree
-   *          the quad tree
-   * @param parent
-   *          the quad tree parent node
-   * @param directory
-   *          the directory where the index files are located
-   * @param filename
-   *          the name of the parent node file
-   */
-  private static void readFromFile(final QuadTree tree,
-      final QuadTreeNode parent, final String directory, final String filename) {
-    try {
-      BufferedReader reader = new BufferedReader(new FileReader(directory
-          + filename));
-      String line = "";
-      while ((line = reader.readLine()) != null) {
-        String[] tokens = line.split(":");
-        Quadrant quadrant = Quadrant.getQuadrant(Integer.parseInt(tokens[0]));
-        String nodetype = tokens[1];
-        int id = Integer.parseInt(tokens[2]);
-
-        if (nodetype.equals("GRAY")) {
-          parent.setChild(new QuadTreeNode(NodeType.GRAY, id), quadrant);
-          tree.setNodeSize(tree.getNodeSize() + 1);
-        } else {
-          int capacity = Integer.parseInt(tokens[3]);
-          parent.setChild(new QuadTreeNode(id, capacity), quadrant);
-          for (int i = 4; i < tokens.length; i++) {
-            String[] dataTokens = tokens[i].split(";");
-            double lat = Double.parseDouble(dataTokens[0]);
-            double lon = Double.parseDouble(dataTokens[1]);
-            parent.getChild(quadrant).addData(
-                new GeoRSSData(dataTokens[2], new DirectPosition2D(lon, lat)));
-            tree.setSize(tree.getSize() + 1);
-          }
-          tree.setNodeSize(tree.getNodeSize() + 1);
-        }
-
-      }
-      reader.close();
-
-      if (parent.getChild(Quadrant.NW) != null
-          && parent.getChild(Quadrant.NW).getNodeType() == NodeType.GRAY) {
-        readFromFile(tree, parent.getChild(Quadrant.NW), directory, "node_"
-            + parent.getChild(Quadrant.NW).getId() + ".txt");
-      }
-
-      if (parent.getChild(Quadrant.NE) != null
-          && parent.getChild(Quadrant.NE).getNodeType() == NodeType.GRAY) {
-        readFromFile(tree, parent.getChild(Quadrant.NE), directory, "node_"
-            + parent.getChild(Quadrant.NE).getId() + ".txt");
-      }
-
-      if (parent.getChild(Quadrant.SW) != null
-          && parent.getChild(Quadrant.SW).getNodeType() == NodeType.GRAY) {
-        readFromFile(tree, parent.getChild(Quadrant.SW), directory, "node_"
-            + parent.getChild(Quadrant.SW).getId() + ".txt");
-      }
-
-      if (parent.getChild(Quadrant.SE) != null
-          && parent.getChild(Quadrant.SE).getNodeType() == NodeType.GRAY) {
-        readFromFile(tree, parent.getChild(Quadrant.SE), directory, "node_"
-            + parent.getChild(Quadrant.SE).getId() + ".txt");
-      }
-
-    } catch (FileNotFoundException e) {
-      e.printStackTrace();
-    } catch (NumberFormatException e) {
-      e.printStackTrace();
-    } catch (IOException e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/application/sis-webapp/src/main/java/org/apache/sis/services/LocationServlet.java b/application/sis-webapp/src/main/java/org/apache/sis/services/LocationServlet.java
deleted file mode 100644
index d3754f4..0000000
--- a/application/sis-webapp/src/main/java/org/apache/sis/services/LocationServlet.java
+++ /dev/null
@@ -1,479 +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.sis.services;
-
-//JDK imports
-import java.awt.geom.Rectangle2D;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-import org.opengis.geometry.DirectPosition;
-
-//SIS imports
-import org.apache.sis.geometry.DirectPosition2D;
-import org.apache.sis.geometry.Envelope2D;
-import org.apache.sis.index.tree.GeoRSSData;
-import org.apache.sis.index.tree.QuadTree;
-import org.apache.sis.index.tree.QuadTreeData;
-import org.apache.sis.index.tree.QuadTreeReader;
-import org.apache.sis.index.tree.QuadTreeWriter;
-import org.apache.sis.referencing.GeodeticCalculator;
-import org.apache.sis.referencing.CommonCRS;
-
-//ROME imports
-import com.sun.syndication.feed.WireFeed;
-import com.sun.syndication.feed.module.georss.GeoRSSModule;
-import com.sun.syndication.feed.rss.Channel;
-import com.sun.syndication.feed.rss.Item;
-import com.sun.syndication.io.WireFeedInput;
-import com.sun.syndication.io.XmlReader;
-
-/**
- *
- * A location web service that loads data from GeoRSS format (configured via a
- * provided config.xml file), and then loads up a {@link QuadTree} with this
- * information, making it queryable for callers.
- *
- */
-public class LocationServlet extends HttpServlet {
-
-  private static final long serialVersionUID = 731743219362175102L;
-  private QuadTree tree;
-  private ServletContext context;
-  private String timeToLoad;
-  private String qtreeIdxPath;
-  private String georssStoragePath;
-
-  /**
-   * Read GeoRSS data (location information provide sis-location-config.xml )
-   * and build quad-tree.
-   *
-   * @param config
-   *          Servlet configuration file
-   * @exception ServletException
-   *              General exception for servlet
-   */
-  @SuppressWarnings("unchecked")
-  public void init(ServletConfig config) throws ServletException {
-    this.context = config.getServletContext();
-    long startTime = 0;
-    long endTime = 0;
-    int capacity = -1, depth = -1;
-    this.qtreeIdxPath = this.context
-        .getInitParameter("org.apache.sis.services.config.qIndexPath");
-    this.georssStoragePath = this.context
-        .getInitParameter("org.apache.sis.services.config.geodataPath");
-
-    if (!this.qtreeIdxPath.endsWith("/"))
-      this.qtreeIdxPath += "/";
-    if (!this.georssStoragePath.endsWith("/"))
-      this.georssStoragePath += "/";
-
-    InputStream indexStream = null;
-    try {
-      indexStream = new FileInputStream(qtreeIdxPath + "node_0.txt");
-    } catch (FileNotFoundException e) {
-      System.out.println("[INFO] Existing qtree index at: ["+qtreeIdxPath+"] not found. Creating new index.");
-    }
-
-    if (indexStream != null) {
-      startTime = System.currentTimeMillis();
-      this.tree = QuadTreeReader.readFromFile(qtreeIdxPath, "tree_config.txt",
-          "node_0.txt");
-      try {
-        indexStream.close();
-      } catch (IOException e) {
-        e.printStackTrace();
-      }
-      endTime = System.currentTimeMillis();
-      this.timeToLoad = "Quad Tree fully loaded from index files in "
-          + Double.toString((endTime - startTime) / 1000L) + " seconds";
-      System.out.println("[INFO] Finished loading tree from stored index");
-    } else {
-      startTime = System.currentTimeMillis();
-      WireFeedInput wf = new WireFeedInput(true);
-      // read quad tree properties set in config xml file
-      InputStream configStream = null;
-      try {
-        configStream = new FileInputStream(this.context
-            .getInitParameter("org.apache.sis.services.config.filePath"));
-      } catch (Exception e) {
-        e.printStackTrace();
-      }
-
-      if (configStream != null) {
-        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
-        try {
-          DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
-          Document configDoc = docBuilder.parse(configStream);
-          NodeList capacityNode = configDoc.getElementsByTagName("capacity");
-          if (capacityNode.item(0) != null) {
-            capacity = Integer.parseInt(capacityNode.item(0).getFirstChild()
-                .getNodeValue());
-          }
-
-          NodeList depthNode = configDoc.getElementsByTagName("depth");
-          if (depthNode.item(0) != null) {
-            depth = Integer.parseInt(depthNode.item(0).getFirstChild()
-                .getNodeValue());
-          }
-          this.tree = new QuadTree(capacity, depth); // TODO make this configurable
-
-          NodeList urlNodes = configDoc.getElementsByTagName("url");
-          for (int i = 0; i < urlNodes.getLength(); i++) {
-            // read in georss and build tree
-            String georssUrlStr = urlNodes.item(i).getFirstChild()
-                .getNodeValue();
-            WireFeed feed = null;
-            try {
-              feed = wf.build(new XmlReader(new URL(georssUrlStr)));
-            } catch (Exception e) {
-              System.out.println("[ERROR] Error obtaining geodata url: ["
-                  + georssUrlStr + "]: Message: "+e.getMessage()+": skipping and continuing");
-              continue;
-            }
-
-            Channel c = (Channel) feed;
-            List<Item> items = (List<Item>) c.getItems();
-            for (Item item : items) {
-              GeoRSSModule geoRSSModule = (GeoRSSModule) item
-                  .getModule(GeoRSSModule.GEORSS_GEORSS_URI);
-              if (geoRSSModule == null)
-                geoRSSModule = (GeoRSSModule) item
-                    .getModule(GeoRSSModule.GEORSS_GML_URI);
-              if (geoRSSModule == null)
-                geoRSSModule = (GeoRSSModule) item
-                    .getModule(GeoRSSModule.GEORSS_W3CGEO_URI);
-              // if location from the item cannot be retrieved
-              // then discard it
-              if (geoRSSModule != null && geoRSSModule.getPosition() != null) {
-                String filename = "";
-                if (item.getGuid() != null)
-                  filename = cleanStr(item.getGuid().getValue()) + ".txt";
-                else
-                  filename = cleanStr(item.getLink()) + ".txt";
-
-                GeoRSSData data = new GeoRSSData(filename, new DirectPosition2D(
-                    geoRSSModule.getPosition().getLongitude(),
-                    geoRSSModule.getPosition().getLatitude()));
-                if (this.tree.insert(data)) {
-                  data.saveToFile(item, geoRSSModule, georssStoragePath);
-                } else {
-                  System.out.println("[INFO] Unable to store data at location "
-                      + data.getLatLon().y + ", "
-                      + data.getLatLon().x + " under filename "
-                      + data.getFileName());
-                }
-              }
-            }
-          }
-          configStream.close();
-          endTime = System.currentTimeMillis();
-          this.timeToLoad = "Quad Tree fully loaded from retrieving GeoRSS files over the network in "
-              + Double.toString((endTime - startTime) / 1000L) + " seconds";
-          QuadTreeWriter.writeTreeToFile(tree, qtreeIdxPath);
-        } catch (ParserConfigurationException e) {
-          e.printStackTrace();
-        } catch (SAXException e) {
-          e.printStackTrace();
-        } catch (IOException e) {
-          e.printStackTrace();
-        } catch (IllegalArgumentException e) {
-          e.printStackTrace();
-        }
-      } else {
-        throw new ServletException(
-            "Unable to read location service XML config: null!");
-      }
-    }
-  }
-
-  /**
-   * Provide GET requests for Bounding-box and Point-radius search queries.
-   * Return search results to client in xml format.
-   *
-   * @param request
-   *          Http Servlet Request
-   * @param response
-   *          Http Servlet Response
-   * @exception ServletException
-   *              General exception for servlet
-   * @exception IOException
-   *              General exception for I/O
-   */
-  public void doGet(HttpServletRequest request, HttpServletResponse response)
-      throws ServletException, IOException {
-
-    long beforeTime = 0;
-    long afterTime = 0;
-
-    response.setContentType("text/xml");
-    PrintWriter out = response.getWriter();
-
-    String type = request.getParameter("type");
-
-    List<QuadTreeData> results = new ArrayList<QuadTreeData>();
-    List<String> regions = new ArrayList<String>();
-    if (type != null && type.equals("bbox")) {
-      String llLat = request.getParameter("llLat");
-      String llLon = request.getParameter("llLon");
-      String urLat = request.getParameter("urLat");
-      String urLon = request.getParameter("urLon");
-
-      if (llLat != null && llLon != null && urLat != null && urLon != null) {
-        try {
-          Envelope2D bbox = new Envelope2D(new DirectPosition2D(
-              Double.parseDouble(llLon), Double.parseDouble(llLat)),
-              new DirectPosition2D(Double.parseDouble(urLon), Double.parseDouble(urLat)));
-
-          beforeTime = System.currentTimeMillis();
-          results = tree.queryByBoundingBox(bbox);
-          afterTime = System.currentTimeMillis();
-          // get the polygon that approximates the region
-          Rectangle2D[] rects = bbox.toRectangles();
-          for (int i = 0; i < rects.length; i++) {
-            final Rectangle2D r = rects[i];
-            String regionStr = (r.getMinY()) + "," + (r.getMinX()) + ",";
-            regionStr += (r.getMaxY()) + "," + (r.getMinX()) + ",";
-            regionStr += (r.getMaxY()) + "," + (r.getMaxX()) + ",";
-            regionStr += (r.getMinY()) + "," + (r.getMaxX()) + ",";
-            regionStr += (r.getMinY()) + "," + (r.getMinX());
-            regions.add(regionStr);
-          }
-        } catch (NumberFormatException ex) {
-          System.out
-              .println("[ERROR] Input parameters were not valid latitudes and longitudes");
-        }
-
-      }
-    } else if (type != null && type.equals("pointradius")) {
-      String radius = request.getParameter("radius");
-      String lat = request.getParameter("lat");
-      String lon = request.getParameter("lon");
-
-      if (radius != null && lat != null && lon != null) {
-
-        DirectPosition2D point = null;
-        try {
-          point = new DirectPosition2D(Double.parseDouble(lon), Double.parseDouble(lat));
-        } catch (NumberFormatException ex) {
-          System.out
-              .println("{ERROR] Input parameters were not valid latitudes and longitudes");
-        }
-
-        double radiusKM = Double.parseDouble(radius);
-        final GeodeticCalculator calculator = GeodeticCalculator.create(CommonCRS.SPHERE.geographic());
-        calculator.setStartGeographicPoint(point.y, point.x);
-        calculator.setGeodesicDistance(radiusKM);
-
-        StringBuilder regionStr = new StringBuilder();
-
-        for (int i = 0; i <= 360; i += 10) {
-          calculator.setStartingAzimuth(i);
-          DirectPosition pt = calculator.getEndPoint();
-          regionStr.append(pt.getOrdinate(1)).append(',').append(pt.getOrdinate(0)).append(',');
-        }
-        regions.add(regionStr.substring(0, regionStr.length() - 1));
-
-        beforeTime = System.currentTimeMillis();
-        results = tree.queryByPointRadius(point, radiusKM);
-        afterTime = System.currentTimeMillis();
-
-      }
-    }
-    long timeSeconds = afterTime - beforeTime;
-    // return matches from tree in xml format to client
-    out.write(buildXML(results, regions, timeSeconds));
-    out.close();
-  }
-
-  /**
-   * Provide Post requests for build GeoRSS data html file.
-   *
-   * @param request
-   *          Http Servlet Request
-   * @param response
-   *          Http Servlet Response
-   * @exception ServletException
-   *              General exception for servlet
-   * @exception IOException
-   *              General exception for I/O
-   */
-  public void doPost(HttpServletRequest request, HttpServletResponse response)
-      throws ServletException, IOException {
-    response.setContentType("text/html");
-    PrintWriter out = response.getWriter();
-
-    String filename = request.getParameter("filename");
-
-    if (filename != null) {
-
-      HashMap<String, String> map = GeoRSSData
-          .loadFromFile(this.georssStoragePath + filename);
-      String html = "";
-
-      if (map.get("title") != null && !map.get("title").equals("null")) {
-        html += "<b>Title:&nbsp;</b>" + map.get("title") + "<br />";
-      }
-      if (map.get("link") != null && !map.get("link").equals("null")) {
-        html += "<b>Link:&nbsp;</b><a target='_blank' href='" + map.get("link")
-            + "'" + ">" + map.get("link") + "</a><br />";
-      }
-      if (map.get("author") != null && !map.get("author").equals("null")) {
-        html += "<b>Author:&nbsp;</b>" + map.get("author") + "<br />";
-      }
-      if (map.get("pubDate") != null && !map.get("pubDate").equals("null")) {
-        html += "<b>Pub Date:&nbsp;</b>" + map.get("pubDate") + "<br />";
-      }
-      if (map.get("description") != null
-          && !map.get("description").equals("null")) {
-        html += "<b>Description:&nbsp;</b>" + map.get("description") + "<br />";
-      }
-      html += "<b>Lat:&nbsp;</b>" + map.get("lat") + "<br />";
-      html += "<b>Lon:&nbsp;</b>" + map.get("lon") + "<br />";
-
-      out.write(html);
-
-    }
-    out.close();
-  }
-
-  /**
-   * Builds the XML file to return to client.
-   *
-   * @param filterList
-   *          list of QuadTreeData that are within the search region
-   * @param regions
-   *          the String coordinate representation of the search region
-   * @param time
-   *          the time it took to execute the query
-   * @return XML string
-   */
-  private String buildXML(final List<QuadTreeData> filterList,
-      final List<String> regions, final long time) {
-    DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
-
-    try {
-      DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
-      Document doc = docBuilder.newDocument();
-
-      Element root = doc.createElement("root");
-      doc.appendChild(root);
-      for (QuadTreeData geo : filterList) {
-        Element item = doc.createElement("item");
-
-        Element id = doc.createElement("id");
-        Text idText = doc.createTextNode(geo.getFileName());
-        id.appendChild(idText);
-        item.appendChild(id);
-
-        Element lat = doc.createElement("lat");
-        Text latText = doc.createTextNode(Double.toString(geo.getLatLon().y));
-        lat.appendChild(latText);
-        item.appendChild(lat);
-
-        Element lon = doc.createElement("lon");
-        Text lonText = doc.createTextNode(Double.toString(geo.getLatLon().x));
-        lon.appendChild(lonText);
-        item.appendChild(lon);
-
-        root.appendChild(item);
-      }
-
-      Element timeElem = doc.createElement("time");
-      Text timeText = doc.createTextNode(Long.toString(time));
-      timeElem.appendChild(timeText);
-      root.appendChild(timeElem);
-
-      if (timeToLoad != null) {
-        Element indexLoadTimeElem = doc.createElement("indexLoadTime");
-        Text indexLoadTimeText = doc.createTextNode(timeToLoad);
-        indexLoadTimeElem.appendChild(indexLoadTimeText);
-        root.appendChild(indexLoadTimeElem);
-        timeToLoad = null; // Only need to send this over to the client
-        // on initial load
-      }
-
-      Element query = doc.createElement("query");
-      root.appendChild(query);
-      for (String rStr : regions) {
-        Element region = doc.createElement("region");
-        Text regionText = doc.createTextNode(rStr);
-        region.appendChild(regionText);
-        query.appendChild(region);
-      }
-      try {
-        TransformerFactory transfac = TransformerFactory.newInstance();
-        Transformer trans = transfac.newTransformer();
-        trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
-        trans.setOutputProperty(OutputKeys.INDENT, "yes");
-        StringWriter sw = new StringWriter();
-        StreamResult result = new StreamResult(sw);
-        DOMSource source = new DOMSource(doc);
-        trans.transform(source, result);
-        return sw.toString();
-      } catch (TransformerConfigurationException e) {
-        e.printStackTrace();
-      } catch (TransformerException e) {
-        e.printStackTrace();
-      }
-    } catch (ParserConfigurationException e) {
-      e.printStackTrace();
-    }
-    return null;
-
-  }
-
-  /**
-   * Replace all non-alphanumeric characters with empty strings.
-   *
-   * @return String without any non-alphanumeric characters
-   */
-  private static String cleanStr(String id) {
-    String cleanedID = id;
-    return cleanedID.replaceAll("[^a-zA-Z0-9]", "");
-  }
-}
diff --git a/application/sis-webapp/src/main/resources/sis-location-config.xml b/application/sis-webapp/src/main/resources/sis-location-config.xml
deleted file mode 100644
index ce58814..0000000
--- a/application/sis-webapp/src/main/resources/sis-location-config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<sis:locationConfig xmlns:sis="http://incubator.apache.org/sis/1.0">
-	<capacity>4</capacity>
-	<depth>10</depth>
-	<url>http://earthquake.usgs.gov/earthquakes/catalogs/shakerss.xml</url>
-	<url>http://www.prh.noaa.gov/ptwc/feeds/ptwc_rss_pacific.xml</url>
-	<url>http://www.prh.noaa.gov/ptwc/feeds/ptwc_rss_hawaii.xml</url>
-	<url>http://www.prh.noaa.gov/ptwc/feeds/ptwc_rss_indian.xml</url>
-	<url>http://www.prh.noaa.gov/ptwc/feeds/ptwc_rss_caribe.xml</url>
-	<url>http://www.bioneural.net/tag/geotag/feed/</url>
-	<url>http://ws.geonames.org/rssToGeoRSS?feedUrl=http://rss.news.yahoo.com/rss/topstories</url>
-</sis:locationConfig>
diff --git a/application/sis-webapp/src/main/webapp/META-INF/context.xml b/application/sis-webapp/src/main/webapp/META-INF/context.xml
deleted file mode 100644
index d487191..0000000
--- a/application/sis-webapp/src/main/webapp/META-INF/context.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-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.
--->
-<Context path="/sis" docBase="/path/to/sis-webapp-x.y.war">
-
-    <Parameter name="org.apache.sis.services.config.filePath"
-        value="/path/to/sis-location-config.xml" override="false"/>
-
-    <Parameter name="org.apache.sis.services.config.qIndexPath"
-        value="/path/to/qtree/index/dir" override="false"/>
-
-    <Parameter name="org.apache.sis.services.config.geodataPath"
-        value="/path/to/georss/xml/files/dir" override="false"/>
-
-</Context>
diff --git a/application/sis-webapp/src/main/webapp/WEB-INF/web.xml b/application/sis-webapp/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 686b0c7..0000000
--- a/application/sis-webapp/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
-  <display-name>Apache SIS</display-name>
-  <context-param>
-    <param-name>org.apache.sis.services.config.filePath</param-name>
-    <param-value>/path/to/sis-location-config.xml</param-value>
-  </context-param>
-  <servlet>
-    <servlet-name>LocationServlet</servlet-name>
-    <servlet-class>org.apache.sis.services.LocationServlet</servlet-class>
-  </servlet>
-  <servlet-mapping>
-    <servlet-name>LocationServlet</servlet-name>
-    <url-pattern>/location</url-pattern>
-  </servlet-mapping>
-</web-app>
\ No newline at end of file
diff --git a/application/sis-webapp/src/main/webapp/demo.jsp b/application/sis-webapp/src/main/webapp/demo.jsp
deleted file mode 100644
index 9b2c18d..0000000
--- a/application/sis-webapp/src/main/webapp/demo.jsp
+++ /dev/null
@@ -1,321 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!--
-  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.
- -->
-<html>
-<head>
-<title>Apache SIS Spatial Query Demo with Quad Tree Storage and Leaflet Maps
-API</title>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
-<link rel="stylesheet" href="http://leaflet.cloudmade.com/dist/leaflet.css" />
-<!--[if lte IE 8]>
-<link rel="stylesheet" href="http://leaflet.cloudmade.com/dist/leaflet.ie.css" />
-<![endif]-->
-<style type="text/css">
-html {
-	height: 80%
-}
-
-body {
-	height: 100%;
-	font-family: arial, Sans-serif;
-	font-size: 12px;
-}
-
-#map_canvas {
-	height: 80%;
-	width: 50%;
-	font-size: 10px;
-}
-
-#result {
-	font-color: #808080;
-	font-size: 10px;
-}
-
-.center {
-	margin-left: auto;
-	margin-right: auto;
-	width: 50%;
-}
-.leaflet-popup-content {
-	height:200px;
-	width:200px;
-	overflow:auto;
-}
-</style>
-<script type="text/javascript"
-	src="http://leaflet.cloudmade.com/dist/leaflet.js"></script>
-
-<script type="text/javascript">
-	var map;
-	var req;
-
-	function initialize() {
-		map = new L.Map('map_canvas', {scrollWheelZoom:false});
-		var tileURL = 'http://{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png';
-		var tileAttribution = 'Basemap <a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank">CC-BY-SA</a> by &copy; <a href="http://openstreetmap.org/" target="_blank">OpenStreetMap</a>, Tiles Courtesy of &copy; <a href="http://open.mapquest.com" target="_blank">MapQuest</a>';
-		var tileLayer = new L.TileLayer(tileURL, {minZoom: 1, attribution: tileAttribution, subdomains: ['otile1','otile2','otile3','otile4']});
-		map.setView(new L.LatLng(0, 0), 1).addLayer(tileLayer);
-
-		//get the query string
-		var queryStr = window.location.search.substring(1);
-		var queryStrSplit = queryStr.split("&");
-		for (var i = 0; i < queryStrSplit.length; i++)
-		{
-			var keyValue = queryStrSplit[i].split("=");
-			if (keyValue[0] == "type")
-			{
-				document.getElementById("type").value = keyValue[1];
-				switchType();
-			}
-			else if (keyValue[0] == "llLat")
-				document.getElementById("llLat").value = keyValue[1];
-			else if (keyValue[0] == "llLon")
-				document.getElementById("llLon").value = keyValue[1];
-			else if (keyValue[0] == "urLat")
-				document.getElementById("urLat").value = keyValue[1];
-			else if (keyValue[0] == "urLon")
-				document.getElementById("urLon").value = keyValue[1];
-			else if (keyValue[0] == "lat")
-				document.getElementById("lat").value = keyValue[1];
-			else if (keyValue[0] == "lon")
-				document.getElementById("lon").value = keyValue[1];
-			else if (keyValue[0] == "radius")
-				document.getElementById("radius").value = keyValue[1];
-		}
-
-		if (queryStr != "") {
-			getXMLDoc("location?" + queryStr);
-		}
-	}
-
-	function getXMLDoc(url) {
-		req = false;
-
-		if (window.XMLHttpRequest) {
-			try {
-				req = new XMLHttpRequest();
-			} catch (e) {
-				req = false;
-			}
-		} else if (window.ActiveXObject) {
-			try {
-				req = new ActiveXObject("Msxml2.XMLHTTP");
-			} catch (e) {
-				try {
-					req = new ActiveXObject("Microsoft.XMLHTTP");
-				} catch (e) {
-					req = false;
-				}
-			}
-		}
-		if (req) {
-			req.onreadystatechange = processXMLDoc;
-			req.open("GET", url, true);
-			req.send("");
-		}
-	}
-
-	function processXMLDoc() {
-		if (req.readyState == 4) {
-			if (req.status == 200) {
-				var xmlDoc = req.responseXML;
-				var ids = xmlDoc.getElementsByTagName("id");
-				var lats = xmlDoc.getElementsByTagName("lat");
-				var lons = xmlDoc.getElementsByTagName("lon");
-				var regions = xmlDoc.getElementsByTagName("region");
-				var time = xmlDoc.getElementsByTagName("time");
-
-				var indexLoadTime = xmlDoc.getElementsByTagName("indexLoadTime");
-				if (indexLoadTime != null && indexLoadTime.length == 1) {
-					alert(indexLoadTime[0].firstChild.nodeValue);
-				}
-
-				document.getElementById("result").innerHTML = ids.length + " results (" + ( parseInt(time[0].firstChild.nodeValue)  / 1000 ) + " seconds)";
-
-				for ( var i = 0; i < ids.length; i++) {
-					var latLon = new L.LatLng(
-							parseFloat(lats[i].firstChild.nodeValue),
-							parseFloat(lons[i].firstChild.nodeValue));
-
-					var filename = ids[i].firstChild.nodeValue;
-					var marker = createMarker(latLon, filename);
-				}
-
-				for (var j = 0; j < regions.length; j++)
-				{
-					var regionStr = regions[j].firstChild.nodeValue;
-					var latLonPairs = regionStr.split(",");
-					var regionCoordinates = [];
-					for (var k = 0; k < latLonPairs.length; k+=2)
-					{
-						var lon = latLonPairs[k+1];
-						if (lon == 180.0)
-							lon = 179.99;
-						var point = new L.LatLng(latLonPairs[k], lon);
-						regionCoordinates.push(point);
-					}
-					var polygon = new L.Polygon(regionCoordinates, {weight:2, opacity:0.8, clickable:false});
-					map.addLayer(polygon);
-				}
-			} else {
-				alert("Error retrieving results from server: " + req.statusText);
-			}
-		}
-	}
-	var globalMarker;
-	function getHTMLDescription(filename, marker) {
-		req = false;
-
-		if (window.XMLHttpRequest) {
-			try {
-				req = new XMLHttpRequest();
-			} catch (e) {
-				req = false;
-			}
-		} else if (window.ActiveXObject) {
-			try {
-				req = new ActiveXObject("Msxml2.XMLHTTP");
-			} catch (e) {
-				try {
-					req = new ActiveXObject("Microsoft.XMLHTTP");
-				} catch (e) {
-					req = false;
-				}
-			}
-		}
-		if (req) {
-			globalMarker = marker;
-			req.onreadystatechange = displayMarker;
-			req.open("POST", "location", true);
-			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
-			req.send("filename=" + filename);
-		}
-	}
-
-	function createMarker(latLon, filename) {
-		var marker = new L.Marker(latLon);
-		map.addLayer(marker);
-		marker.on('click', function(event)
-		{
-			getHTMLDescription(filename, marker);
-		});
-		return marker;
-	}
-
-	function displayMarker()
-	{
-		if (req.readyState == 4) {
-			if (req.status == 200) {
-				var text = req.responseText;
-				globalMarker.bindPopup(text).openPopup();
-			}
-		}
-	}
-
-	function switchType()
-	{
-
-		if (document.getElementById("type").selectedIndex == 0)
-		{
-			document.getElementById("bbox").style.visibility = "visible";
-			document.getElementById("bbox").style.display = "block";
-			document.getElementById("pointradius").style.visibility = "hidden";
-			document.getElementById("pointradius").style.display = "none";
-		}
-		else
-		{
-			document.getElementById("bbox").style.visibility = "hidden";
-			document.getElementById("bbox").style.display = "none";
-			document.getElementById("pointradius").style.visibility = "visible";
-			document.getElementById("pointradius").style.display = "block";
-		}
-	}
-
-	function validate() {
-		var regex = /-?[0-9]+.?[0-9]*/;
-		if (document.getElementById("type").selectedIndex == 0) {
-			if (document.getElementById("llLat").value.match(regex)
-					&& document.getElementById("llLon").value.match(regex)
-					&& document.getElementById("urLat").value.match(regex)
-					&& document.getElementById("urLon").value.match(regex)) {
-				return true;
-			} else {
-				alert("Enter valid lat/lon values in corresponding fields.");
-				return false;
-			}
-		} else if (document.getElementById("type").selectedIndex == 1) {
-			if (document.getElementById("lat").value.match(regex)
-					&& document.getElementById("lon").value.match(regex)
-					&& document.getElementById("radius").value.match(regex)) {
-				return true;
-			} else {
-				alert("Enter valid lat/lon and radius values in corresponding fields.");
-				return false;
-			}
-		}
-
-	}
-</script>
-</head>
-<body onload="initialize()">
-<div class="center" ><a href="http://sis.apache.org"><image src="images/sis_logo_small.png" alt="Apache SIS: Spatial Information System" border="0"/></a></div>
-<form method="get"
-	onsubmit="return validate()" class="center">
-
-<label><b>Query By&nbsp;</b></label> <select id="type"
-	onchange="switchType()" name="type">
-	<option value="bbox">Bounding Box</option>
-	<option value="pointradius">Point-Radius</option>
-</select></p>
-<span id="bbox">
-<table cellpadding="5" cellspacing="5">
-	<tr>
-		<td><b>Lower Left</b></td>
-		<td>Latitude&nbsp;<input id="llLat" type="text" size="8"
-			name="llLat" /></td>
-
-		<td>Longitude&nbsp;<input id="llLon" type="text" size="8"
-			name="llLon" /></td>
-	</tr>
-	<tr>
-		<td><b>Upper Right</b></td>
-		<td>Latitude&nbsp;<input id="urLat" type="text" size="8"
-			name="urLat" /></td>
-		<td>Longitude&nbsp;<input id="urLon" type="text" size="8"
-			name="urLon" /></td>
-	</tr>
-</table>
-</span> <span id="pointradius" style="display: none; visibility: hidden;">
-<table cellpadding="5" cellspacing="5]">
-	<tr>
-		<td>Latitude&nbsp;<input id="lat" type="text" size="8" name="lat" /></td>
-
-		<td>Longitude&nbsp;<input id="lon" type="text" size="8"
-			name="lon" /></td>
-		<td>Radius (km)&nbsp;<input id="radius" type="text" size="8"
-			name="radius" /></td>
-	</tr>
-</table>
-</span>
-<p><input type="submit" value="Query" /></p>
-</form>
-<p id="result" class="center"></p>
-<div id="map_canvas" class="center"></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/application/sis-webapp/src/main/webapp/images/sis_logo_small.png b/application/sis-webapp/src/main/webapp/images/sis_logo_small.png
deleted file mode 100644
index 13d60a7..0000000
Binary files a/application/sis-webapp/src/main/webapp/images/sis_logo_small.png and /dev/null differ
diff --git a/core/pom.xml b/core/pom.xml
index 10cb2f6..886ca53 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -192,7 +192,6 @@
     <module>sis-referencing</module>
     <module>sis-referencing-by-identifiers</module>
     <module>sis-feature</module>
-    <module>sis-portrayal</module>
   </modules>
 
 </project>
diff --git a/core/sis-portrayal/pom.xml b/core/sis-portrayal/pom.xml
deleted file mode 100644
index 57e0729..0000000
--- a/core/sis-portrayal/pom.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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 xmlns              = "http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi          = "http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
-                               http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sis</groupId>
-    <artifactId>core</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-
-  <!-- ===========================================================
-           Module Description
-       =========================================================== -->
-  <groupId>org.apache.sis.core</groupId>
-  <artifactId>sis-portrayal</artifactId>
-  <name>Apache SIS portrayal</name>
-  <description>
-    Symbology and map representations, together with a rendering engine for display.
-  </description>
-
-
-  <!-- ===========================================================
-           Developers and Contributors
-       =========================================================== -->
-  <developers>
-    <developer>
-      <name>Johann Sorel</name>
-      <id>jsorel</id>
-      <organization>Geomatys</organization>
-      <organizationUrl>http://www.geomatys.com</organizationUrl>
-      <timezone>+1</timezone>
-      <roles>
-        <role>developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Martin Desruisseaux</name>
-      <id>desruisseaux</id>
-      <email>desruisseaux@apache.org</email>
-      <organization>Geomatys</organization>
-      <organizationUrl>http://www.geomatys.com</organizationUrl>
-      <timezone>+1</timezone>
-      <roles>
-        <role>developer</role>
-      </roles>
-    </developer>
-  </developers>
-
-
-  <!-- ===========================================================
-           Build configuration
-       =========================================================== -->
-  <build>
-    <plugins>
-      <!-- Anticipation for Java 9 -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Automatic-Module-Name>
-                org.apache.sis.portrayal
-              </Automatic-Module-Name>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-
-  <!-- ===========================================================
-           Dependencies
-       =========================================================== -->
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-utility</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-referencing</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.storage</groupId>
-      <artifactId>sis-storage</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <!-- Test dependencies -->
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-utility</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-metadata</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-referencing</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapContext.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapContext.java
deleted file mode 100644
index 097c9c3..0000000
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapContext.java
+++ /dev/null
@@ -1,79 +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.sis.internal.map;
-
-import org.opengis.geometry.Envelope;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-
-
-/**
- * Root node of a map.
- *
- * The map context contains all layers to display (given by the {@link #getComponents() group components})
- * and defines the {@linkplain #getAreaOfInterest() area of interest} which should be zoomed by default
- * when the map is rendered.
- *
- * <p>
- * NOTE: this class is a first draft subject to modifications.
- * </p>
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class MapContext extends MapGroup {
-    /**
-     * The area of interest.
-     */
-    private Envelope areaOfInterest;
-
-    /**
-     * Creates an initially empty map context.
-     */
-    public MapContext() {
-    }
-
-    /**
-     * Returns the map area to show by default. This is not necessarily the
-     * {@linkplain org.apache.sis.storage.DataSet#getEnvelope() envelope of data}
-     * since one may want to zoom in a different spatiotemporal area.
-     *
-     * <p>The {@linkplain org.apache.sis.geometry.GeneralEnvelope#getCoordinateReferenceSystem() envelope CRS}
-     * defines the map projection to use for rendering the map. It may be different than the CRS of the data.
-     * The returned envelope may have {@linkplain org.apache.sis.geometry.GeneralEnvelope#isAllNaN() all its
-     * coordinates set to NaN} if only the {@link CoordinateReferenceSystem} is specified.</p>
-     *
-     * @return map area to show by default, or {@code null} is unspecified.
-     *
-     * @see org.apache.sis.storage.DataSet#getEnvelope()
-     */
-    public Envelope getAreaOfInterest() {
-        return areaOfInterest;
-    }
-
-    /**
-     * Sets the map area to show by default.
-     * The given envelope is not necessarily related to the data contained in the map context.
-     * It may be wider, small and in a different {@link CoordinateReferenceSystem}.
-     *
-     * @param  aoi  new map area to show by default, or {@code null} is unspecified.
-     */
-    public void setAreaOfInterest(Envelope aoi) {
-        areaOfInterest = aoi;
-    }
-}
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapGroup.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapGroup.java
deleted file mode 100644
index be82526..0000000
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapGroup.java
+++ /dev/null
@@ -1,66 +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.sis.internal.map;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * A collection of layers.
- * Groups are used in map contexts to regroup similar layers under a same node.
- * This allows global actions, like {@linkplain #setVisible(boolean) hiding}
- * background layers in one call.
- *
- * <p>
- * NOTE: this class is a first draft subject to modifications.
- * </p>
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class MapGroup extends MapItem {
-    /**
-     * The components in this group.
-     */
-    private final List<MapItem> components;
-
-    /**
-     * Creates an initially empty group.
-     */
-    public MapGroup() {
-        components = new ArrayList<>();
-    }
-
-    /**
-     * Gets the modifiable list of components contained in this group.
-     * The components in the list are presented in rendering order.
-     * This means that the first rendered component, which will be below
-     * all other components on the rendered map, is located at index zero.
-     *
-     * <p>The returned list is modifiable: changes in the returned list will
-     * be immediately reflected in this {@code MapGroup}, and conversely.</p>
-     *
-     * @return modifiable list of components in this group.
-     */
-    @SuppressWarnings("ReturnOfCollectionOrArrayField")
-    public List<MapItem> getComponents() {
-        return components;
-    }
-}
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapItem.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapItem.java
deleted file mode 100644
index e47a03d..0000000
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapItem.java
+++ /dev/null
@@ -1,88 +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.sis.internal.map;
-
-/**
- * Parent class of all map elements.
- *
- * <p>
- * NOTE: this class is a first draft subject to modifications.
- * </p>
- *
- * @todo Rename {@code MapElement} or {@code Element}?
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public abstract class MapItem {
-    /**
-     * The title of this map item, for display to the user.
-     */
-    private CharSequence title;
-
-    /**
-     * Whether this item should be shown on the map.
-     */
-    private boolean visible = true;
-
-    /**
-     * Only used by classes in this package.
-     */
-    MapItem() {
-    }
-
-    /**
-     * Returns the title of this map item.
-     * This title should be user friendly and may be an {@link org.opengis.util.InternationalString}.
-     * It shall not be used as an identifier.
-     *
-     * @return title to be shown to the user, or {@code null} if none.
-     */
-    public CharSequence getTitle() {
-        return title;
-    }
-
-    /**
-     * Sets a new title for this map item.
-     *
-     * @param  title  title to be shown to the user, or {@code null} if none.
-     */
-    public void setTitle(CharSequence title) {
-        this.title = title;
-    }
-
-    /**
-     * Return whether this item should be shown on the map.
-     *
-     * @return {@code true} if this item is visible.
-     */
-    public boolean isVisible() {
-        return visible;
-    }
-
-    /**
-     * Sets whether this item should be shown on the map.
-     * If this item is a {@link MapGroup}, then hiding this group should hide all components in this group.
-     *
-     * @param visible {@code false} to hide this item and all it's components.
-     */
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-    }
-}
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapLayer.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapLayer.java
deleted file mode 100644
index 692db42..0000000
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/MapLayer.java
+++ /dev/null
@@ -1,104 +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.sis.internal.map;
-
-import org.apache.sis.storage.Resource;
-//import org.opengis.style.Style;
-
-
-/**
- * Data (resource) associated to visual representation (symbology).
- * Layers are the key elements of a map: they link datas (given by a {@link Resource})
- * to their visual representation (defined by a {@code Style}).
- * The visual appearance of a layer should be similar with any rendering engine.
- * Some details may very because of different rendering strategies for label placements, 2D or 3D,
- * but the fundamentals aspect of each {@code org.opengis.feature.Feature} or
- * {@code org.opengis.coverage.Coverage} should be unchanged.
- *
- * <p>
- * NOTE: this class is a first draft subject to modifications.
- * </p>
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-public class MapLayer extends MapItem {
-    /**
-     * Data to be rendered.
-     */
-    private Resource resource;
-
-    /**
-     * Visual representation of data.
-     */
-//  private Style style;
-
-    /**
-     * Constructs an initially empty map layer.
-     *
-     * @todo Expect {@code Resource} and {@code Style} in argument, for discouraging
-     *       the use of {@code MapLayer} with null resource and null style?
-     */
-    public MapLayer() {
-    }
-
-    /**
-     * Returns the data (resource) represented by this layer.
-     * The resource should be a {@link org.apache.sis.storage.DataSet},
-     * but {@link org.apache.sis.storage.Aggregate} are also accepted.
-     * The behavior in such case depends on the rendering engine.
-     *
-     * @return data to be rendered, or {@code null} is unavailable.
-     */
-    public Resource getResource() {
-        return resource;
-    }
-
-    /**
-     * Sets the data (resource) to be rendered.
-     * The resource should never be null, still the null case is tolerated to indicate
-     * that the layer should have existed but is unavailable for an unspecified reason.
-     * This case may happen with processing or distant services resources.
-     *
-     * @param  resource  the new data, or {@code null} if unavailable.
-     */
-    public void setResource(Resource resource) {
-        this.resource = resource;
-    }
-
-    /**
-     * Returns the visual appearance of the data.
-     * If the style is undefined, the behavior is left to the rendering engine.
-     * It is expected that a default style should be used.
-     *
-     * @return description of data visual appearance, or {@code null} if unspecified.
-     */
-//  public Style getStyle() {
-//      return style;
-//  }
-
-    /**
-     * Sets the visual appearance of the data.
-     *
-     * @param  style  description of data visual appearance, or {@code null} if unspecified.
-     */
-//  public void setStyle(Style style) {
-//      this.style = style;
-//  }
-}
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/package-info.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/package-info.java
deleted file mode 100644
index a0d5049..0000000
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/package-info.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.
- */
-
-
-/**
- * Symbology and map representations, together with a rendering engine for display.
- * The {@linkplain org.apache.sis.internal.map.MapContext map context} is the root node of a map.
- *
- * <p><b>WARNING:</b> this package is work in progress and is not yet part of public API.
- * Some classes in this package will move to public API after we gained enough confidence
- * about their stability.</p>
- *
- * @todo Since everything is about maps in this package, should we omit the {@code Map} prefix in class names?
- *
- * @author  Johann Sorel (Geomatys)
- * @version 1.0
- * @since   1.0
- * @module
- */
-package org.apache.sis.internal.map;
diff --git a/core/sis-portrayal/src/test/java/org/apache/sis/test/suite/package-info.txt b/core/sis-portrayal/src/test/java/org/apache/sis/test/suite/package-info.txt
deleted file mode 100644
index ac895b5..0000000
--- a/core/sis-portrayal/src/test/java/org/apache/sis/test/suite/package-info.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Different modules provide classes in this package - be careful about collisions.
-This package is initially defined by the sis-utility module, which also provides
-the package-info.java file.
diff --git a/ide-project/NetBeans/build.xml b/ide-project/NetBeans/build.xml
index 989e048..28e341b 100644
--- a/ide-project/NetBeans/build.xml
+++ b/ide-project/NetBeans/build.xml
@@ -70,11 +70,6 @@
       <fileset dir="${project.root}/core/sis-feature/target/generated-resources">
         <include name="**/*.utf"/>
       </fileset>
-      <!-- Not yet available.
-      <fileset dir="${project.root}/core/sis-portrayal/target/generated-resources">
-        <include name="**/*.utf"/>
-      </fileset>
-      -->
       <fileset dir="${project.root}/storage/sis-storage/target/generated-resources">
         <include name="**/*.utf"/>
       </fileset>
@@ -84,11 +79,6 @@
       <fileset dir="${project.root}/storage/sis-geotiff/target/generated-resources">
         <include name="**/*.utf"/>
       </fileset>
-      <!-- Pending discussion about how to handle resources in the Shapefile module.
-      <fileset dir="${project.root}/storage/sis-shapefile/target/generated-resources">
-        <include name="**/*.utf"/>
-      </fileset>
-      -->
 
       <!-- Other resources (properties files, SQL scripts, native libraries). -->
       <fileset dir="${project.root}/core/sis-utility/src/main/resources">
@@ -279,12 +269,6 @@
       <fileset dir="${project.root}/storage/sis-earth-observation/src/test/resources">
         <include name="**/*.txt"/>
       </fileset>
-      <fileset dir="${project.root}/storage/sis-shapefile/src/test/resources">
-        <include name="**/*.dbf"/>
-        <include name="**/*.prj"/>
-        <include name="**/*.shp"/>
-        <include name="**/*.shx"/>
-      </fileset>
       <fileset dir="${project.root}/profiles/sis-french-profile/src/test/resources">
         <include name="**/*.xml"/>
       </fileset>
diff --git a/ide-project/NetBeans/nbproject/build-impl.xml b/ide-project/NetBeans/nbproject/build-impl.xml
index 89727fe..7e4ae35 100644
--- a/ide-project/NetBeans/nbproject/build-impl.xml
+++ b/ide-project/NetBeans/nbproject/build-impl.xml
@@ -90,7 +90,7 @@ is divided into following sections:
                 </not>
             </condition>
         </fail>
-        <j2seproject3:modulename property="module.name" sourcepath="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}"/>
+        <j2seproject3:modulename property="module.name" sourcepath="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}"/>
         <condition property="named.module.internal">
             <and>
                 <isset property="module.name"/>
@@ -192,13 +192,10 @@ is divided into following sections:
         </condition>
         <condition property="have.tests">
             <or>
-                <available file="${test.webapp.dir}"/>
                 <available file="${test.console.dir}"/>
-                <available file="${test.portrayal.dir}"/>
                 <available file="${test.earth-obs.dir}"/>
                 <available file="${test.geotiff.dir}"/>
                 <available file="${test.netcdf.dir}"/>
-                <available file="${test.shapefile.dir}"/>
                 <available file="${test.sql.dir}"/>
                 <available file="${test.xmlstore.dir}"/>
                 <available file="${test.storage.dir}"/>
@@ -215,13 +212,10 @@ is divided into following sections:
         <condition property="have.sources">
             <or>
                 <available file="${src.local-src.dir}"/>
-                <available file="${src.webapp.dir}"/>
                 <available file="${src.console.dir}"/>
-                <available file="${src.portrayal.dir}"/>
                 <available file="${src.earth-obs.dir}"/>
                 <available file="${src.geotiff.dir}"/>
                 <available file="${src.netcdf.dir}"/>
-                <available file="${src.shapefile.dir}"/>
                 <available file="${src.sql.dir}"/>
                 <available file="${src.xmlstore.dir}"/>
                 <available file="${src.storage.dir}"/>
@@ -337,13 +331,10 @@ is divided into following sections:
     </target>
     <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
         <fail unless="src.local-src.dir">Must set src.local-src.dir</fail>
-        <fail unless="src.webapp.dir">Must set src.webapp.dir</fail>
         <fail unless="src.console.dir">Must set src.console.dir</fail>
-        <fail unless="src.portrayal.dir">Must set src.portrayal.dir</fail>
         <fail unless="src.earth-obs.dir">Must set src.earth-obs.dir</fail>
         <fail unless="src.geotiff.dir">Must set src.geotiff.dir</fail>
         <fail unless="src.netcdf.dir">Must set src.netcdf.dir</fail>
-        <fail unless="src.shapefile.dir">Must set src.shapefile.dir</fail>
         <fail unless="src.sql.dir">Must set src.sql.dir</fail>
         <fail unless="src.xmlstore.dir">Must set src.xmlstore.dir</fail>
         <fail unless="src.storage.dir">Must set src.storage.dir</fail>
@@ -356,13 +347,10 @@ is divided into following sections:
         <fail unless="src.jpn-profile.dir">Must set src.jpn-profile.dir</fail>
         <fail unless="src.gdal.dir">Must set src.gdal.dir</fail>
         <fail unless="src.c.gdal.dir">Must set src.c.gdal.dir</fail>
-        <fail unless="test.webapp.dir">Must set test.webapp.dir</fail>
         <fail unless="test.console.dir">Must set test.console.dir</fail>
-        <fail unless="test.portrayal.dir">Must set test.portrayal.dir</fail>
         <fail unless="test.earth-obs.dir">Must set test.earth-obs.dir</fail>
         <fail unless="test.geotiff.dir">Must set test.geotiff.dir</fail>
         <fail unless="test.netcdf.dir">Must set test.netcdf.dir</fail>
-        <fail unless="test.shapefile.dir">Must set test.shapefile.dir</fail>
         <fail unless="test.sql.dir">Must set test.sql.dir</fail>
         <fail unless="test.xmlstore.dir">Must set test.xmlstore.dir</fail>
         <fail unless="test.storage.dir">Must set test.storage.dir</fail>
@@ -394,7 +382,7 @@ is divided into following sections:
     </target>
     <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="modules.supported.internal" name="-init-macrodef-javac-with-module">
         <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
             <attribute default="${build.classes.dir}" name="destdir"/>
             <attribute default="${javac.classpath}" name="classpath"/>
             <attribute default="${javac.modulepath}" name="modulepath"/>
@@ -406,7 +394,7 @@ is divided into following sections:
             <attribute default="${excludes}" name="excludes"/>
             <attribute default="${javac.debug}" name="debug"/>
             <attribute default="${empty.dir}" name="sourcepath" unless:set="named.module.internal"/>
-            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" if:set="named.module.internal" name="sourcepath"/>
+            <attribute default="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" if:set="named.module.internal" name="sourcepath"/>
             <attribute default="${empty.dir}" name="gensrcdir"/>
             <element name="customize" optional="true"/>
             <sequential>
@@ -461,7 +449,7 @@ is divided into following sections:
     </target>
     <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors" unless="modules.supported.internal">
         <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
             <attribute default="${build.classes.dir}" name="destdir"/>
             <attribute default="${javac.classpath}" name="classpath"/>
             <attribute default="${javac.modulepath}" name="modulepath"/>
@@ -504,7 +492,7 @@ is divided into following sections:
     </target>
     <target depends="-init-ap-cmdline-properties,-init-source-module-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
         <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
             <attribute default="${build.classes.dir}" name="destdir"/>
             <attribute default="${javac.classpath}" name="classpath"/>
             <attribute default="${javac.modulepath}" name="modulepath"/>
@@ -539,7 +527,7 @@ is divided into following sections:
     </target>
     <target depends="-init-macrodef-javac-with-module,-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
         <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
             <attribute default="${build.classes.dir}" name="destdir"/>
             <attribute default="${javac.classpath}" name="classpath"/>
             <sequential>
@@ -672,15 +660,9 @@ is divided into following sections:
                 <j2seproject3:junit-prototype>
                     <customizePrototype>
                         <batchtest todir="${build.test.results.dir}">
-                            <fileset dir="${test.webapp.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
                             <fileset dir="${test.console.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
                                 <filename name="@{testincludes}"/>
                             </fileset>
-                            <fileset dir="${test.portrayal.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
                             <fileset dir="${test.earth-obs.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
                                 <filename name="@{testincludes}"/>
                             </fileset>
@@ -690,9 +672,6 @@ is divided into following sections:
                             <fileset dir="${test.netcdf.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
                                 <filename name="@{testincludes}"/>
                             </fileset>
-                            <fileset dir="${test.shapefile.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
                             <fileset dir="${test.sql.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
                                 <filename name="@{testincludes}"/>
                             </fileset>
@@ -749,15 +728,9 @@ is divided into following sections:
                     <isset property="test.method"/>
                 </condition>
                 <union id="test.set">
-                    <fileset dir="${test.webapp.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
-                        <filename name="@{testincludes}"/>
-                    </fileset>
                     <fileset dir="${test.console.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
                         <filename name="@{testincludes}"/>
                     </fileset>
-                    <fileset dir="${test.portrayal.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
-                        <filename name="@{testincludes}"/>
-                    </fileset>
                     <fileset dir="${test.earth-obs.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
                         <filename name="@{testincludes}"/>
                     </fileset>
@@ -767,9 +740,6 @@ is divided into following sections:
                     <fileset dir="${test.netcdf.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
                         <filename name="@{testincludes}"/>
                     </fileset>
-                    <fileset dir="${test.shapefile.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
-                        <filename name="@{testincludes}"/>
-                    </fileset>
                     <fileset dir="${test.sql.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
                         <filename name="@{testincludes}"/>
                     </fileset>
@@ -1276,19 +1246,16 @@ is divided into following sections:
                 <include name="*"/>
             </dirset>
         </pathconvert>
-        <j2seproject3:depend srcdir="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}:${build.generated.subdirs}"/>
+        <j2seproject3:depend srcdir="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}:${build.generated.subdirs}"/>
     </target>
     <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
         <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
         <copy todir="${build.classes.dir}">
             <fileset dir="${src.local-src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${src.webapp.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.console.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${src.portrayal.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.earth-obs.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.geotiff.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.netcdf.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${src.shapefile.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.sql.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.xmlstore.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${src.storage.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
@@ -1321,7 +1288,7 @@ is divided into following sections:
     <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
         <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
         <j2seproject3:force-recompile/>
-        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}, module-info.java" sourcepath="${src.local-src.dir}:${src.webapp.dir}:${src.console.dir}:${src.portrayal.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.shapefile.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-pro [...]
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}, module-info.java" sourcepath="${src.local-src.dir}:${src.console.dir}:${src.earth-obs.dir}:${src.geotiff.dir}:${src.netcdf.dir}:${src.sql.dir}:${src.xmlstore.dir}:${src.storage.dir}:${src.feature.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.jpn-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}"/>
     </target>
     <target name="-post-compile-single">
         <!-- Empty placeholder for easier customization. -->
@@ -1702,15 +1669,9 @@ is divided into following sections:
             <fileset dir="${src.local-src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
-            <fileset dir="${src.webapp.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
-                <filename name="**/*.java"/>
-            </fileset>
             <fileset dir="${src.console.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
-            <fileset dir="${src.portrayal.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
-                <filename name="**/*.java"/>
-            </fileset>
             <fileset dir="${src.earth-obs.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
@@ -1720,9 +1681,6 @@ is divided into following sections:
             <fileset dir="${src.netcdf.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
-            <fileset dir="${src.shapefile.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
-                <filename name="**/*.java"/>
-            </fileset>
             <fileset dir="${src.sql.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
@@ -1770,15 +1728,9 @@ is divided into following sections:
             <fileset dir="${src.local-src.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
-            <fileset dir="${src.webapp.dir}" excludes="${excludes}" includes="${includes}">
-                <filename name="**/doc-files/**"/>
-            </fileset>
             <fileset dir="${src.console.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
-            <fileset dir="${src.portrayal.dir}" excludes="${excludes}" includes="${includes}">
-                <filename name="**/doc-files/**"/>
-            </fileset>
             <fileset dir="${src.earth-obs.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
@@ -1788,9 +1740,6 @@ is divided into following sections:
             <fileset dir="${src.netcdf.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
-            <fileset dir="${src.shapefile.dir}" excludes="${excludes}" includes="${includes}">
-                <filename name="**/doc-files/**"/>
-            </fileset>
             <fileset dir="${src.sql.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
@@ -1849,14 +1798,14 @@ is divided into following sections:
         <!-- You can override this target in the ../build.xml file. -->
     </target>
     <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-javac-module-properties-with-module">
-        <j2seproject3:modulename property="test.module.name" sourcepath="${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}"/>
-        <condition else="${empty.dir}" property="javac.test.sourcepath" value="${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}">
+        <j2seproject3:modulename property="test.module.name" sourcepath="${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}"/>
+        <condition else="${empty.dir}" property="javac.test.sourcepath" value="${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}">
             <and>
                 <isset property="test.module.name"/>
                 <length length="0" string="${test.module.name}" when="greater"/>
             </and>
         </condition>
-        <condition else="--patch-module ${module.name}=${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir} --add-reads ${module.name}=ALL-UNNAMED" property="javac.test.com [...]
+        <condition else="--patch-module ${module.name}=${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir} --add-reads ${module.name}=ALL-UNNAMED" property="javac.test.compilerargs" value="--add-reads ${test.module.name}=ALL-UNNAMED">
             <and>
                 <isset property="test.module.name"/>
                 <length length="0" string="${test.module.name}" when="greater"/>
@@ -1897,22 +1846,19 @@ is divided into following sections:
     </target>
     <target depends="-init-test-javac-module-properties-with-module,-init-test-module-properties-without-module" name="-init-test-module-properties"/>
     <target if="do.depend.true" name="-compile-test-depend">
-        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}"/>
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.jpn-profile.dir}:${test.gdal.dir}"/>
     </target>
     <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
-        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${javac.test.sourcepath}" srcdir="${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${te [...]
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${javac.test.sourcepath}" srcdir="${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:$ [...]
             <customize>
                 <compilerarg line="${javac.test.compilerargs}"/>
             </customize>
         </j2seproject3:javac>
         <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.webapp.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.console.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${test.portrayal.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.earth-obs.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.geotiff.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.netcdf.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${test.shapefile.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.sql.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.xmlstore.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.storage.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
@@ -1938,19 +1884,16 @@ is divided into following sections:
     <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
         <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
         <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
-        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}, module-info.java" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${test.webapp.dir}:${test.console.dir}:${test.portrayal.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.shapefile.dir}:${test.sql.dir}:${test.xmlstore.dir} [...]
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}, module-info.java" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${test.console.dir}:${test.earth-obs.dir}:${test.geotiff.dir}:${test.netcdf.dir}:${test.sql.dir}:${test.xmlstore.dir}:${test.storage.dir}:${test.feature.dir}:${test.referencing.dir [...]
             <customize>
                 <compilerarg line="${javac.test.compilerargs}"/>
             </customize>
         </j2seproject3:javac>
         <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.webapp.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.console.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${test.portrayal.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.earth-obs.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.geotiff.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.netcdf.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-            <fileset dir="${test.shapefile.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.sql.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.xmlstore.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
             <fileset dir="${test.storage.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
diff --git a/ide-project/NetBeans/nbproject/genfiles.properties b/ide-project/NetBeans/nbproject/genfiles.properties
index 3f5e676..1d3661c 100644
--- a/ide-project/NetBeans/nbproject/genfiles.properties
+++ b/ide-project/NetBeans/nbproject/genfiles.properties
@@ -3,6 +3,6 @@
 build.xml.data.CRC32=58e6b21c
 build.xml.script.CRC32=462eaba0
 build.xml.stylesheet.CRC32=28e38971@1.53.1.46
-nbproject/build-impl.xml.data.CRC32=82e7f46a
-nbproject/build-impl.xml.script.CRC32=dbe1a9a7
+nbproject/build-impl.xml.data.CRC32=eb3461ef
+nbproject/build-impl.xml.script.CRC32=e63f1679
 nbproject/build-impl.xml.stylesheet.CRC32=3a2fa800@1.92.0.48
diff --git a/ide-project/NetBeans/nbproject/project.properties b/ide-project/NetBeans/nbproject/project.properties
index a91ab13..2e34c3d 100644
--- a/ide-project/NetBeans/nbproject/project.properties
+++ b/ide-project/NetBeans/nbproject/project.properties
@@ -53,8 +53,6 @@ run.jvmargs          = -enableassertions \
 #
 project.root         = ../..
 src.local-src.dir    = ../local-src
-src.webapp.dir       = ${project.root}/application/sis-webapp/src/main/java
-test.webapp.dir      = ${project.root}/application/sis-webapp/src/test/java
 src.console.dir      = ${project.root}/application/sis-console/src/main/java
 test.console.dir     = ${project.root}/application/sis-console/src/test/java
 src.earth-obs.dir    = ${project.root}/storage/sis-earth-observation/src/main/java
@@ -63,8 +61,6 @@ src.geotiff.dir      = ${project.root}/storage/sis-geotiff/src/main/java
 test.geotiff.dir     = ${project.root}/storage/sis-geotiff/src/test/java
 src.netcdf.dir       = ${project.root}/storage/sis-netcdf/src/main/java
 test.netcdf.dir      = ${project.root}/storage/sis-netcdf/src/test/java
-src.shapefile.dir    = ${project.root}/storage/sis-shapefile/src/main/java
-test.shapefile.dir   = ${project.root}/storage/sis-shapefile/src/test/java
 src.sql.dir          = ${project.root}/storage/sis-sqlstore/src/main/java
 test.sql.dir         = ${project.root}/storage/sis-sqlstore/src/test/java
 src.xmlstore.dir     = ${project.root}/storage/sis-xmlstore/src/main/java
@@ -76,8 +72,6 @@ src.storage.dir      = ${project.root}/storage/sis-storage/src/main/java
 test.storage.dir     = ${project.root}/storage/sis-storage/src/test/java
 src.feature.dir      = ${project.root}/core/sis-feature/src/main/java
 test.feature.dir     = ${project.root}/core/sis-feature/src/test/java
-src.portrayal.dir    = ${project.root}/core/sis-portrayal/src/main/java
-test.portrayal.dir   = ${project.root}/core/sis-portrayal/src/test/java
 src.referencing.dir  = ${project.root}/core/sis-referencing/src/main/java
 test.referencing.dir = ${project.root}/core/sis-referencing/src/test/java
 src.ref-by-id.dir    = ${project.root}/core/sis-referencing-by-identifiers/src/main/java
diff --git a/ide-project/NetBeans/nbproject/project.xml b/ide-project/NetBeans/nbproject/project.xml
index 6c68123..b62dce0 100644
--- a/ide-project/NetBeans/nbproject/project.xml
+++ b/ide-project/NetBeans/nbproject/project.xml
@@ -24,13 +24,10 @@
             <name>Apache SIS on GeoAPI 3.0</name>
             <source-roots>
                 <root id="src.local-src.dir" name="Local sources (unversioned)"/>
-                <root id="src.webapp.dir" name="Web application"/>
                 <root id="src.console.dir" name="Console"/>
-                <root id="src.portrayal.dir" name="Portrayal"/>
                 <root id="src.earth-obs.dir" name="Earth observation"/>
                 <root id="src.geotiff.dir" name="GeoTIFF"/>
                 <root id="src.netcdf.dir" name="NetCDF"/>
-                <root id="src.shapefile.dir" name="Shapefile"/>
                 <root id="src.sql.dir" name="SQLStore"/>
                 <root id="src.xmlstore.dir" name="XMLStore"/>
                 <root id="src.storage.dir" name="Storage"/>
@@ -45,13 +42,10 @@
                 <root id="src.c.gdal.dir" name="GDAL/Proj4 JNI"/>
             </source-roots>
             <test-roots>
-                <root id="test.webapp.dir" name="Test web application"/>
                 <root id="test.console.dir" name="Test Console"/>
-                <root id="test.portrayal.dir" name="Test Portrayal"/>
                 <root id="test.earth-obs.dir" name="Test Earth observation"/>
                 <root id="test.geotiff.dir" name="Test GeoTIFF"/>
                 <root id="test.netcdf.dir" name="Test NetCDF"/>
-                <root id="test.shapefile.dir" name="Test Shapefile"/>
                 <root id="test.sql.dir" name="Test SQLStore"/>
                 <root id="test.xmlstore.dir" name="Test XMLStore"/>
                 <root id="test.storage.dir" name="Test Storage"/>
diff --git a/storage/pom.xml b/storage/pom.xml
index f463662..436c982 100644
--- a/storage/pom.xml
+++ b/storage/pom.xml
@@ -164,7 +164,6 @@
        =========================================================== -->
   <modules>
     <module>sis-storage</module>
-    <module>sis-shapefile</module>
     <module>sis-xmlstore</module>
     <module>sis-sqlstore</module>
     <module>sis-netcdf</module>
diff --git a/storage/sis-shapefile/pom.xml b/storage/sis-shapefile/pom.xml
deleted file mode 100644
index 4b88aee..0000000
--- a/storage/sis-shapefile/pom.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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 xmlns              = "http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi          = "http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
-                               http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sis</groupId>
-    <artifactId>storage</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-
-   <!-- ===========================================================
-           Module Description
-       =========================================================== -->
-  <groupId>org.apache.sis.storage</groupId>
-  <artifactId>sis-shapefile</artifactId>
-  <name>Apache SIS Shapefile storage</name>
-  <description>
-    Read and write files in the Shapefile format.
-  </description>
-
-
-  <!-- ===========================================================
-           Developers and Contributors
-       =========================================================== -->
-  <developers>
-    <developer>
-      <name>Travis L. Pinney</name>
-      <id>tlpinney</id>
-      <email>travis.pinney@gmail.com</email>
-      <roles>
-        <role>developer</role>
-      </roles>
-    </developer>
-  </developers>
-
-
-  <!-- ===========================================================
-           Build configuration
-       =========================================================== -->
-  <build>
-    <plugins>
-
-      <!-- Compile properties files into resources UTF files. -->
-      <plugin>
-        <groupId>org.apache.sis.core</groupId>
-        <artifactId>sis-build-helper</artifactId>
-        <version>${sis.plugin.version}</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>compile-resources</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <!-- Anticipation for Java 9 -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Automatic-Module-Name>
-                org.apache.sis.storage.shapefile
-              </Automatic-Module-Name>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <executions>
-          <execution>
-            <configuration>
-              <skip>true</skip>         <!-- Java code formatting in this module is different than other modules. -->
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-
-  <!-- ===========================================================
-           Dependencies
-       =========================================================== -->
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-feature</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.storage</groupId>
-      <artifactId>sis-storage</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.esri.geometry</groupId>
-      <artifactId>esri-geometry-api</artifactId>
-      <optional>false</optional>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/AutoChecker.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/AutoChecker.java
deleted file mode 100644
index abf386f..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/AutoChecker.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.sis.internal.shapefile;
-
-import java.lang.reflect.Constructor;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.Objects;
-import java.util.ResourceBundle;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.sis.util.logging.Logging;
-
-
-/**
- * Base class for objets having auto-checking abilities
- * and easy access to Bundle and logging function.
- * @author Marc LE BIHAN
- */
-public abstract class AutoChecker {
-    /** Logger. */
-    private static Logger LOGGER = Logging.getLogger(AutoChecker.class);
-
-    /**
-     * Format a resource bundle message.
-     *
-     * @param classForResourceBundleName class from which ResourceBundle name will be extracted.
-     * @param key Message key.
-     * @param args Message arguments.
-     * @return Message.
-     */
-    final protected String format(Class<?> classForResourceBundleName, String key, Object... args) {
-        Objects.requireNonNull(classForResourceBundleName, "Class from with the ResourceBundle name is extracted cannot be null.");
-        Objects.requireNonNull(key, "Message key cannot be bull.");
-
-        Class<?> candidateClass = classForResourceBundleName;
-        MessageFormat format = null;
-
-        // Find the key in the bundle having for name this class, or in one of its superclasses.
-        do {
-            try {
-                ResourceBundle rsc = ResourceBundle.getBundle(candidateClass.getName());
-                format = new MessageFormat(rsc.getString(key));
-            }
-            catch(MissingResourceException e) {
-                candidateClass = candidateClass.getSuperclass();
-            }
-        }
-        while(candidateClass != null && format == null);
-
-        if (format == null) {
-            String fmt = "Cannot find property key {0} in {1} properties file or any of its superclasses.";
-            String message = MessageFormat.format(fmt, key, classForResourceBundleName.getName());
-            throw new MissingResourceException(message, classForResourceBundleName.getName(), key);
-        }
-        else
-            return format.format(args);
-    }
-
-    /**
-     * Format a resource bundle message.
-     *
-     * @param key Message key.
-     * @param args Message arguments.
-     * @return Message.
-     */
-    final protected String format(String key, Object... args) {
-        return format(getClass(), key, args);
-    }
-
-    /**
-     * Format a resource bundle message and before returning it, log it.
-     *
-     * @param logLevel Log Level.
-     * @param key Message key.
-     * @param args Message arguments.
-     * @return Message.
-     */
-    final protected String format(Level logLevel, String key, Object... args) {
-        Objects.requireNonNull(logLevel, "The log level cannot be null.");
-
-        String message = format(key, args);
-        LOGGER.log(logLevel, message);
-        return(message);
-    }
-
-    /**
-     * Format a resource bundle message and before returning it, log it.
-     *
-     * @param classForResourceBundleName class from which ResourceBundle name will be extracted.
-     * @param logLevel Log Level.
-     * @param key Message key.
-     * @param args Message arguments.
-     * @return Message.
-     */
-    final protected String format(Level logLevel, Class<?> classForResourceBundleName, String key, Object... args) {
-        Objects.requireNonNull(logLevel, "The log level cannot be null.");
-
-        String message = format(classForResourceBundleName, key, args);
-        LOGGER.log(logLevel, message);
-        return(message);
-    }
-
-    /**
-     * Tells if the logger of the base class will log this level of log.
-     * @param level Wished level of logging.
-     * @return true if it will log it.
-     */
-    protected boolean isLoggable(Level level) {
-        return LOGGER.isLoggable(level);
-    }
-
-    /**
-     * Logs (and take the time to format an entry log) only if the logger accepts the message.
-     * @param logLevel Log level.
-     * @param key Message key.
-     * @param args Message arguments.
-     */
-    final protected void log(Level logLevel, String key, Object... args) {
-        Objects.requireNonNull(logLevel, "The log level cannot be null.");
-
-        if (LOGGER.isLoggable(logLevel))
-            format(logLevel, key, args);
-    }
-
-    /**
-     * Throw an exception by reflection.
-     * @param <E> Class of the exception to build.
-     * @param classException Class of the exception to build.
-     * @param message Exception message.
-     * @param cause Exception root cause.
-     * @throws E wished exception.
-     */
-    public static <E extends Throwable> void throwException(Class<E> classException, String message, Throwable cause) throws E {
-       throw(exception(classException, message, cause));
-    }
-
-    /**
-     * Build an exception by reflection.
-     * @param <E> Class of the exception to build.
-     * @param classException Class of the exception to build.
-     * @param message Exception message.
-     * @param cause Exception root cause.
-     * @return E wished exception.
-     */
-    private static <E extends Throwable> E exception(Class<E> classException, String message, Throwable cause) {
-       Objects.requireNonNull(classException, "The class of the exception to throw cannot be null."); //$NON-NLS-1$
-
-       try
-       {
-            Constructor<E> cstr = classException.getConstructor(String.class, Throwable.class);
-            E exception = cstr.newInstance(message, cause);
-            return(exception);
-       }
-       catch(Exception e) {
-            // Create the error message manually to avoid re-entrance in function of this class, that if it has a trouble here could have also a problem everywhere.
-            String format = "The exception of class {0} (message ''{1}'') can''t be created by reflection. An exception of class {2} happened with the message {3}.";
-            String msg = MessageFormat.format(format, classException.getName(), message, e.getClass().getName(), e.getMessage());
-            throw new RuntimeException(msg, e);
-       }
-    }
-
-    /**
-     * Return the class logger.
-     * @return logger.
-     */
-    public Logger getLogger() {
-        return LOGGER;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLInvalidRecordNumberForDirectAccessException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLInvalidRecordNumberForDirectAccessException.java
deleted file mode 100644
index ec5642c..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLInvalidRecordNumberForDirectAccessException.java
+++ /dev/null
@@ -1,65 +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.sis.internal.shapefile;
-
-import java.sql.SQLNonTransientException;
-
-
-/**
- * Thrown when a record number is invalid to do a direct access in a Shapefile or a DBase III file.
- *
- * @author  Marc Le Bihan
- * @version 0.7
- * @since   0.7
- * @module
- */
-public class SQLInvalidRecordNumberForDirectAccessException extends SQLNonTransientException {
-    /** Serial UID. */
-    private static final long serialVersionUID = 6828362742568015813L;
-    
-    /** Wrong record number. */
-    private int wrongRecordNumber;
-
-    /**
-     * Construct an exception.
-     * @param number Wrong record number value.
-     * @param message Message of the exception.
-     */
-    public SQLInvalidRecordNumberForDirectAccessException(int number, String message) {
-        super(message);
-        this.wrongRecordNumber = number;
-    }
-
-    /**
-     * Construct an exception.
-     * @param number Wrong record number value.
-     * @param message Message of the exception.
-     * @param cause Root cause of the exception.
-     */
-    public SQLInvalidRecordNumberForDirectAccessException(int number, String message, Throwable cause) {
-        super(message, cause);
-        this.wrongRecordNumber = number;
-    }
-    
-    /**
-     * Returns the wrong record number value.
-     * @return Record number.
-     */
-    public int getWrongRecordNumber() {
-        return this.wrongRecordNumber;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLNoDirectAccessAvailableException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLNoDirectAccessAvailableException.java
deleted file mode 100644
index a0b4d60..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLNoDirectAccessAvailableException.java
+++ /dev/null
@@ -1,50 +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.sis.internal.shapefile;
-
-import java.sql.SQLNonTransientException;
-
-
-/**
- * Thrown when a shapefile or a DBase III file cannot allow a direct acces (because it has no index).
- *
- * @author  Marc Le Bihan
- * @version 0.7
- * @since   0.7
- * @module
- */
-public class SQLNoDirectAccessAvailableException extends SQLNonTransientException {
-    /** Serial UID. */
-    private static final long serialVersionUID = 16719558033196219L;
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     */
-    public SQLNoDirectAccessAvailableException(String message) {
-        super(message);
-    }
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     * @param cause Root cause of the exception.
-     */
-    public SQLNoDirectAccessAvailableException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLShapefileNotFoundException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLShapefileNotFoundException.java
deleted file mode 100644
index 22aa585..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/SQLShapefileNotFoundException.java
+++ /dev/null
@@ -1,50 +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.sis.internal.shapefile;
-
-import java.sql.SQLNonTransientException;
-
-
-/**
- * Thrown when a shapefile has not been found.
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class SQLShapefileNotFoundException extends SQLNonTransientException {
-    /** Serial UID. */
-    private static final long serialVersionUID = -3235671561698931817L;
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     */
-    public SQLShapefileNotFoundException(String message) {
-        super(message);
-    }
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     * @param cause Root cause of the exception.
-     */
-    public SQLShapefileNotFoundException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileByteReader.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileByteReader.java
deleted file mode 100644
index 5e8787f..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileByteReader.java
+++ /dev/null
@@ -1,466 +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.sis.internal.shapefile;
-
-import java.io.*;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.text.MessageFormat;
-import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.sis.feature.DefaultAttributeType;
-import org.apache.sis.feature.DefaultFeatureType;
-import org.apache.sis.internal.shapefile.jdbc.*;
-import org.apache.sis.storage.shapefile.InvalidShapefileFormatException;
-import org.apache.sis.storage.shapefile.ShapeTypeEnum;
-import org.apache.sis.feature.AbstractFeature;
-import org.apache.sis.util.logging.Logging;
-
-import com.esri.core.geometry.*;
-
-/**
- * Reader of a Shapefile Binary content by the way of a {@link java.nio.MappedByteBuffer}
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class ShapefileByteReader extends CommonByteReader<InvalidShapefileFormatException, SQLShapefileNotFoundException> {
-    /** Name of the Geometry field. */
-    private static final String GEOMETRY_NAME = "geometry";
-
-    /** Shapefile descriptor. */
-    private ShapefileDescriptor shapefileDescriptor;
-
-    /** Database Field descriptors. */
-    private List<DBase3FieldDescriptor> databaseFieldsDescriptors;
-
-    /** Type of the features contained in this shapefile. */
-    private DefaultFeatureType featuresType;
-
-    /** Shapefile index. */
-    private File shapeFileIndex;
-
-    /** Shapefile indexes (loaded from .SHX file, if any found). */
-    private ArrayList<Integer> indexes;
-
-    /** Shapefile records lengths (loaded from .SHX file, if any found). */
-    private ArrayList<Integer> recordsLengths;
-
-    /**
-     * Construct a shapefile byte reader.
-     * @param shapefile Shapefile.
-     * @param dbaseFile underlying database file name.
-     * @param shapefileIndex Shapefile index, if any. Null else.
-     * @throws InvalidShapefileFormatException if the shapefile format is invalid.
-     * @throws SQLInvalidDbaseFileFormatException if the database file format is invalid.
-     * @throws SQLShapefileNotFoundException if the shapefile has not been found.
-     * @throws SQLDbaseFileNotFoundException if the database file has not been found.
-     */
-    public ShapefileByteReader(File shapefile, File dbaseFile, File shapefileIndex) throws InvalidShapefileFormatException, SQLInvalidDbaseFileFormatException, SQLShapefileNotFoundException, SQLDbaseFileNotFoundException {
-        super(shapefile, InvalidShapefileFormatException.class, SQLShapefileNotFoundException.class);
-        this.shapeFileIndex = shapefileIndex;
-
-        loadDatabaseFieldDescriptors(dbaseFile);
-        loadDescriptor();
-
-        if (this.shapeFileIndex != null) {
-            loadShapefileIndexes();
-        }
-
-        this.featuresType = getFeatureType(shapefile.getName());
-    }
-
-    /**
-     * Returns the DBase 3 fields descriptors.
-     * @return Fields descriptors.
-     */
-    public List<DBase3FieldDescriptor> getFieldsDescriptors() {
-        return this.databaseFieldsDescriptors;
-    }
-
-    /**
-     * Returns the shapefile descriptor.
-     * @return Shapefile descriptor.
-     */
-    public ShapefileDescriptor getShapefileDescriptor() {
-        return this.shapefileDescriptor;
-    }
-
-    /**
-     * Returns the type of the features contained in this shapefile.
-     * @return Features type.
-     */
-    public DefaultFeatureType getFeaturesType() {
-        return this.featuresType;
-    }
-
-    /**
-     * Create a feature descriptor.
-     * @param name Name of the field.
-     * @return The feature type.
-     */
-    private DefaultFeatureType getFeatureType(final String name) {
-        Objects.requireNonNull(name, "The feature name cannot be null.");
-
-        final int n = this.databaseFieldsDescriptors.size();
-        final DefaultAttributeType<?>[] attributes = new DefaultAttributeType<?>[n + 1];
-        final Map<String, Object> properties = new HashMap<>(4);
-
-        // Load data field.
-        for (int i = 0; i < n; i++) {
-            properties.put(DefaultAttributeType.NAME_KEY, this.databaseFieldsDescriptors.get(i).getName());
-            attributes[i] = new DefaultAttributeType<>(properties, String.class, 1, 1, null);
-        }
-
-        // Add geometry field.
-        properties.put(DefaultAttributeType.NAME_KEY, GEOMETRY_NAME);
-        attributes[n] = new DefaultAttributeType<>(properties, Geometry.class, 1, 1, null);
-
-        // Add name.
-        properties.put(DefaultAttributeType.NAME_KEY, name);
-        return new DefaultFeatureType(properties, false, null, attributes);
-    }
-
-    /**
-     * Load shapefile descriptor.
-     */
-    private void loadDescriptor() {
-        this.shapefileDescriptor = new ShapefileDescriptor(getByteBuffer());
-    }
-
-    /**
-     * Load shapefile indexes.
-     * @return true if shapefile indexes has been read,
-     * false if none where available or a problem occured.
-     */
-    private boolean loadShapefileIndexes() {
-        if (this.shapeFileIndex == null) {
-            return false;
-        }
-
-        try(FileInputStream fis = new FileInputStream(this.shapeFileIndex); FileChannel fc = fis.getChannel()) {
-            try {
-                int fsize = (int)fc.size();
-                MappedByteBuffer indexesByteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fsize);
-
-                // Indexes entries follow.
-                this.indexes = new ArrayList<>();
-                this.recordsLengths = new ArrayList<>();
-                indexesByteBuffer.position(100);
-                indexesByteBuffer.order(ByteOrder.BIG_ENDIAN);
-
-                while(indexesByteBuffer.hasRemaining()) {
-                    this.indexes.add(indexesByteBuffer.getInt());        // Data offset : the position of the record in the main shapefile, expressed in words (16 bits).
-                    this.recordsLengths.add(indexesByteBuffer.getInt()); // Length of this shapefile record.
-                }
-
-                log(Level.INFO, "log.index_has_been_read", this.shapeFileIndex.getAbsolutePath(), this.indexes.size(), this.getFile().getAbsolutePath());
-                return true;
-            }
-            catch(IOException e) {
-                log(Level.WARNING, "log.invalid_file_content_for_shapefile_index", this.shapeFileIndex.getAbsolutePath(), e.getMessage());
-                this.shapeFileIndex = null;
-                return false;
-            }
-        }
-        catch(FileNotFoundException e) {
-            log(Level.WARNING, "log.no_shapefile_index_found_at_location", this.shapeFileIndex.getAbsolutePath(), this.getFile().getAbsolutePath());
-            this.shapeFileIndex = null;
-            return false;
-        }
-        catch(IOException e) {
-            log(Level.WARNING, "log.invalid_file_content_for_shapefile_index", this.shapeFileIndex.getAbsolutePath(), e.getMessage());
-            this.shapeFileIndex = null;
-            return false;
-        }
-    }
-
-    /**
-     * Load database field descriptors.
-     * @param dbaseFile Database file.
-     * @throws SQLInvalidDbaseFileFormatException if the database format is incorrect.
-     * @throws SQLDbaseFileNotFoundException if the database file cannot be found.
-     */
-    private void loadDatabaseFieldDescriptors(File dbaseFile) throws SQLInvalidDbaseFileFormatException, SQLDbaseFileNotFoundException {
-        MappedByteReader databaseReader = null;
-
-        try {
-            databaseReader = new MappedByteReader(dbaseFile, null);
-            this.databaseFieldsDescriptors = databaseReader.getFieldsDescriptors();
-        }
-        finally {
-            if (databaseReader != null) {
-                try {
-                    databaseReader.close();
-                }
-                catch(IOException e) {
-                }
-            }
-        }
-    }
-
-    /**
-     * Direct access to a feature by its record number.
-     * @param recordNumber Record number.
-     * @throws SQLNoDirectAccessAvailableException if this shape file doesn't allow direct acces, because it has no index.
-     * @throws SQLInvalidRecordNumberForDirectAccessException if the record number asked for is invalid (below the start, after the end).
-     */
-    public void setRowNum(int recordNumber) throws SQLNoDirectAccessAvailableException, SQLInvalidRecordNumberForDirectAccessException {
-        // Check that the asked record number is not before the first.
-        if (recordNumber < 1) {
-            String message = format(Level.SEVERE, "excp.wrong_direct_access_before_start", recordNumber, getFile().getAbsolutePath());
-            throw new SQLInvalidRecordNumberForDirectAccessException(recordNumber, message);
-        }
-
-        // Check that the shapefile allows direct access : it won't if it has no index.
-        if (this.shapeFileIndex == null) {
-            String message = format(Level.SEVERE, "excp.no_direct_access", getFile().getAbsolutePath());
-            throw new SQLNoDirectAccessAvailableException(message);
-        }
-
-        int position = this.indexes.get(recordNumber - 1) * 2; // Indexes unit are words (16 bits).
-
-        // Check that the asked record number is not after the last.
-        if (position >= this.getByteBuffer().capacity()) {
-            String message = format(Level.SEVERE, "excp.wrong_direct_access_after_last", recordNumber, getFile().getAbsolutePath());
-            throw new SQLInvalidRecordNumberForDirectAccessException(recordNumber, message);
-        }
-
-        try {
-            getByteBuffer().position(position);
-        }
-        catch(IllegalArgumentException e) {
-            String message = format(Level.SEVERE, "assert.wrong_position", recordNumber, position, getFile().getAbsolutePath(), e.getMessage());
-            throw new RuntimeException(message, e);
-        }
-    }
-
-    /**
-     * Complete a feature with shapefile content.
-     * @param feature Feature to complete.
-     * @throws InvalidShapefileFormatException if a validation problem occurs.
-     */
-    public void completeFeature(AbstractFeature feature) throws InvalidShapefileFormatException {
-        // insert points into some type of list
-        int RecordNumber = getByteBuffer().getInt();
-        @SuppressWarnings("unused")
-        int ContentLength = getByteBuffer().getInt();
-
-        getByteBuffer().order(ByteOrder.LITTLE_ENDIAN);
-        int iShapeType = getByteBuffer().getInt();
-
-        ShapeTypeEnum type = ShapeTypeEnum.get(iShapeType);
-
-        if (type == null)
-            throw new InvalidShapefileFormatException(MessageFormat.format("The shapefile feature type {0} doesn''t match to any known feature type.", this.featuresType));
-
-        switch (type) {
-            case Point:
-                loadPointFeature(feature);
-                break;
-
-            case Polygon:
-                loadPolygonFeature(feature);
-                break;
-
-            case PolyLine:
-                loadPolylineFeature(feature);
-                break;
-
-            default:
-                throw new InvalidShapefileFormatException("Unsupported shapefile type: " + iShapeType);
-        }
-
-        getByteBuffer().order(ByteOrder.BIG_ENDIAN);
-    }
-
-    /**
-     * Load point feature.
-     * @param feature Feature to fill.
-     */
-    private void loadPointFeature(AbstractFeature feature) {
-        double x = getByteBuffer().getDouble();
-        double y = getByteBuffer().getDouble();
-        Point pnt = new Point(x, y);
-        feature.setPropertyValue(GEOMETRY_NAME, pnt);
-    }
-
-    /**
-     * Load polygon feature.
-     * @param feature Feature to fill.
-     */
-    private void loadPolygonFeature(AbstractFeature feature) {
-        /* double xmin = */getByteBuffer().getDouble();
-        /* double ymin = */getByteBuffer().getDouble();
-        /* double xmax = */getByteBuffer().getDouble();
-        /* double ymax = */getByteBuffer().getDouble();
-        int numParts = getByteBuffer().getInt();
-        int numPoints = getByteBuffer().getInt();
-
-        Polygon poly;
-
-        // Handle multiple polygon parts.
-        if (numParts > 1) {
-            Logger log = Logging.getLogger(ShapefileByteReader.class);
-
-            if (log.isLoggable(Level.FINER)) {
-                String format = "Polygon with multiple linear rings encountered at position {0,number} with {1,number} parts.";
-                String message = MessageFormat.format(format, getByteBuffer().position(), numParts);
-                log.finer(message);
-            }
-
-            poly = readMultiplePolygonParts(numParts, numPoints);
-        }
-        else {
-            // Polygon with an unique part.
-            poly = readUniquePolygonPart(numPoints);
-        }
-
-        feature.setPropertyValue(GEOMETRY_NAME, poly);
-    }
-
-    /**
-     * Read a polygon that has a unique part.
-     * @param numPoints Number of the points of the polygon.
-     * @return Polygon.
-     */
-    @Deprecated // As soon as the readMultiplePolygonParts method proofs working well, this readUniquePolygonPart method can be removed and all calls be deferred to readMultiplePolygonParts.
-    private Polygon readUniquePolygonPart(int numPoints) {
-        /*int part = */ getByteBuffer().getInt();
-        Polygon poly = new Polygon();
-
-        // create a line from the points
-        double xpnt = getByteBuffer().getDouble();
-        double ypnt = getByteBuffer().getDouble();
-
-        poly.startPath(xpnt, ypnt);
-
-        for (int j = 0; j < numPoints - 1; j++) {
-            xpnt = getByteBuffer().getDouble();
-            ypnt = getByteBuffer().getDouble();
-            poly.lineTo(xpnt, ypnt);
-        }
-
-        return poly;
-    }
-
-    /**
-     * Read a polygon that has multiple parts.
-     * @param numParts Number of parts of this polygon.
-     * @param numPoints Total number of points of this polygon, all parts considered.
-     * @return a multiple part polygon.
-     */
-    private Polygon readMultiplePolygonParts(int numParts, int numPoints) {
-        /**
-         * From ESRI Specification :
-         * Parts : 0 5  (meaning : 0 designs the first v1, 5 designs the first v5 on the points list below).
-         * Points : v1 v2 v3 v4 v1 v5 v8 v7 v6 v5
-         *
-         * POSITION  FIELD       VALUE      TYPE      NUMBER     ORDER
-         * Byte 0    Shape Type  5          Integer   1          Little
-         * Byte 4    Box         Box        Double    4          Little
-         * Byte 36   NumParts    NumParts   Integer   1          Little
-         * Byte 40   NumPoints   NumPoints  Integer   1          Little
-         * Byte 44   Parts       Parts      Integer   NumParts   Little
-         * Byte X    Points      Points     Point     NumPoints  Little
-         */
-        int[] partsIndexes = new int[numParts];
-
-        // Read all the parts indexes (starting at byte 44).
-        for(int index=0; index < numParts; index ++) {
-            partsIndexes[index] = getByteBuffer().getInt();
-        }
-
-        // Read all the points.
-        double[] xPoints = new double[numPoints];
-        double[] yPoints = new double[numPoints];
-
-        for(int index=0; index < numPoints; index ++) {
-            xPoints[index] = getByteBuffer().getDouble();
-            yPoints[index] = getByteBuffer().getDouble();
-        }
-
-        // Create the polygon from the points.
-        Polygon poly = new Polygon();
-
-        // create a line from the points
-        for(int index=0; index < numPoints; index ++) {
-            // Check if this index is one that begins a new part.
-            boolean newPolygon = false;
-
-            for(int j=0; j < partsIndexes.length; j ++) {
-                if (partsIndexes[j] == index) {
-                    newPolygon = true;
-                    break;
-                }
-            }
-
-            if (newPolygon) {
-                poly.startPath(xPoints[index], yPoints[index]);
-            }
-            else {
-                poly.lineTo(xPoints[index], yPoints[index]);
-            }
-        }
-
-        return poly;
-    }
-
-    /**
-     * Load polyline feature.
-     * @param feature Feature to fill.
-     */
-    private void loadPolylineFeature(AbstractFeature feature) {
-        /* double xmin = */getByteBuffer().getDouble();
-        /* double ymin = */getByteBuffer().getDouble();
-        /* double xmax = */getByteBuffer().getDouble();
-        /* double ymax = */getByteBuffer().getDouble();
-
-        int NumParts = getByteBuffer().getInt();
-        int NumPoints = getByteBuffer().getInt();
-
-        int[] NumPartArr = new int[NumParts + 1];
-
-        for (int n = 0; n < NumParts; n++) {
-            int idx = getByteBuffer().getInt();
-            NumPartArr[n] = idx;
-        }
-        NumPartArr[NumParts] = NumPoints;
-
-        double xpnt, ypnt;
-        Polyline ply = new Polyline();
-
-        for (int m = 0; m < NumParts; m++) {
-            xpnt = getByteBuffer().getDouble();
-            ypnt = getByteBuffer().getDouble();
-            ply.startPath(xpnt, ypnt);
-
-            for (int j = NumPartArr[m]; j < NumPartArr[m + 1] - 1; j++) {
-                xpnt = getByteBuffer().getDouble();
-                ypnt = getByteBuffer().getDouble();
-                ply.lineTo(xpnt, ypnt);
-            }
-        }
-
-        feature.setPropertyValue(GEOMETRY_NAME, ply);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileDescriptor.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileDescriptor.java
deleted file mode 100644
index 9c6318f..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/ShapefileDescriptor.java
+++ /dev/null
@@ -1,201 +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.sis.internal.shapefile;
-
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-
-import org.apache.sis.storage.shapefile.ShapeTypeEnum;
-
-/**
- * Shapefile Descriptor.
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class ShapefileDescriptor {
-    /** File code. */
-    private int fileCode; // big
-
-    /** File length. */
-    private int fileLength; // big // The value for file length is the total length of the file in 16-bit words
-
-    /** File version. */
-    private int version; // little
-
-    /** Shapefile type. */
-    private ShapeTypeEnum shapeType; // little
-
-    /** X Min. */
-    private double xmin; // little
-
-    /** Y Min. */
-    private double ymin; // little
-
-    /** X Max. */
-    private double xmax; // little
-
-    /** Y Max. */
-    private double ymax; // little
-
-    /** Z Min. */
-    private double zmin; // little
-
-    /** Z Max. */
-    private double zmax; // little
-
-    /** M Min. */
-    private double mmin; // little
-
-    /** M Max. */
-    private double mmax; // little
-
-    /**
-     * Create a shapefile descriptor.
-     * @param byteBuffer Source Bytebuffer.
-     */
-    public ShapefileDescriptor(MappedByteBuffer byteBuffer) {
-        this.fileCode = byteBuffer.getInt();
-        byteBuffer.getInt();
-        byteBuffer.getInt();
-        byteBuffer.getInt();
-        byteBuffer.getInt();
-        byteBuffer.getInt();
-        this.fileLength = byteBuffer.getInt() * 2;
-
-        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-        this.version = byteBuffer.getInt();
-        this.shapeType = ShapeTypeEnum.get(byteBuffer.getInt());
-        this.xmin = byteBuffer.getDouble();
-        this.ymin = byteBuffer.getDouble();
-        this.xmax = byteBuffer.getDouble();
-        this.ymax = byteBuffer.getDouble();
-        this.zmin = byteBuffer.getDouble();
-        this.zmax = byteBuffer.getDouble();
-        this.mmin = byteBuffer.getDouble();
-        this.mmax = byteBuffer.getDouble();
-        byteBuffer.order(ByteOrder.BIG_ENDIAN);
-
-        //dbf.byteBuffer.get(); // should be 0d for field terminator
-    }
-
-    /**
-     * Returns the version of the shapefile.
-     * @return Version.
-     */
-    public int getVersion() {
-        return this.version;
-    }
-
-    /**
-     * Returns the ESRI shape type in the shapefile.
-     * @return Shape type.
-     */
-    public ShapeTypeEnum getShapeType() {
-        return this.shapeType;
-    }
-
-    /**
-     * Returns the X Min property.
-     * @return XMin.
-     */
-    public double getXmin() {
-        return this.xmin;
-    }
-
-    /**
-     * Returns the Y Min property.
-     * @return YMin.
-     */
-    public double getYmin() {
-        return this.ymin;
-    }
-
-    /**
-     * Returns the X Max property.
-     * @return XMax.
-     */
-    public double getXmax() {
-        return this.xmax;
-    }
-
-    /**
-     * Returns the Y Max property.
-     * @return YMax.
-     */
-    public double getYmax() {
-        return this.ymax;
-    }
-
-    /**
-     * Returns the Z Min property.
-     * @return ZMin.
-     */
-    public double getZmin() {
-        return this.zmin;
-    }
-
-    /**
-     * Returns the Z Max property.
-     * @return ZMax.
-     */
-    public double getZmax() {
-        return this.zmax;
-    }
-
-    /**
-     * Returns the M Min property. 
-     * @return M min.
-     */
-    public double getMmin() {
-        return this.mmin;
-    }
-    
-    /**
-     * Returns the M Max property.
-     * @return M Max.
-     */
-    public double getMmax(){
-        return this.mmax;
-    }
-
-    /**
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        StringBuilder s = new StringBuilder();
-        String lineSeparator = System.getProperty("line.separator", "\n");
-
-        s.append("FileCode: ").append(this.fileCode).append(lineSeparator);
-        s.append("FileLength: ").append(this.fileLength).append(lineSeparator);
-        s.append("Version: ").append(this.version).append(lineSeparator);
-        s.append("ShapeType: ").append(this.shapeType).append(lineSeparator);
-        s.append("xmin: ").append(this.xmin).append(lineSeparator);
-        s.append("ymin: ").append(this.ymin).append(lineSeparator);
-        s.append("xmax: ").append(this.xmax).append(lineSeparator);
-        s.append("ymax: ").append(this.ymax).append(lineSeparator);
-        s.append("zmin: ").append(this.zmin).append(lineSeparator);
-        s.append("zmax: ").append(this.zmax).append(lineSeparator);
-        s.append("mmin: ").append(this.mmin).append(lineSeparator);
-        s.append("mmax: ").append(this.mmax).append(lineSeparator);
-        s.append("------------------------").append(lineSeparator);
-
-        return s.toString();
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractDbase3ByteReader.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractDbase3ByteReader.java
deleted file mode 100644
index d05aec9..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractDbase3ByteReader.java
+++ /dev/null
@@ -1,283 +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.sis.internal.shapefile.jdbc;
-
-import java.io.File;
-import java.nio.charset.Charset;
-import java.nio.charset.UnsupportedCharsetException;
-import java.text.MessageFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Objects;
-import java.util.logging.Level;
-
-/**
- * The Abstract Byte Reader.
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-abstract class AbstractDbase3ByteReader extends CommonByteReader<SQLInvalidDbaseFileFormatException, SQLDbaseFileNotFoundException> implements Dbase3ByteReader {
-    /** First data record position, in bytes. */
-    protected short firstRecordPosition;
-
-    /** Size of one record, in bytes. */
-    protected short recordLength;
-
-    /** Reserved (dBASE IV) Filled with 00h. */
-    protected byte[] reservedFiller1 = new byte[2];
-
-    /**
-     * Reserved : Incomplete transaction (dBASE IV).
-     * 00h : Transaction ended (or rolled back).
-     * 01h : Transaction started.
-     */
-    protected byte reservedIncompleteTransaction;
-
-    /**
-     * Reserved : Encryption flag (dBASE IV).
-     * 00h : Not encrypted.
-     * 01h : Data encrypted.
-     */
-    protected byte reservedEncryptionFlag;
-
-    /** Reserved : Free record thread (for LAN only). */
-    protected byte[] reservedFreeRecordThread = new byte[4];
-
-    /** Reserved : For multi-user (DBase 3+). */
-    protected byte[] reservedMultiUser = new byte[8];
-
-    /** Reserved : MDX flag (dBASE IV). */
-    protected byte reservedMDXFlag;
-
-    /** Binary code page value. */
-    protected byte codePage;
-
-    /** Reserved (dBASE IV) Filled with 00h. */
-    protected byte[] reservedFiller2 = new byte[2];
-
-    /** Marks the end of the descriptor : must be 0x0D. */
-    protected byte descriptorTerminator;
-
-    /** Valid dBASE III PLUS table file (03h without a memo .DBT file; 83h with a memo). */
-    protected byte dbaseVersion;
-
-    /** Number of records in the table. */
-    protected int rowCount;
-
-    /** Database charset. */
-    protected Charset charset;
-
-    /** Date of last update; in YYMMDD format. */
-    protected byte[] dbaseLastUpdate = new byte[3];
-
-    /**
-     * Map a dbf file.
-     * @param file Database file.
-     * @throws SQLDbaseFileNotFoundException if the DBF file has not been found.
-     * @throws SQLInvalidDbaseFileFormatException if the database has an invalid format.
-     */
-    public AbstractDbase3ByteReader(File file) throws SQLDbaseFileNotFoundException, SQLInvalidDbaseFileFormatException {
-        super(file, SQLInvalidDbaseFileFormatException.class, SQLDbaseFileNotFoundException.class);
-    }
-
-    /**
-     * Returns the charset.
-     * @return Charset.
-     */
-    @Override public Charset getCharset() {
-        return this.charset;
-    }
-
-    /**
-     * Returns the database last update date.
-     * @return Date of the last update.
-     */
-    @Override public Date getDateOfLastUpdate() {
-        return toDate(this.dbaseLastUpdate);
-    }
-
-    /**
-     * Returns the first record position, in bytes, in the DBase file.
-     * @return First record position.
-     */
-    @Override public short getFirstRecordPosition() {
-        return this.firstRecordPosition;
-    }
-
-    /**
-     * Returns the length (in bytes) of one record in this DBase file, including the delete flag.
-     * @return Record length.
-     */
-    @Override public short getRecordLength() {
-        return this.recordLength;
-    }
-
-    /**
-     * Returns the record count.
-     * @return Record count.
-     */
-    @Override public int getRowCount() {
-        return this.rowCount;
-    }
-
-    /**
-     * Convert the binary code page value of the Dbase 3 file to a recent Charset.
-     * @param codePageBinaryValue page code binary value.
-     * @return Charset.
-     * @throws UnsupportedCharsetException if the code page as no representation in recents Charset (legacy DOS or macintosh charsets).
-     */
-    protected Charset toCharset(byte codePageBinaryValue) throws UnsupportedCharsetException {
-        // Attempt to find a known conversion.
-        String dbfCodePage = toCodePage(codePageBinaryValue);
-
-        // If no conversion has been found, decide if the cause is an unsupported value or an illegal value to choose the good exception to return.
-        if (dbfCodePage == null) {
-            switch(Byte.toUnsignedInt(codePageBinaryValue)) {
-                case 0x04: dbfCodePage = "unsupported"; break;
-                case 0x68: dbfCodePage = "unsupported"; break; // Kamenicky (Czech) MS-DOS
-                case 0x69: dbfCodePage = "unsupported"; break; // Mazovia (Polish) MS-DOS
-                case 0x96: dbfCodePage = "unsupported"; break; // russian mac
-                case 0x97: dbfCodePage = "unsupported"; break; // eastern european macintosh
-                case 0x98: dbfCodePage = "unsupported"; break; // greek macintosh
-                case 0xC8: dbfCodePage = "unsupported"; break; // windows ee
-                default: dbfCodePage = "unsupported"; break;
-            }
-        }
-
-        assert dbfCodePage != null;
-
-        // If the code page cannot find a match for a more recent Charset, we wont be able to handle this DBF.
-        if (dbfCodePage.equals("unsupported")) {
-            String message = format(Level.WARNING, "excp.unsupported_codepage", codePageBinaryValue, getFile().getAbsolutePath());
-            throw new UnsupportedCharsetException(message);
-        }
-
-        try {
-            return Charset.forName(dbfCodePage);
-        }
-        catch(IllegalArgumentException e) {
-            // If this happens here, it means that we have selected a wrong charset. We have a bug.
-            String message = format(Level.WARNING, "assert.wrong_charset_selection", dbfCodePage, getFile().getAbsolutePath());
-            throw new RuntimeException(message);
-        }
-    }
-
-    /**
-     * Return a Charset code page from a binary code page value.
-     * @param pageCodeBinaryValue binary code page value.
-     * @return Page code.
-     */
-    private String toCodePage(byte pageCodeBinaryValue) {
-        // From http://trac.osgeo.org/gdal/ticket/2864
-        HashMap<Integer, String> knownConversions = new HashMap<>();
-        knownConversions.put(0x01, "cp437"); //  U.S. MS–DOS
-        knownConversions.put(0x02, "cp850"); // International MS–DOS
-        knownConversions.put(0x03, "cp1252"); // Windows ANSI
-        knownConversions.put(0x08, "cp865"); //  Danish OEM
-        knownConversions.put(0x09, "cp437"); //  Dutch OEM
-        knownConversions.put(0x0a, "cp850"); //  Dutch OEM*
-        knownConversions.put(0x0b, "cp437"); //  Finnish OEM
-        knownConversions.put(0x0d, "cp437"); //  French OEM
-        knownConversions.put(0x0e, "cp850"); //  French OEM*
-        knownConversions.put(0x0f, "cp437"); //  German OEM
-        knownConversions.put(0x10, "cp850"); //  German OEM*
-        knownConversions.put(0x11, "cp437"); //  Italian OEM
-        knownConversions.put(0x12, "cp850"); //  Italian OEM*
-        knownConversions.put(0x13, "cp932"); //  Japanese Shift-JIS
-        knownConversions.put(0x14, "cp850"); //  Spanish OEM*
-        knownConversions.put(0x15, "cp437"); //  Swedish OEM
-        knownConversions.put(0x16, "cp850"); //  Swedish OEM*
-        knownConversions.put(0x17, "cp865"); //  Norwegian OEM
-        knownConversions.put(0x18, "cp437"); //  Spanish OEM
-        knownConversions.put(0x19, "cp437"); //  English OEM (Britain)
-        knownConversions.put(0x1a, "cp850"); //  English OEM (Britain)*
-        knownConversions.put(0x1b, "cp437"); //  English OEM (U.S.)
-        knownConversions.put(0x1c, "cp863"); //  French OEM (Canada)
-        knownConversions.put(0x1d, "cp850"); //  French OEM*
-        knownConversions.put(0x1f, "cp852"); //  Czech OEM
-        knownConversions.put(0x22, "cp852"); //  Hungarian OEM
-        knownConversions.put(0x23, "cp852"); //  Polish OEM
-        knownConversions.put(0x24, "cp860"); //  Portuguese OEM
-        knownConversions.put(0x25, "cp850"); //  Portuguese OEM*
-        knownConversions.put(0x26, "cp866"); //  Russian OEM
-        knownConversions.put(0x37, "cp850"); //  English OEM (U.S.)*
-        knownConversions.put(0x40, "cp852"); //  Romanian OEM
-        knownConversions.put(0x4d, "cp936"); //  Chinese GBK (PRC)
-        knownConversions.put(0x4e, "cp949"); //  Korean (ANSI/OEM)
-        knownConversions.put(0x4f, "cp950"); //  Chinese Big5 (Taiwan)
-        knownConversions.put(0x50, "cp874"); //  Thai (ANSI/OEM)
-        knownConversions.put(0x57, "cp1252"); // ANSI
-        knownConversions.put(0x58, "cp1252"); // Western European ANSI
-        knownConversions.put(0x59, "cp1252"); // Spanish ANSI
-        knownConversions.put(0x64, "cp852"); //  Eastern European MS–DOS
-        knownConversions.put(0x65, "cp866"); //  Russian MS–DOS
-        knownConversions.put(0x66, "cp865"); //  Nordic MS–DOS
-        knownConversions.put(0x67, "cp861"); //  Icelandic MS–DOS
-        knownConversions.put(0x6a, "cp737"); //  Greek MS–DOS (437G)
-        knownConversions.put(0x6b, "cp857"); //  Turkish MS–DOS
-        knownConversions.put(0x6c, "cp863"); //  French–Canadian MS–DOS
-        knownConversions.put(0x78, "cp950"); //  Taiwan Big 5
-        knownConversions.put(0x79, "cp949"); //  Hangul (Wansung)
-        knownConversions.put(0x7a, "cp936"); //  PRC GBK
-        knownConversions.put(0x7b, "cp932"); //  Japanese Shift-JIS
-        knownConversions.put(0x7c, "cp874"); //  Thai Windows/MS–DOS
-        knownConversions.put(0x86, "cp737"); //  Greek OEM
-        knownConversions.put(0x87, "cp852"); //  Slovenian OEM
-        knownConversions.put(0x88, "cp857"); //  Turkish OEM
-        knownConversions.put(0xc8, "cp1250"); // Eastern European Windows
-        knownConversions.put(0xc9, "cp1251"); // Russian Windows
-        knownConversions.put(0xca, "cp1254"); // Turkish Windows
-        knownConversions.put(0xcb, "cp1253"); // Greek Windows
-        knownConversions.put(0xcc, "cp1257"); // Baltic Windows
-
-        return(knownConversions.get(Byte.toUnsignedInt(pageCodeBinaryValue)));
-    }
-
-    /**
-     * Set a charset.
-     * @param cs Charset.
-     */
-    public void setCharset(Charset cs) {
-        this.charset = cs;
-    }
-
-    /**
-     * Return a date from a byte array.
-     * @param yymmdd byte[3] with byte[0] = year (2 digits), [1] = month, [2] = day.
-     * @return Date.
-     */
-    private Date toDate(byte[] yymmdd) {
-        Objects.requireNonNull(yymmdd, "the yymmdd bytes cannot be null");
-
-        if (yymmdd.length != 3)
-            throw new IllegalArgumentException(MessageFormat.format("Database:toDate() works only on a 3 bytes YY MM DD date. this array has {0} length", yymmdd.length));
-
-        Objects.requireNonNull(yymmdd[0], "the year byte cannot be null");
-        Objects.requireNonNull(yymmdd[1], "the month byte cannot be null");
-        Objects.requireNonNull(yymmdd[2], "the day byte cannot be null");
-
-        int year = yymmdd[0] < 70 ? 100 + yymmdd[0] : yymmdd[0];
-        int month = yymmdd[1];
-        int day = yymmdd[2];
-
-        @SuppressWarnings("deprecation") // But everything is deprecated in DBF files...
-        Date date = new Date(year, month, day);
-        return date;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractJDBC.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractJDBC.java
deleted file mode 100644
index 5c12b48..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/AbstractJDBC.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.sis.internal.shapefile.jdbc;
-
-import java.io.File;
-import java.sql.*;
-import java.util.logging.Level;
-
-import org.apache.sis.internal.shapefile.AutoChecker;
-
-
-/**
- * Base class for each JDBC class.
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public abstract class AbstractJDBC extends AutoChecker implements Wrapper {
-    /**
-     * Constructs a new instance of a JDBC interface.
-     */
-    public AbstractJDBC() {
-    }
-
-    /**
-     * Returns the JDBC interface implemented by this class.
-     * This is used for formatting error messages.
-     * @return The JDBC interface implemented by this class.
-     */
-    abstract protected Class<?> getInterface();
-
-    /**
-     * Unsupported by default.
-     * @param iface the type of the wrapped object.
-     * @return The wrapped object.
-     */
-    @Override
-    public <T> T unwrap(Class<T> iface) throws SQLException {
-        throw unsupportedOperation("unwrap", iface);
-    }
-
-    /**
-     * Defaults to {@code null}.
-     * @return SQL Warning.
-     */
-    public SQLWarning getWarnings() {
-        return null;
-    }
-
-    /**
-     * Defaults to nothing, since there is no SQL warning.
-     */
-    public void clearWarnings() {
-    }
-
-    /**
-     * Returns an unsupported operation exception to be thrown.
-     * @param methodOrWishedFeatureName The feature / call the caller attempted.
-     * @return the not supported feature exception.
-     * @throws SQLFeatureNotSupportedException the not supported feature.
-     */
-    public final SQLFeatureNotSupportedException unsupportedOperation(final String methodOrWishedFeatureName) throws SQLFeatureNotSupportedException {
-        String message = format(Level.WARNING, "excp.unsupportedDriverFeature", getInterface(), methodOrWishedFeatureName, getClass().getSimpleName());
-        throw new SQLFeatureNotSupportedException(message);
-    }
-
-    /**
-     * Returns an unsupported operation exception to be thrown : this exception add parameters sent to the method that isn't implemented.
-     * @param methodOrWishedFeatureName The feature / call the caller attempted.
-     * @param args Arguments that where sent to the unimplemented function.
-     * @return the not supported feature exception.
-     * @throws SQLFeatureNotSupportedException the not supported feature.
-     */
-    public final SQLFeatureNotSupportedException unsupportedOperation(final String methodOrWishedFeatureName, Object... args) throws SQLFeatureNotSupportedException {
-        StringBuffer arguments = new StringBuffer();
-
-        for(Object arg : args) {
-            arguments.append(arguments.length() == 0 ? "" : ", ");   // Separator if needed.
-            arguments.append(arg instanceof String ? "\"" : "");     // Enclosing " for String, if needed.
-            arguments.append(arg == null ? "null" : arg.toString()); // String value of the argument.
-            arguments.append(arg instanceof String ? "\"" : "");     // Enclosing " for String, if needed.
-        }
-
-        String message = format(Level.WARNING, "excp.unsupportedDriverFeature_with_arguments", getInterface(), methodOrWishedFeatureName, getClass().getSimpleName(), arguments.toString());
-        throw new SQLFeatureNotSupportedException(message);
-    }
-
-    /**
-     * log a function call in the driver : very verbose.
-     * @param methodName The call the caller attempted.
-     */
-    public void logStep(final String methodName) {
-        log(Level.FINER, "log.step", methodName, getClass().getSimpleName());
-    }
-
-    /**
-     * log a function call in the driver : very verbose.
-     * @param methodName The call the caller attempted.
-     * @param args Arguments that where sent to the unimplemented function.
-     */
-    public void logStep(final String methodName, Object... args) {
-        if (isLoggable(Level.FINER)) { // Avoid resolution of arguments(...) if not needed.
-            log(Level.FINER, "log.step_with_arguments", methodName, getClass().getSimpleName(), arguments(args));
-        }
-    }
-
-    /**
-     * log an unsupported feature as a warning.
-     * @param methodName The call the caller attempted.
-     */
-    public void logUnsupportedOperation(final String methodName) {
-        log(Level.WARNING, "excp.unsupportedDriverFeature", getInterface(), methodName, getClass().getSimpleName());
-    }
-
-    /**
-     * log an unsupported feature as a warning.
-     * @param methodName The call the caller attempted.
-     * @param args Arguments that where sent to the unimplemented function.
-     */
-    public void logUnsupportedOperation(final String methodName, Object... args) {
-        log(Level.WARNING, "excp.unsupportedDriverFeature_with_arguments", getInterface(), methodName, getClass().getSimpleName(), arguments(args));
-    }
-
-    /**
-     * Returns the Database File.
-     * @return Database File.
-     */
-    abstract protected File getFile();
-
-    /**
-     * Concat arguments in a StringBuffer.
-     * @param args arguments.
-     * @return Arguments.
-     */
-    private StringBuffer arguments(Object... args) {
-        StringBuffer arguments = new StringBuffer();
-
-        for(Object arg : args) {
-            arguments.append(arguments.length() == 0 ? "" : ", ");   // Separator if needed.
-            arguments.append(arg instanceof String ? "\"" : "");     // Enclosing " for String, if needed.
-            arguments.append(arg == null ? "null" : arg.toString()); // String value of the argument.
-            arguments.append(arg instanceof String ? "\"" : "");     // Enclosing " for String, if needed.
-        }
-
-        return arguments;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/CommonByteReader.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/CommonByteReader.java
deleted file mode 100644
index e1fadd7..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/CommonByteReader.java
+++ /dev/null
@@ -1,132 +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.sis.internal.shapefile.jdbc;
-
-import java.io.*;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.Objects;
-import java.util.logging.Level;
-
-import org.apache.sis.internal.shapefile.AutoChecker;
-
-/**
- * Common byte reader.
- * @author  Marc Le Bihan
- * @version 0.5
- * @param <InvalidFormatException> Invalid format Exception to throw in case of trouble.
- * @param <FNFException> File not found Exception to throw in case of missing file.
- * @since   0.5
- * @module
- */
-public abstract class CommonByteReader<InvalidFormatException extends Exception, FNFException extends Exception> extends AutoChecker implements AutoCloseable  {
-    /** The File. */
-    private File file;
-
-    /** Input Stream on the DBF. */
-    private FileInputStream fis;
-
-    /** File channel on the file. */
-    private FileChannel fc;
-
-    /** Buffer reader. */
-    private MappedByteBuffer byteBuffer;
-
-    /** Indicates if the byte buffer is closed. */
-    private boolean isClosed = false;
-
-    /** Invalid Exception to throw in case of invalid file format. */
-    private Class<InvalidFormatException> classInvalidFormatException;
-
-    /** Invalid Exception to throw in case of file not found exception. */
-    private Class<FNFException> classFNFException;
-
-    /**
-     * Create and open a byte reader based on a file.
-     * @param f File.
-     * @param invalidFormatException Invalid Exception to throw in case of invalid file format.
-     * @param fileNotFoundException Invalid Exception to throw in case of file not found exception.
-     * @throws FNFException if the file cannot be opened.
-     * @throws InvalidFormatException if the file format is invalid.
-     */
-    public CommonByteReader(File f, Class<InvalidFormatException> invalidFormatException, Class<FNFException> fileNotFoundException) throws FNFException, InvalidFormatException {
-        Objects.requireNonNull(f, "The file cannot be null.");
-        this.classInvalidFormatException = invalidFormatException;
-        this.classFNFException = fileNotFoundException;
-
-        this.file = f;
-
-        try {
-            this.fis = new FileInputStream(this.file);
-        }
-        catch(FileNotFoundException e) {
-            throwException(this.classInvalidFormatException, e.getMessage(), e);
-            throw new RuntimeException("this place should not be reached.");
-        }
-
-        this.fc = this.fis.getChannel();
-
-        try {
-            int fsize = (int)this.fc.size();
-            this.byteBuffer = this.fc.map(FileChannel.MapMode.READ_ONLY, 0, fsize);
-        }
-        catch(IOException e) {
-            String message = format(Level.WARNING, "excp.reader_cannot_be_created", this.file.getAbsolutePath(), e.getMessage());
-            throwException(this.classFNFException, message, e);
-            throw new RuntimeException("this place should not be reached.");
-        }
-   }
-
-    /**
-     * Close the MappedByteReader.
-     * @throws IOException if the close operation fails.
-     */
-    @Override
-    public void close() throws IOException {
-        if (this.fc != null)
-            this.fc.close();
-
-        if (this.fis != null)
-            this.fis.close();
-
-        this.isClosed = true;
-    }
-
-    /**
-     * Returns the closed state of this binary reader.
-     * @return true if it is closed.
-     */
-    public boolean isClosed() {
-        return this.isClosed;
-    }
-
-    /**
-     * Returns the byte buffer.
-     * @return Byte Buffer.
-     */
-    public MappedByteBuffer getByteBuffer() {
-        return this.byteBuffer;
-    }
-
-    /**
-     * Return the file mapped.
-     * @return File.
-     */
-    public File getFile() {
-        return this.file;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBFDriver.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBFDriver.java
deleted file mode 100644
index 198ffa7..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBFDriver.java
+++ /dev/null
@@ -1,145 +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.sis.internal.shapefile.jdbc;
-
-import java.io.File;
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverPropertyInfo;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.sis.internal.shapefile.jdbc.connection.DBFConnection;
-import org.apache.sis.internal.system.Modules;
-
-
-/**
- * Database driver for DBF 3.
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class DBFDriver extends AbstractJDBC implements Driver {
-    /**
-     * Creates a new driver.
-     */
-    public DBFDriver() {
-    }
-
-    /**
-     * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
-     */
-    @Override
-    public boolean isWrapperFor(Class<?> iface) {
-        return iface.isAssignableFrom(getInterface());
-    }
-
-    /**
-     * Returns the JDBC interface implemented by this class.
-     * This is used for formatting error messages.
-     */
-    @Override
-    final protected Class<?> getInterface() {
-        return Driver.class;
-    }
-
-    /**
-     * Attempts to make a database connection to the given filename.
-     *
-     * @param  url  The path to a {@code .dbf} file.
-     * @param  info Properties to ask for special features, behavior, or compatibility.
-     * @return A connection to the given DBF file.
-     * @throws SQLInvalidDbaseFileFormatException if the database file format is invalid.
-     * @throws SQLDbaseFileNotFoundException if the database file doesn't exist.
-     * @throws SQLInvalidDbaseFileFormatException if the database file has a wrong format.
-     */
-    @Override
-    @SuppressWarnings("resource") // the function opens a connection.
-    public Connection connect(final String url, Properties info) throws SQLInvalidDbaseFileFormatException, SQLDbaseFileNotFoundException {
-        Objects.requireNonNull(url, "the DBase3 url cannot be null");
-        File file = new File(url);
-        return new DBFConnection(file, new MappedByteReader(file, info));
-    }
-
-    /**
-     * Returns {@code true} if this driver thinks that it can open the given URL.
-     */
-    @Override
-    public boolean acceptsURL(final String url) {
-        if (!url.endsWith(".dbf")) {
-            return false;
-        }
-
-        final File datafile = new File(url);
-        return datafile.isFile(); // Future version should check for magic number.
-    }
-
-    /**
-     * @see org.apache.sis.internal.shapefile.jdbc.AbstractJDBC#getFile()
-     */
-    @Override protected File getFile() {
-        return null;
-    }
-
-    /**
-     * Gets information about the possible properties for this driver.
-     * The current version has none.
-     */
-    @Override
-    public DriverPropertyInfo[] getPropertyInfo(@SuppressWarnings("unused") String url, @SuppressWarnings("unused") Properties info) {
-        return new DriverPropertyInfo[0];
-    }
-
-    /**
-     * The major version number of this driver.
-     * This is set to the Apache SIS version.
-     */
-    @Override
-    public int getMajorVersion() {
-        return Modules.MAJOR_VERSION;
-    }
-
-    /**
-     * The minor version number of this driver.
-     * This is set to the Apache SIS version.
-     */
-    @Override
-    public int getMinorVersion() {
-        return Modules.MINOR_VERSION;
-    }
-
-    /**
-     * This driver is currently not compliant.
-     * It has to succeed these tests first:
-     * <a href="http://www.oracle.com/technetwork/java/jdbctestsuite-1-3-1-140675.html">Compliance tests</a>.
-     */
-    @Override
-    public boolean jdbcCompliant() {
-        return false; // No, and for some time...
-    }
-
-    /**
-     * The logger used by this driver.
-     */
-    @Override
-    public Logger getParentLogger() {
-        return super.getLogger();
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBase3FieldDescriptor.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBase3FieldDescriptor.java
deleted file mode 100644
index 3f10500..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBase3FieldDescriptor.java
+++ /dev/null
@@ -1,150 +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.sis.internal.shapefile.jdbc;
-
-import java.nio.MappedByteBuffer;
-
-import org.apache.sis.internal.shapefile.AutoChecker;
-
-
-/**
- * Field descriptor.
- *
- * @author  Travis L. Pinney
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class DBase3FieldDescriptor extends AutoChecker {
-    /** Field name. */
-    private byte[] fieldName = new byte[11];
-
-    /** Field name as String, for performance issues. */
-    private String stringFieldName;
-
-    /** Field type. */
-    private DBaseDataType fieldType;
-
-    /** Field address (Field data address (address is set in memory; not useful on disk). */
-    private byte[] fieldAddress = new byte[4];
-
-    /** Field length. */
-    private byte fieldLength;
-
-    /** Decimal count. */
-    private byte fieldDecimalCount;
-
-    /** Reserved 2. */
-    private byte[] dbasePlusLanReserved2 = new byte[2];
-
-    /** Work area id. */
-    @SuppressWarnings("unused") // Kept in case of later ALTER TABLE sql calls.
-    private byte workAreaID;
-
-    /** Reserved 3. */
-    private byte[] dbasePlusLanReserved3 = new byte[2];
-
-    /** Undocumented use. */
-    @SuppressWarnings("unused") // Kept in case of later ALTER TABLE sql calls.
-    private byte setFields;
-
-    /**
-     * Create a field descriptor from the current position of the binary stream.
-     * @param byteBuffer ByteBuffer.
-     */
-    public DBase3FieldDescriptor(MappedByteBuffer byteBuffer) {
-        // Field name.
-        byteBuffer.get(this.fieldName);
-
-        // Field type.
-        char dt = (char)byteBuffer.get();
-        this.fieldType = DBaseDataType.valueOfDataType(dt);
-
-        // Field address.
-        byteBuffer.get(this.fieldAddress);
-
-        // Length and scale.
-        this.fieldLength = byteBuffer.get();
-        this.fieldDecimalCount = byteBuffer.get();
-
-        byteBuffer.getShort(); // reserved
-
-        byteBuffer.get(this.dbasePlusLanReserved2);
-
-        // Work area id.
-        this.workAreaID = byteBuffer.get();
-
-        byteBuffer.get(this.dbasePlusLanReserved3);
-
-        // Fields.
-        this.setFields = byteBuffer.get();
-
-        byte[] data = new byte[6];
-        byteBuffer.get(data); // reserved
-    }
-
-    /**
-     * Returns the decimal count of that field.
-     * @return Decimal count.
-     */
-    public int getDecimalCount() {
-        return Byte.toUnsignedInt(this.fieldDecimalCount);
-    }
-
-    /**
-     * Returns the field length.
-     * @return field length.
-     */
-    public int getLength() {
-        return Byte.toUnsignedInt(this.fieldLength);
-    }
-
-    /**
-     * Return the field name.
-     * @return Field name.
-     */
-    public String getName() {
-        // Converting bytes to String takes time. Only do that once.
-        if (this.stringFieldName == null) {
-            int length = this.fieldName.length;
-            while (length != 0 && Byte.toUnsignedInt(this.fieldName[length - 1]) <= ' ') {
-                length--;
-            }
-
-            this.stringFieldName = new String(this.fieldName, 0, length);
-        }
-
-        return this.stringFieldName;
-    }
-
-    /**
-     * Return the field data type.
-     * @return Data type.
-     */
-    public DBaseDataType getType() {
-        return(this.fieldType);
-    }
-
-    /**
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        String text = format("toString", getName(), this.fieldType, Byte.toUnsignedInt(this.fieldLength), Byte.toUnsignedInt(this.fieldDecimalCount));
-        return text;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBaseDataType.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBaseDataType.java
deleted file mode 100644
index 6078a9a..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/DBaseDataType.java
+++ /dev/null
@@ -1,103 +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.sis.internal.shapefile.jdbc;
-
-
-/**
- * Provides a simple DataType class.
- *
- * @author  Travis L. Pinney
- * @version 0.5
- *
- * @see <a href="http://www.clicketyclick.dk/databases/xbase/format/data_types.html">Xbase Data Types</a>
- *
- * @since 0.5
- * @module
- */
-public enum DBaseDataType {
-    /** Character (less than 254 characters). */
-    Character('C'),
-
-    /** Number (less than 18 characters, can include sign and decimal). */
-    Number('N'),
-
-    /** Logical (3 way, ? Y,y,T,t  N,n,F,f). */
-    Logical('L'),
-
-    /** Date (YYYYMMDD format). */
-    Date('D'),
-
-    /** Memo (Pointer to ASCII text field). */
-    Memo('M'),
-
-    /** Floating point (20 digits). */
-    FloatingPoint('F'),
-
-    // CharacterNameVariable("?"),  //1-254 Characters
-
-    /** Picture (memo). */
-    Picture('P'),
-
-    /** Currency (Foxpro). */
-    Currency('Y'),
-
-    /** Date time (32 bit little-endian Julian date, 32 byte little endian milliseconds since midnight). */
-    DateTime('T'),
-
-    /** Integer (4 byte little endian). */
-    Integer('I'),
-
-    /** Varifield (???). */
-    VariField('V'),
-
-    /** Variant (???). */
-    Variant('X'),
-
-    /** Time stamp (see url). */
-    TimeStamp('@'),
-
-    /** Double. */
-    Double('O'),
-
-    /** Auto increment. */
-    AutoIncrement('+');
-
-    /** Data type. */
-    public final char datatype;
-
-    /**
-     * Construct a datatype.
-     * @param type Data type.
-     */
-    DBaseDataType(char type) {
-        this.datatype = type;
-    }
-
-    /**
-     * Return the Datatype enum of a code.
-     * @param code Character code describing the dbf datatype.
-     * @return Datatype.
-     */
-    public static DBaseDataType valueOfDataType(char code) {
-        for (DBaseDataType v : values()) {
-            if (v.datatype == code) {
-                return v;
-            }
-        }
-        throw new IllegalArgumentException("Enum datatype is incorrect");
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/Dbase3ByteReader.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/Dbase3ByteReader.java
deleted file mode 100644
index d9fecf9..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/Dbase3ByteReader.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.sis.internal.shapefile.jdbc;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.sis.internal.shapefile.jdbc.resultset.SQLIllegalColumnIndexException;
-import org.apache.sis.internal.shapefile.jdbc.resultset.SQLNoSuchFieldException;
-import org.apache.sis.feature.AbstractFeature;
-
-/**
- * Database byte reader contract. Used to allow refactoring of core byte management of a DBase file.
- * @author Marc LE BIHAN
- */
-public interface Dbase3ByteReader {
-    /**
-     * Close the MappedByteReader.
-     * @throws IOException if the close operation fails.
-     */
-    public void close() throws IOException;
-
-    /**
-     * Checks if the ByteReader is closed.
-     * @return true if it is closed.
-     */
-    public boolean isClosed();
-
-    /**
-     * Returns the fields descriptors in their binary format.
-     * @return Fields descriptors.
-     */
-    public List<DBase3FieldDescriptor> getFieldsDescriptors();
-
-    /**
-     * Returns the column index for the given column name.
-     * The default implementation of all methods expecting a column label will invoke this method.
-     * @param columnLabel The name of the column.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return The index of the given column name : first column is 1.
-     * @throws SQLNoSuchFieldException if there is no field with this name in the query.
-     */
-    public int findColumn(String columnLabel, String sql) throws SQLNoSuchFieldException;
-
-    /**
-     * Returns the charset.
-     * @return Charset.
-     */
-    public Charset getCharset();
-
-    /**
-     * Returns the column count of the unique table of the DBase 3.
-     * @return Column count.
-     */
-    public int getColumnCount();
-
-    /**
-     * Return a field name.
-     * @param columnIndex Column index.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return Field Name.
-     * @throws SQLIllegalColumnIndexException if the index is out of bounds.
-     */
-    public String getFieldName(int columnIndex, String sql) throws SQLIllegalColumnIndexException;
-
-    /**
-     * Returns the database last update date.
-     * @return Date of the last update.
-     */
-    public Date getDateOfLastUpdate();
-    
-    /**
-     * Returns the first record position, in bytes, in the DBase file.
-     * @return First record position.
-     */
-    public short getFirstRecordPosition();
-
-    /**
-     * Returns the length (in bytes) of one record in this DBase file, including the delete flag. 
-     * @return Record length.
-     */
-    public short getRecordLength();
-    
-    /**
-     * Returns the record count.
-     * @return Record count.
-     */
-    public int getRowCount();
-
-    /**
-     * Returns the current record number.
-     * @return Current record number.
-     */
-    public int getRowNum();
-
-    /**
-     * Load a row into a feature.
-     * @param feature Feature to fill.
-     */
-    public void loadRowIntoFeature(AbstractFeature feature);
-
-    /**
-     * Checks if a next row is available. Warning : it may be a deleted one.
-     * @return true if a next row is available.
-     */
-    public boolean nextRowAvailable();
-
-    /**
-     * Read the next row as a set of objects.
-     * @return Map of field name / object value.
-     */
-    public Map<String, byte[]> readNextRowAsObjects();
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/MappedByteReader.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/MappedByteReader.java
deleted file mode 100644
index 294be4a..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/MappedByteReader.java
+++ /dev/null
@@ -1,309 +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.sis.internal.shapefile.jdbc;
-
-import java.io.File;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.*;
-import java.util.logging.Level;
-
-import org.apache.sis.internal.shapefile.jdbc.resultset.SQLIllegalColumnIndexException;
-import org.apache.sis.internal.shapefile.jdbc.resultset.SQLNoSuchFieldException;
-import org.apache.sis.feature.AbstractFeature;
-
-
-/**
- * Reader of a Database Binary content by the way of a {@link java.nio.MappedByteBuffer}
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class MappedByteReader extends AbstractDbase3ByteReader implements AutoCloseable {
-    /** List of field descriptors. */
-    private List<DBase3FieldDescriptor> fieldsDescriptors = new ArrayList<>();
-
-    /** Connection properties. */
-    private Properties info;
-
-    /**
-     * Construct a mapped byte reader on a file.
-     * @param dbase3File File.
-     * @param connectionInfos Connection properties, maybe null.
-     * @throws SQLInvalidDbaseFileFormatException if the database seems to be invalid.
-     * @throws SQLDbaseFileNotFoundException if the Dbase file has not been found.
-     */
-    public MappedByteReader(File dbase3File, Properties connectionInfos) throws SQLInvalidDbaseFileFormatException, SQLDbaseFileNotFoundException {
-        super(dbase3File);
-        this.info = connectionInfos;
-
-        // React to special features asked.
-        if (this.info != null) {
-            // Sometimes, DBF files have a wrong charset, or more often : none, and you have to specify it.
-            String recordCharset = (String)this.info.get("record_charset");
-
-            if (recordCharset != null) {
-                Charset cs = Charset.forName(recordCharset);
-                setCharset(cs);
-            }
-        }
-
-        loadDescriptor();
-    }
-
-    /**
-     * Load a row into a feature.
-     * @param feature Feature to fill.
-     */
-    @Override public void loadRowIntoFeature(AbstractFeature feature) {
-        // TODO: ignore deleted records
-        getByteBuffer().get(); // denotes whether deleted or current
-        // read first part of record
-
-        for (DBase3FieldDescriptor fd : this.fieldsDescriptors) {
-            byte[] data = new byte[fd.getLength()];
-            getByteBuffer().get(data);
-
-            int length = data.length;
-            while (length != 0 && Byte.toUnsignedInt(data[length - 1]) <= ' ') {
-                length--;
-            }
-
-            String value = new String(data, 0, length);
-            feature.setPropertyValue(fd.getName(), value);
-        }
-    }
-
-    /**
-     * Checks if a next row is available. Warning : it may be a deleted one.
-     * @return true if a next row is available.
-     */
-    @Override
-    public boolean nextRowAvailable() {
-        // 1) Check for remaining bytes.
-        if (getByteBuffer().hasRemaining() == false) {
-            return false;
-        }
-
-        // 2) Check that the immediate next byte read isn't the EOF signal.
-        byte eofCheck = getByteBuffer().get();
-
-        boolean isEOF = (eofCheck == 0x1A);
-        this.log(Level.FINER, "log.delete_status", getRowNum(), eofCheck, isEOF ? "EOF" : "Active");
-
-        if (eofCheck == 0x1A) {
-            return false;
-        }
-        else {
-            // Return one byte back.
-            int position = getByteBuffer().position();
-            getByteBuffer().position(position-1);
-            return true;
-        }
-    }
-
-    /**
-     * Returns the record number of the last record red.
-     * @return The record number.
-     */
-    @Override public int getRowNum() {
-        int position = getByteBuffer().position();
-        int recordNumber = (position - Short.toUnsignedInt(this.firstRecordPosition)) / Short.toUnsignedInt(this.recordLength);
-        return recordNumber;
-    }
-
-    /**
-     * Read the next row as a set of objects.
-     * @return Map of field name / object value.
-     */
-    @Override
-    public Map<String, byte[]> readNextRowAsObjects() {
-        // TODO: ignore deleted records
-        /* byte isDeleted = */ getByteBuffer().get(); // denotes whether deleted or current
-
-        // read first part of record
-        HashMap<String, byte[]> fieldsValues = new HashMap<>();
-
-        for (DBase3FieldDescriptor fd : this.fieldsDescriptors) {
-            byte[] data = new byte[fd.getLength()];
-            getByteBuffer().get(data);
-
-            // Trim the bytes right.
-            int length = data.length;
-
-            while (length != 0 && Byte.toUnsignedInt(data[length - 1]) <= ' ') {
-                length--;
-            }
-
-            if (length != data.length) {
-                byte[] dataTrimmed = new byte[length];
-
-                for(int index=0; index < length; index ++) {
-                    dataTrimmed[index] = data[index];
-                }
-
-                fieldsValues.put(fd.getName(), dataTrimmed);
-            }
-            else {
-                fieldsValues.put(fd.getName(), data);
-            }
-        }
-
-        return fieldsValues;
-    }
-
-    /**
-     * Loading the database file content from binary .dbf file.
-     * @throws SQLInvalidDbaseFileFormatException if descriptor is not readable.
-     */
-    private void loadDescriptor() throws SQLInvalidDbaseFileFormatException {
-        try {
-            this.dbaseVersion = getByteBuffer().get();
-            getByteBuffer().get(this.dbaseLastUpdate);
-
-            getByteBuffer().order(ByteOrder.LITTLE_ENDIAN);
-            this.rowCount = getByteBuffer().getInt();
-            this.firstRecordPosition = getByteBuffer().getShort();
-            this.recordLength = getByteBuffer().getShort();
-            getByteBuffer().order(ByteOrder.BIG_ENDIAN);
-
-            getByteBuffer().get(this.reservedFiller1);
-            this.reservedIncompleteTransaction = getByteBuffer().get();
-            this.reservedEncryptionFlag = getByteBuffer().get();
-            getByteBuffer().get(this.reservedFreeRecordThread);
-            getByteBuffer().get(this.reservedMultiUser);
-            this.reservedMDXFlag = getByteBuffer().get();
-
-            // Translate code page value to a known charset.
-            this.codePage = getByteBuffer().get();
-
-            if (this.charset == null) {
-                try {
-                    this.charset = toCharset(this.codePage);
-                }
-                catch(UnsupportedCharsetException e) {
-                    // Warn the caller that he will have to perform is own conversions.
-                    log(Level.WARNING, "log.no_valid_charset", getFile().getAbsolutePath(), e.getMessage());
-                }
-            }
-            else {
-                log(Level.INFO, "log.record_charset", this.charset.name());
-            }
-
-            getByteBuffer().get(this.reservedFiller2);
-
-            while(getByteBuffer().position() < this.firstRecordPosition - 1) {
-                DBase3FieldDescriptor fd = new DBase3FieldDescriptor(getByteBuffer());
-                this.fieldsDescriptors.add(fd);
-                // loop until you hit the 0Dh field terminator
-            }
-
-            this.descriptorTerminator = getByteBuffer().get();
-
-            // If the last character read after the field descriptor isn't 0x0D, the expected mark has not been found and the DBF is corrupted.
-            if (this.descriptorTerminator != 0x0D) {
-                String message = format(Level.WARNING, "excp.filedescriptor_problem", getFile().getAbsolutePath(), "Character marking the end of the fields descriptors (0x0D) has not been found.");
-                throw new SQLInvalidDbaseFileFormatException(message);
-            }
-        }
-        catch(BufferUnderflowException e) {
-            // This exception doesn't denote a trouble of file opening because the file has been checked before
-            // the calling of this private function.
-            // Therefore, an internal structure problem cause maybe a premature End of file or anything else, but the only thing
-            // we can conclude is : we are not before a device trouble, but a file format trouble.
-            String message = format(Level.WARNING, "excp.filedescriptor_problem", getFile().getAbsolutePath(), e.getMessage());
-            throw new SQLInvalidDbaseFileFormatException(message);
-        }
-    }
-
-    /**
-     * Returns the fields descriptors in their binary format.
-     * @return Fields descriptors.
-     */
-    @Override
-    public List<DBase3FieldDescriptor> getFieldsDescriptors() {
-        return this.fieldsDescriptors;
-    }
-
-    /**
-     * Return a field name.
-     * @param columnIndex Column index.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return Field Name.
-     * @throws SQLIllegalColumnIndexException if the index is out of bounds.
-     */
-    @Override
-    public String getFieldName(int columnIndex, String sql) throws SQLIllegalColumnIndexException {
-        return getField(columnIndex, sql).getName();
-    }
-
-    /**
-     * @see org.apache.sis.internal.shapefile.jdbc.Dbase3ByteReader#getColumnCount()
-     */
-    @Override
-    public int getColumnCount() {
-        return this.fieldsDescriptors.size();
-    }
-
-    /**
-     * Returns the column index for the given column name.
-     * The default implementation of all methods expecting a column label will invoke this method.
-     * @param columnLabel The name of the column.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return The index of the given column name : first column is 1.
-     * @throws SQLNoSuchFieldException if there is no field with this name in the query.
-     */
-    @Override
-    public int findColumn(String columnLabel, String sql) throws SQLNoSuchFieldException {
-        // If the column name is null, no search is needed.
-        if (columnLabel == null) {
-            String message = format(Level.WARNING, "excp.no_such_column_in_resultset", columnLabel, sql, getFile().getName());
-            throw new SQLNoSuchFieldException(message, sql, getFile(), columnLabel);
-        }
-
-        // Search the field among the fields descriptors.
-        for(int index=0; index < this.fieldsDescriptors.size(); index ++) {
-            if (this.fieldsDescriptors.get(index).getName().equals(columnLabel)) {
-                return index + 1;
-            }
-        }
-
-        // If we are here, we haven't found our field. Throw an exception.
-        String message = format(Level.WARNING, "excp.no_such_column_in_resultset", columnLabel, sql, getFile().getName());
-        throw new SQLNoSuchFieldException(message, sql, getFile(), columnLabel);
-    }
-
-    /**
-     * Returns the field descriptor of a given ResultSet column index.
-     * @param columnIndex Column index, first column is 1, second is 2, etc.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return Field Descriptor.
-     * @throws SQLIllegalColumnIndexException if the index is out of bounds.
-     */
-    private DBase3FieldDescriptor getField(int columnIndex, String sql) throws SQLIllegalColumnIndexException {
-        if (columnIndex < 1 || columnIndex > getColumnCount()) {
-            String message = format(Level.WARNING, "excp.illegal_column_index", columnIndex, getColumnCount());
-            throw new SQLIllegalColumnIndexException(message, sql, getFile(), columnIndex);
-        }
-
-        return this.fieldsDescriptors.get(columnIndex-1);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLConnectionClosedException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLConnectionClosedException.java
deleted file mode 100644
index 118f6d9..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLConnectionClosedException.java
+++ /dev/null
@@ -1,63 +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.sis.internal.shapefile.jdbc;
-
-import java.io.File;
-import java.sql.SQLException;
-
-/**
- * Exception thrown when a connection is closed.
- * @author Marc LE BIHAN
- */
-public class SQLConnectionClosedException extends SQLException {
-    /** Serial ID. */
-    private static final long serialVersionUID = -7806101485624353416L;
-
-    /** The SQL Statement that whas attempted (if known). */
-    private String sql;
-
-    /** The database file. */
-    private File database;
-
-    /**
-     * Build the exception.
-     * @param message Exception message.
-     * @param sqlStatement SQL Statement who encountered the trouble, if known.
-     * @param dbf The database that was queried.
-     */
-    public SQLConnectionClosedException(String message, String sqlStatement, File dbf) {
-        super(message);
-        this.sql = sqlStatement;
-        this.database = dbf;
-    }
-
-    /**
-     * Returns the SQL statement who encountered the "connection closed" alert, if known.
-     * @return SQL statement or null.
-     */
-    public String getSQL() {
-        return this.sql;
-    }
-
-    /**
-     * Returns the database file that is not opened for connection.
-     * @return Database file.
-     */
-    public File getDatabase() {
-        return this.database;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLDbaseFileNotFoundException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLDbaseFileNotFoundException.java
deleted file mode 100644
index 73572f4..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLDbaseFileNotFoundException.java
+++ /dev/null
@@ -1,50 +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.sis.internal.shapefile.jdbc;
-
-import java.sql.SQLNonTransientException;
-
-
-/**
- * Thrown when a DBF file has not been found.
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class SQLDbaseFileNotFoundException extends SQLNonTransientException {
-    /** Serial UID. */
-    private static final long serialVersionUID = 2572691456125734352L;
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     */
-    public SQLDbaseFileNotFoundException(String message) {
-        super(message);
-    }
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     * @param cause Root cause of the exception.
-     */
-    public SQLDbaseFileNotFoundException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLInvalidDbaseFileFormatException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLInvalidDbaseFileFormatException.java
deleted file mode 100644
index ba44980..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/SQLInvalidDbaseFileFormatException.java
+++ /dev/null
@@ -1,50 +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.sis.internal.shapefile.jdbc;
-
-import java.sql.SQLNonTransientException;
-
-
-/**
- * Thrown when the DBF file format seems to be invalid.
- *
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class SQLInvalidDbaseFileFormatException extends SQLNonTransientException {
-    /** Serial UID. */
-    private static final long serialVersionUID = 3924612615300490837L;
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     */
-    public SQLInvalidDbaseFileFormatException(String message) {
-        super(message);
-    }
-
-    /**
-     * Construct an exception.
-     * @param message Message of the exception.
-     * @param cause Root cause of the exception.
-     */
-    public SQLInvalidDbaseFileFormatException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/AbstractConnection.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/AbstractConnection.java
deleted file mode 100644
index 89d1845..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/AbstractConnection.java
+++ /dev/null
@@ -1,418 +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.sis.internal.shapefile.jdbc.connection;
-
-import java.sql.*;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Executor;
-import java.util.logging.Level;
-
-import org.apache.sis.internal.shapefile.jdbc.AbstractJDBC;
-
-
-/**
- * This base class holds most of the unimplemented feature of a {@code Connection}.
- * This is used in order to avoid having a Connection implementation of thousand lines and unreadable.
- *
- * <table class="sis">
- *   <caption>Connection default values</caption>
- *   <tr><th>Property</th>                           <th>Value</th></tr>
- *   <tr><td>{@link #isReadOnly()}</td>              <td>{@code false}</td></tr>
- *   <tr><td>{@link #getAutoCommit()}</td>           <td>{@code true}</td></tr>
- *   <tr><td>{@link #getNetworkTimeout()}</td>       <td>0</td></tr>
- *   <tr><td>{@link #getTransactionIsolation()}</td> <td>{@link #TRANSACTION_NONE}</td></tr>
- *   <tr><td>{@link #getTypeMap()}</td>              <td>Empty map</td></tr>
- *   <tr><td>{@link #nativeSQL(String)}</td>         <td>No change</td></tr>
- *   <tr><td>{@link #getWarnings()}</td>             <td>{@code null}</td></tr>
- *   <tr><td>{@link #clearWarnings()}</td>           <td>Ignored</td></tr>
- * </table>
- *
- * @author  Marc Le Bihan
- * @author  Martin Desruisseaux (Geomatys)
- * @version 0.5
- * @since   0.5
- * @module
- */
-@SuppressWarnings("unused")
-abstract class AbstractConnection extends AbstractJDBC implements Connection {
-    /**
-     * Constructs a new {@code Connection} instance.
-     */
-    AbstractConnection() {
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setCatalog(String catalog) {
-        logUnsupportedOperation("setCatalog");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public String getSchema() throws SQLException {
-        throw unsupportedOperation("getSchema");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setSchema(String schema) throws SQLException {
-        throw unsupportedOperation("setSchema");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Map<String, Class<?>> getTypeMap() {
-        return Collections.emptyMap();
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setTypeMap(Map<String, Class<?>> map) {
-        if (!map.isEmpty()) {
-            throw new UnsupportedOperationException("setTypeMap");
-        }
-    }
-
-    /**
-     * Returns {@code true} by default, assuming a driver without write capabilities.
-     */
-    @Override
-    public boolean isReadOnly() {
-        return true;
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setReadOnly(boolean readOnly) {
-        if (!readOnly) {
-            throw new UnsupportedOperationException("setReadOnly");
-        }
-    }
-
-    /**
-     * Defaults to {@link #TRANSACTION_NONE}.
-     */
-    @Override
-    public int getTransactionIsolation() {
-        return TRANSACTION_NONE; // No guarantees of anything.
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setTransactionIsolation(int level) {
-        if (level != TRANSACTION_NONE) {
-            throw new UnsupportedOperationException("setTransactionIsolation");
-        }
-    }
-
-    /**
-     * Defaults to {@code true}, assuming that auto-commit state is not handled.
-     */
-    @Override
-    public boolean getAutoCommit() {
-        return true;
-    }
-
-    /**
-     * Defaults to ignoring the commit / rollback.
-     * The auto-commit mode is assumed fixed to {@code true}.
-     */
-    @Override
-    public void setAutoCommit(boolean autoCommit) {
-        log(Level.FINE, "log.auto_commit_ignored", autoCommit);
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void commit() {
-        log(Level.FINE, "log.commit_rollback_ignored");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void rollback() {
-        log(Level.FINE, "log.commit_rollback_ignored");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void rollback(Savepoint savepoint) throws SQLException {
-        throw unsupportedOperation("rollback");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Savepoint setSavepoint() throws SQLException {
-        throw unsupportedOperation("setSavepoint");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Savepoint setSavepoint(String name) throws SQLException {
-        throw unsupportedOperation("setSavepoint");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
-        throw unsupportedOperation("releaseSavepoint");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public int getHoldability() throws SQLException {
-        throw unsupportedOperation("getHoldability");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setHoldability(int holdability) {
-        logUnsupportedOperation("setHoldability");
-    }
-
-    /**
-     * Returns the given string unchanged by default.
-     */
-    @Override
-    public String nativeSQL(String sql) {
-        return sql; // We do nothing at the moment.
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw unsupportedOperation("createStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw unsupportedOperation("createStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw unsupportedOperation("prepareCall");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
-        throw unsupportedOperation("prepareStatement");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public CallableStatement prepareCall(String sql) throws SQLException {
-        throw unsupportedOperation("prepareCall");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw unsupportedOperation("prepareCall");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Clob createClob() throws SQLException {
-        throw unsupportedOperation("createClob");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Blob createBlob() throws SQLException {
-        throw unsupportedOperation("createBlob");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public NClob createNClob() throws SQLException {
-        throw unsupportedOperation("createNClob");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public SQLXML createSQLXML() throws SQLException {
-        throw unsupportedOperation("createSQLXML");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
-        throw unsupportedOperation("createArrayOf");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
-        throw unsupportedOperation("createStruct");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public String getClientInfo(String name) throws SQLException {
-        throw unsupportedOperation("getClientInfo");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public Properties getClientInfo() throws SQLException {
-        throw unsupportedOperation("getClientInfo");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setClientInfo(String name, String value) {
-        logUnsupportedOperation("setClientInfo");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setClientInfo(Properties properties) {
-        logUnsupportedOperation("setClientInfo");
-    }
-
-    /**
-     * Defaults to 0, which means there is no limit.
-     */
-    @Override
-    public int getNetworkTimeout() {
-        return 0; // Means there is no limt.
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void setNetworkTimeout(Executor executor, int milliseconds) {
-        logUnsupportedOperation("setNetworkTimeout");
-    }
-
-    /**
-     * Unsupported by default.
-     */
-    @Override
-    public void abort(Executor executor) throws SQLException {
-        throw unsupportedOperation("abort");
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/DBFConnection.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/DBFConnection.java
deleted file mode 100644
index cd60673..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/DBFConnection.java
+++ /dev/null
@@ -1,336 +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.sis.internal.shapefile.jdbc.connection;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.sql.*;
-import java.util.*;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-
-import org.apache.sis.internal.shapefile.jdbc.*;
-import org.apache.sis.internal.shapefile.jdbc.metadata.DBFDatabaseMetaData;
-import org.apache.sis.internal.shapefile.jdbc.resultset.*;
-import org.apache.sis.internal.shapefile.jdbc.statement.DBFStatement;
-
-
-/**
- * Connection to a DBF database.
- * @author  Marc Le Bihan
- * @version 0.5
- * @since   0.5
- * @module
- */
-public class DBFConnection extends AbstractConnection {
-    /** The object to use for reading the database content. */
-    final File databaseFile;
-
-    /** Opened statement. */
-    private HashSet<DBFStatement> openedStatements = new HashSet<>();
-
-    /** ByteReader. */
-    private Dbase3ByteReader byteReader;
-
-    /**
-     * Constructs a connection to the given database.
-     * @param datafile Data file ({@code .dbf} extension).
-     * @param br Byte reader to use for reading binary content.
-     * @throws SQLDbaseFileNotFoundException if the Database file cannot be found or is not a file.
-     */
-    public DBFConnection(final File datafile, Dbase3ByteReader br) throws SQLDbaseFileNotFoundException {
-        // Check that file exists.
-        if (!datafile.exists()) {
-            throw new SQLDbaseFileNotFoundException(format(Level.WARNING, "excp.file_not_found", datafile.getAbsolutePath()));
-        }
-
-        // Check that its not a directory.
-        if (datafile.isDirectory()) {
-            throw new SQLDbaseFileNotFoundException(format(Level.WARNING, "excp.directory_not_expected", datafile.getAbsolutePath()));
-        }
-
-        this.databaseFile = datafile;
-        this.byteReader = br;
-        log(Level.FINE, "log.database_connection_opened", this.databaseFile.getAbsolutePath(), "FIXME : column desc.");
-    }
-
-    /**
-     * Closes the connection to the database.
-     */
-    @Override
-    public void close() {
-        if (isClosed())
-            return;
-
-        try {
-            // Check if all the underlying connections that has been opened with this connection has been closed.
-            // If not, we log a warning to help the developer.
-            if (this.openedStatements.size() > 0) {
-                log(Level.WARNING, "log.statements_left_opened", this.openedStatements.size(), this.openedStatements.stream().map(DBFStatement::toString).collect(Collectors.joining(", ")));
-            }
-
-            this.byteReader.close();
-        } catch (IOException e) {
-            log(Level.FINE, e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Creates an object for sending SQL statements to the database.
-     * @throws SQLConnectionClosedException if the connection is closed.
-     */
-    @Override
-    public Statement createStatement() throws SQLConnectionClosedException {
-        assertNotClosed();
-
-        DBFStatement stmt = new DBFStatement(this);
-        this.openedStatements.add(stmt);
-        return stmt;
-    }
-
-    /**
-     * @see java.sql.Connection#getCatalog()
-     */
-    @Override
-    public String getCatalog() {
-        return null; // DBase 3 offers no catalog.
-    }
-
-    /**
-     * Returns the charset.
-     * @return Charset.
-     */
-    public Charset getCharset() {
-        return this.byteReader.getCharset();
-    }
-
-    /**
-     * Returns the database File.
-     * @return File.
-     */
-    @Override
-    public File getFile() {
-        return this.databaseFile;
-    }
-
-    /**
-     * Returns the JDBC interface implemented by this class.
-     * This is used for formatting error messages.
-     */
-    @Override
-    final protected Class<?> getInterface() {
-        return Connection.class;
-    }
-
-    /**
-     * @see java.sql.Connection#getMetaData()
-     */
-    @Override
-    public DatabaseMetaData getMetaData() {
-        return new DBFDatabaseMetaData(this);
-    }
-
-    /**
-     * Returns {@code true} if this connection has been closed.
-     */
-    @Override
-    public boolean isClosed() {
-        return this.byteReader.isClosed();
-    }
-
-    /**
-     * Returns {@code true} if the connection has not been closed and is still valid.
-     * The timeout parameter is ignored and this method bases itself only on {@link #isClosed()} state.
-     */
-    @Override
-    public boolean isValid(@SuppressWarnings("unused") int timeout) {
-        return !isClosed();
-    }
-
-    /**
-     * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
-     */
-    @Override
-    public boolean isWrapperFor(Class<?> iface) {
-        return iface.isAssignableFrom(getInterface());
-    }
-
-    /**
-     * Asserts that the connection is opened.
-     * @throws SQLConnectionClosedException if the connection is closed.
-     */
-    public void assertNotClosed() throws SQLConnectionClosedException {
-        // If closed throw an exception specifying the name if the DBF that is closed.
-        if (isClosed()) {
-            throw new SQLConnectionClosedException(format(Level.WARNING, "excp.closed_connection", getFile().getName()), null, getFile());
-        }
-    }
-
-    /**
-     * Method called by Statement class to notity this connection that a statement has been closed.
-     * @param stmt Statement that has been closed.
-     */
-    public void notifyCloseStatement(DBFStatement stmt) {
-        Objects.requireNonNull(stmt, "The statement notified being closed cannot be null.");
-
-        if (this.openedStatements.remove(stmt) == false) {
-            throw new RuntimeException(format(Level.SEVERE, "assert.statement_not_opened_by_me", stmt, toString()));
-        }
-    }
-
-    /**
-     * Returns the column index for the given column name.
-     * The default implementation of all methods expecting a column label will invoke this method.
-     * @param columnLabel The name of the column.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return The index of the given column name : first column is 1.
-     * @throws SQLNoSuchFieldException if there is no field with this name in the query.
-     */
-    public int findColumn(String columnLabel, String sql) throws SQLNoSuchFieldException {
-        return this.byteReader.findColumn(columnLabel, sql);
-    }
-
-    /**
-     * Returns the column count of the table of the database.
-     * @return Column count.
-     */
-    public int getColumnCount() {
-        return this.byteReader.getColumnCount();
-    }
-
-    /**
-     * Get a field description.
-     * @param columnLabel Column label.
-     * @param sql SQL Statement.
-     * @return ResultSet with current row set on the wished field.
-     * @throws SQLConnectionClosedException if the connection is closed.
-     * @throws SQLNoSuchFieldException if no column with that name exists.
-     */
-    public ResultSet getFieldDesc(String columnLabel, String sql) throws SQLConnectionClosedException, SQLNoSuchFieldException {
-        Objects.requireNonNull(columnLabel, "The column name cannot be null.");
-
-        DBFBuiltInMemoryResultSetForColumnsListing rs = (DBFBuiltInMemoryResultSetForColumnsListing)((DBFDatabaseMetaData)getMetaData()).getColumns(null, null, null, null);
-
-        try {
-            while(rs.next()) {
-                try {
-                    if (rs.getString("COLUMN_NAME").equalsIgnoreCase(columnLabel)) {
-                        return rs;
-                    }
-                }
-                catch(SQLNoSuchFieldException e) {
-                    // if it is the COLUMN_NAME column that has not been found in the desc ResultSet, we have an internal error.
-                    rs.close();
-                    throw new RuntimeException(e.getMessage(), e);
-                }
-            }
-        }
-        catch(SQLNoResultException e) {
-            // if we run out of bound of the ResultSet, the boolean returned by next() has not been checked well, and it's an internal error.
-            rs.close();
-            throw new RuntimeException(e.getMessage(), e);
-        }
-
-        // But if we are here, we have not found the column with this name, and we have to throw an SQLNoSuchFieldException exception ourselves.
-        String message = format("excp.no_such_column_in_resultset", columnLabel, sql, getFile().getName());
-        throw new SQLNoSuchFieldException(message, sql, getFile(), columnLabel);
-    }
-
-    /**
-     * Get a field description.
-     * @param column Column index.
-     * @param sql SQL Statement.
-     * @return ResultSet with current row set on the wished field.
-     * @throws SQLConnectionClosedException if the connection is closed.
-     * @throws SQLIllegalColumnIndexException if the column index is out of bounds.
-     */
-    public ResultSet getFieldDesc(int column, String sql) throws SQLConnectionClosedException, SQLIllegalColumnIndexException {
-        DBFBuiltInMemoryResultSetForColumnsListing rs = (DBFBuiltInMemoryResultSetForColumnsListing)((DBFDatabaseMetaData)getMetaData()).getColumns(null, null, null, null);
-
-        if (column <= 0 || column > getColumnCount()) {
-            rs.close();
-            String message = format("excp.illegal_column_index_metadata", column, getColumnCount());
-            throw new SQLIllegalColumnIndexException(message, sql, getFile(), column);
-        }
-
-        // TODO Implements ResultSet:absolute(int) instead.
-        for(int index=1; index <= column; index ++) {
-            try {
-                rs.next();
-            }
-            catch(SQLNoResultException e) {
-                // We encounter an internal API error in this case.
-                rs.close();
-                throw new RuntimeException(e.getMessage(), e);
-            }
-        }
-
-        return rs;
-    }
-
-    /**
-     * Returns the fields descriptors in their binary format.
-     * @return Fields descriptors.
-     */
-    public List<DBase3FieldDescriptor> getFieldsDescriptors() {
-        return this.byteReader.getFieldsDescriptors();
-    }
-
-    /**
-     * Return a field name.
-     * @param columnIndex Column index.
-     * @param sql For information, the SQL statement that is attempted.
-     * @return Field Name.
-     * @throws SQLIllegalColumnIndexException if the index is out of bounds.
-     */
-    public String getFieldName(int columnIndex, String sql) throws SQLIllegalColumnIndexException {
-        return this.byteReader.getFieldName(columnIndex, sql);
-    }
-
-    /**
-     * Checks if a next row is available. Warning : it may be a deleted one.
-     * @return true if a next row is available.
-     */
-    public boolean nextRowAvailable() {
-        return this.byteReader.nextRowAvailable();
-    }
-
-    /**
-     * Read the next row as a set of objects.
-     * @return Map of field name / object value, or null if EoF has been encountered.
-     */
-    public Map<String, byte[]> readNextRowAsObjects() {
-        return this.byteReader.readNextRowAsObjects();
-    }
-
-    /**
-     * Returns the record number of the last record red.
-     * @return The record number.
-     */
-    public int getRowNum() {
-        return this.byteReader.getRowNum();
-    }
-
-    /**
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        return format("toString", this.databaseFile.getAbsolutePath(), isClosed() == false);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/SQLClosingIOFailureException.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/SQLClosingIOFailureException.java
deleted file mode 100644
index e20e58c..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/SQLClosingIOFailureException.java
+++ /dev/null
@@ -1,63 +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.sis.internal.shapefile.jdbc.connection;
-
-import java.io.File;
-import java.sql.SQLException;
-
-/**
- * Exception thrown when a connection cannot be closed due to an environement trouble.
- * @author Marc LE BIHAN
- */
-public class SQLClosingIOFailureException extends SQLException {
-    /** Serial ID. */
-    private static final long serialVersionUID = -3327372119927661463L;
-
-    /** The SQL Statement that whas attempted (if known). */
-    private String sql;
-
-    /** The database file. */
-    private File database;
-
-    /**
-     * Build the exception.
-     * @param message Exception message.
-     * @param sqlStatement SQL Statement who encountered the trouble, if known.
-     * @param dbf The database that was queried.
-     */
-    public SQLClosingIOFailureException(String message, String sqlStatement, File dbf) {
-        super(message);
-        this.sql = sqlStatement;
-        this.database = dbf;
-    }
-
-    /**
-     * Returns the SQL statement who encountered the "connection closed" alert, if known.
-     * @return SQL statement or null.
-     */
-    public String getSQL() {
-        return this.sql;
-    }
-
-    /**
-     * Returns the database file that is not opened for connection.
-     * @return Database file.
-     */
-    public File getDatabase() {
-        return this.database;
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/package-info.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/package-info.java
deleted file mode 100644
index e10322c..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/connection/package-info.java
+++ /dev/null
@@ -1,19 +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.
- */
-
-/** Connections */
-package org.apache.sis.internal.shapefile.jdbc.connection;
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/AbstractDatabaseMetaData.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/AbstractDatabaseMetaData.java
deleted file mode 100644
index 91d0f0d..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/AbstractDatabaseMetaData.java
+++ /dev/null
@@ -1,202 +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.sis.internal.shapefile.jdbc.metadata;
-
-import java.sql.*;
-
-import org.apache.sis.internal.shapefile.jdbc.AbstractJDBC;
-
-/**
- * Unimplemented methods of DatabaseMetaData.
- * @author Marc LE BIHAN
- */
-public abstract class AbstractDatabaseMetaData extends AbstractJDBC implements DatabaseMetaData {
-    /**
-     * @see java.sql.DatabaseMetaData#getAttributes(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException {
-        throw unsupportedOperation("getAttributes", catalog, schemaPattern, typeNamePattern, attributeNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getBestRowIdentifier(java.lang.String, java.lang.String, java.lang.String, int, boolean)
-     */
-    @Override public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException {
-        throw unsupportedOperation("getBestRowIdentifier", catalog, schema, table, scope, nullable);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getClientInfoProperties()
-     */
-    @Override public ResultSet getClientInfoProperties() throws SQLException {
-        throw unsupportedOperation("getClientInfoProperties");
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getColumnPrivileges(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException {
-        throw unsupportedOperation("getColumnPrivileges", catalog, schema, table, columnNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getCrossReference(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException {
-        throw unsupportedOperation("getCrossReference", parentCatalog, parentSchema, parentTable, foreignCatalog, foreignSchema, foreignTable);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getExportedKeys(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
-        throw unsupportedOperation("getExportedKeys", catalog, schema, table);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getFunctions(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException {
-        throw unsupportedOperation("getFunctions", catalog, schemaPattern, functionNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getFunctionColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
-        throw unsupportedOperation("getFunctionColumns", catalog, schemaPattern, functionNamePattern, columnNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getIndexInfo(java.lang.String, java.lang.String, java.lang.String, boolean, boolean)
-     */
-    @Override public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
-        throw unsupportedOperation("getIndexInfo", catalog, schema, table, unique, approximate);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
-        throw unsupportedOperation("getImportedKeys", catalog, schema, table);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getPrimaryKeys(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
-        throw unsupportedOperation("getPrimaryKeys", catalog, schema, table);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getProcedures(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException {
-        throw unsupportedOperation("getProcedures", catalog, schemaPattern, procedureNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getProcedureColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException{
-        throw unsupportedOperation("getProcedureColumns", catalog, schemaPattern, procedureNamePattern, columnNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getPseudoColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
-        throw unsupportedOperation("getPseudoColumns", catalog, schemaPattern, tableNamePattern, columnNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getRowIdLifetime()
-     */
-    @Override public RowIdLifetime getRowIdLifetime() throws SQLException {
-        throw unsupportedOperation("getRowIdLifetime");
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSchemas(java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
-        throw unsupportedOperation("getSchemas", catalog, schemaPattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSearchStringEscape()
-     */
-    @Override public String getSearchStringEscape() throws SQLException {
-        throw unsupportedOperation("getSearchStringEscape");
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSQLStateType()
-     */
-    @Override public int getSQLStateType() throws SQLException {
-        throw unsupportedOperation("getSQLStateType");
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSuperTypes(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException {
-        throw unsupportedOperation("getSuperTypes", catalog, schemaPattern, typeNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSuperTables(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
-        throw unsupportedOperation("getSuperTables", catalog, schemaPattern, tableNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getTablePrivileges(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
-        throw unsupportedOperation("getTablePrivileges", catalog, schemaPattern, tableNamePattern);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getTypeInfo()
-     */
-    @Override public ResultSet getTypeInfo() throws SQLException {
-        throw unsupportedOperation("getTypeInfo");
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getUDTs(java.lang.String, java.lang.String, java.lang.String, int[])
-     */
-    @Override public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException {
-        throw unsupportedOperation("getUDTs", catalog, schemaPattern, typeNamePattern, types);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getVersionColumns(java.lang.String, java.lang.String, java.lang.String)
-     */
-    @Override public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
-        throw unsupportedOperation("getVersionColumns", catalog, schema, table);
-    }
-
-    /**
-     * @see org.apache.sis.internal.shapefile.jdbc.AbstractJDBC#unwrap(java.lang.Class)
-     */
-    @Override public <T> T unwrap(Class<T> iface) throws SQLFeatureNotSupportedException {
-        throw unsupportedOperation("unwrap", iface);
-    }
-}
diff --git a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/DBFDatabaseMetaData.java b/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/DBFDatabaseMetaData.java
deleted file mode 100644
index 931ed87..0000000
--- a/storage/sis-shapefile/src/main/java/org/apache/sis/internal/shapefile/jdbc/metadata/DBFDatabaseMetaData.java
+++ /dev/null
@@ -1,1300 +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.sis.internal.shapefile.jdbc.metadata;
-
-import java.io.File;
-import java.sql.*;
-import java.util.Arrays;
-import java.util.Objects;
-
-import org.apache.sis.internal.shapefile.jdbc.SQLConnectionClosedException;
-import org.apache.sis.internal.shapefile.jdbc.connection.DBFConnection;
-import org.apache.sis.internal.shapefile.jdbc.resultset.*;
-import org.apache.sis.internal.shapefile.jdbc.statement.DBFStatement;
-
-/**
- * Database Metadata.
- * @author Marc LE BIHAN
- */
-public class DBFDatabaseMetaData extends AbstractDatabaseMetaData {
-    /** Connection. */
-    private DBFConnection connection;
-
-    /**
-     * Construct a database Metadata.
-     * @param cnt Connection.
-     */
-    public DBFDatabaseMetaData(DBFConnection cnt) {
-        Objects.requireNonNull(cnt, "The database connection used to create Database metadata cannot be null.");
-        this.connection = cnt;
-    }
-
-    /**
-     * @see org.apache.sis.internal.shapefile.jdbc.AbstractJDBC#isWrapperFor(java.lang.Class)
-     */
-    @Override public boolean isWrapperFor(Class<?> iface) {
-        logStep("isWrapperFor", iface);
-        return getInterface().isAssignableFrom(iface);
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#allProceduresAreCallable()
-     */
-    @Override public boolean allProceduresAreCallable() {
-        logStep("allProceduresAreCallable");
-        return false;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#allTablesAreSelectable()
-     */
-    @Override public boolean allTablesAreSelectable() {
-        logStep("allTablesAreSelectable");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-     * @throws SQLConnectionClosedException if the connection is closed.
-     */
-    @Override
-    public ResultSet getColumns(@SuppressWarnings("unused") String catalog, @SuppressWarnings("unused") String schemaPattern, @SuppressWarnings("unused") String tableNamePattern, @SuppressWarnings("unused") String columnNamePattern) throws SQLConnectionClosedException {
-        try(DBFStatement stmt = (DBFStatement)this.connection.createStatement()) {
-            return new DBFBuiltInMemoryResultSetForColumnsListing(stmt, this.connection.getFieldsDescriptors());
-        }
-    }
-
-    /**
-     * Returns the Database File.
-     * @return Database File.
-     */
-    @Override
-    public File getFile() {
-        return this.connection.getFile();
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getURL()
-     */
-    @Override public String getURL() {
-        logStep("getURL");
-        return getFile().getAbsolutePath();
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getUserName()
-     */
-    @Override public String getUserName() {
-        logStep("getUserName");
-        return null;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#isReadOnly()
-     */
-    @Override public boolean isReadOnly() {
-        logStep("isReadOnly");
-        return false;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#nullsAreSortedHigh()
-     */
-    @Override public boolean nullsAreSortedHigh() {
-        logStep("nullsAreSortedHigh");
-        return false; // TODO : Check in documentation about this.
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#nullsAreSortedLow()
-     */
-    @Override public boolean nullsAreSortedLow() {
-        logStep("nullsAreSortedLow");
-        return false; // TODO : Check in documentation about this.
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#nullsAreSortedAtStart()
-     */
-    @Override public boolean nullsAreSortedAtStart() {
-        logStep("nullsAreSortedAtStart");
-        return false; // TODO : Check in documentation about this.
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#nullsAreSortedAtEnd()
-     */
-    @Override public boolean nullsAreSortedAtEnd() {
-        logStep("nullsAreSortedAtEnd");
-        return false; // TODO : Check in documentation about this.
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDatabaseProductName()
-     */
-    @Override public String getDatabaseProductName() {
-        logStep("getDatabaseProductName");
-        return "DBase 3";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDatabaseProductVersion()
-     */
-    @Override public String getDatabaseProductVersion() {
-        logStep("getDatabaseProductVersion");
-        return "3";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDriverName()
-     */
-    @Override public String getDriverName() {
-        logStep("getDriverName");
-        return "Apache SIS DBase 3 JDBC driver";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDriverVersion()
-     */
-    @Override public String getDriverVersion() {
-        logStep("getDriverVersion");
-        return "1.0";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDriverMajorVersion()
-     */
-    @Override public int getDriverMajorVersion() {
-        logStep("getDriverMajorVersion");
-        return 1;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getDriverMinorVersion()
-     */
-    @Override public int getDriverMinorVersion() {
-        logStep("getDriverMinorVersion");
-        return 0;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#usesLocalFiles()
-     */
-    @Override public boolean usesLocalFiles() {
-        logStep("usesLocalFiles");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#usesLocalFilePerTable()
-     */
-    @Override public boolean usesLocalFilePerTable() {
-        logStep("usesLocalFilePerTable");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#supportsMixedCaseIdentifiers()
-     */
-    @Override public boolean supportsMixedCaseIdentifiers() {
-        logStep("supportsMixedCaseIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesUpperCaseIdentifiers()
-     */
-    @Override public boolean storesUpperCaseIdentifiers() {
-        logStep("storesUpperCaseIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesLowerCaseIdentifiers()
-     */
-    @Override public boolean storesLowerCaseIdentifiers() {
-        logStep("storesLowerCaseIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesMixedCaseIdentifiers()
-     */
-    @Override public boolean storesMixedCaseIdentifiers() {
-        logStep("storesMixedCaseIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#supportsMixedCaseQuotedIdentifiers()
-     */
-    @Override public boolean supportsMixedCaseQuotedIdentifiers() {
-        logStep("supportsMixedCaseQuotedIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesUpperCaseQuotedIdentifiers()
-     */
-    @Override public boolean storesUpperCaseQuotedIdentifiers() {
-        logStep("storesUpperCaseQuotedIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesLowerCaseQuotedIdentifiers()
-     */
-    @Override public boolean storesLowerCaseQuotedIdentifiers() {
-        logStep("storesLowerCaseQuotedIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#storesMixedCaseQuotedIdentifiers()
-     */
-    @Override public boolean storesMixedCaseQuotedIdentifiers() {
-        logStep("storesMixedCaseQuotedIdentifiers");
-        return true;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getIdentifierQuoteString()
-     */
-    @Override public String getIdentifierQuoteString() {
-        logStep("getIdentifierQuoteString");
-        return " ";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSQLKeywords()
-     */
-    @Override public String getSQLKeywords() {
-        logStep("getSQLKeywords");
-        return ""; // We don't have special Keywords yet.
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getNumericFunctions()
-     */
-    @Override public String getNumericFunctions() {
-        logStep("getNumericFunctions");
-        return "";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getStringFunctions()
-     */
-    @Override public String getStringFunctions() {
-        logStep("getStringFunctions");
-        return "";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getSystemFunctions()
-     */
-    @Override public String getSystemFunctions() {
-        logStep("getSystemFunctions");
-        return "";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getTimeDateFunctions()
-     */
-    @Override public String getTimeDateFunctions() {
-        logStep("getTimeDateFunctions");
-        return "";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#getExtraNameCharacters()
-     */
-    @Override public String getExtraNameCharacters() {
-        logStep("getExtraNameCharacters");
-        return "";
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#supportsAlterTableWithAddColumn()
-     */
-    @Override public boolean supportsAlterTableWithAddColumn() {
-        logStep("supportsAlterTableWithAddColumn");
-        return false;
-    }
-
-    /**
-     * @see java.sql.DatabaseMetaData#supportsAlterTableWithDropColumn()
-     */
-    @Override public boolean supportsAlterTableWithDropColumn() {
... 9457 lines suppressed ...


Mime
View raw message