sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 01/02: Copy the sis-javafx module from geoapi-3.1 branch. That module was excluded from master when we were targeting JDK7 (which is no longer the case).
Date Thu, 21 Jun 2018 14:56:14 GMT
This is an automated email from the ASF dual-hosted git repository.

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

commit 94afe6c33f698b13ddcd992c2649c68289b5fd84
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Wed Jun 20 19:06:16 2018 +0200

    Copy the sis-javafx module from geoapi-3.1 branch. That module was excluded from master when we were targeting JDK7 (which is no longer the case).
---
 application/pom.xml                                |   1 +
 application/{ => sis-javafx}/pom.xml               |  87 +--
 .../main/java/org/apache/sis/gui/Resources.java    | 220 ++++++
 .../java/org/apache/sis/gui/Resources.properties   |  27 +
 .../org/apache/sis/gui/Resources_fr.properties     |  32 +
 .../java/org/apache/sis/gui/crs/CRSButton.java     |  79 ++
 .../java/org/apache/sis/gui/crs/CRSChooser.java    | 155 ++++
 .../main/java/org/apache/sis/gui/crs/CRSTable.java | 340 +++++++++
 .../src/main/java/org/apache/sis/gui/crs/Code.java | 105 +++
 .../apache/sis/gui/crs/FormattableObjectPane.java  |  68 ++
 .../org/apache/sis/gui/dataset/ResourceTree.java   | 246 ++++++
 .../org/apache/sis/internal/gui/FontGlyphs.java    | 142 ++++
 .../apache/sis/internal/gui/JavaFxUtilities.java   |  98 +++
 .../org/apache/sis/gui/crs/CRSChooser.fxml         |  36 +
 .../org/apache/sis/gui/crs/proj_conic.png          | Bin 0 -> 591 bytes
 .../resources/org/apache/sis/gui/crs/proj_geo.png  | Bin 0 -> 834 bytes
 .../org/apache/sis/gui/crs/proj_square.png         | Bin 0 -> 519 bytes
 .../org/apache/sis/gui/crs/proj_stereo.png         | Bin 0 -> 959 bytes
 .../resources/org/apache/sis/gui/crs/proj_utm.png  | Bin 0 -> 681 bytes
 ide-project/NetBeans/nbproject/build-impl.xml      | 839 +++++++--------------
 ide-project/NetBeans/nbproject/genfiles.properties |   6 +-
 ide-project/NetBeans/nbproject/project.properties  |   2 +
 ide-project/NetBeans/nbproject/project.xml         |   2 +
 23 files changed, 1867 insertions(+), 618 deletions(-)

diff --git a/application/pom.xml b/application/pom.xml
index 307df00..7d82f52 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -116,6 +116,7 @@
        =========================================================== -->
   <modules>
     <module>sis-console</module>
+    <module>sis-javafx</module>
     <module>sis-webapp</module>
   </modules>
 
diff --git a/application/pom.xml b/application/sis-javafx/pom.xml
similarity index 54%
copy from application/pom.xml
copy to application/sis-javafx/pom.xml
index 307df00..1504d3f 100644
--- a/application/pom.xml
+++ b/application/sis-javafx/pom.xml
@@ -27,7 +27,7 @@
 
   <parent>
     <groupId>org.apache.sis</groupId>
-    <artifactId>parent</artifactId>
+    <artifactId>application</artifactId>
     <version>1.0-SNAPSHOT</version>
   </parent>
 
@@ -35,11 +35,11 @@
   <!-- ===========================================================
            Module Description
        =========================================================== -->
-  <artifactId>application</artifactId>
-  <packaging>pom</packaging>
-  <name>Apache SIS applications</name>
+  <groupId>org.apache.sis.application</groupId>
+  <artifactId>sis-javafx</artifactId>
+  <name>Apache SIS application for JavaFX</name>
   <description>
-    Group of modules providing applications built on top of Apache SIS.
+    Client application for JavaFX.
   </description>
 
 
@@ -48,15 +48,14 @@
        =========================================================== -->
   <developers>
     <developer>
-      <name>Chris A. Mattmann</name>
-      <id>mattmann</id>
-      <email>mattmann@apache.org</email>
-      <url>http://sunset.usc.edu/~mattmann/</url>
-      <organization>NASA Jet Propulsion Laboratory</organization>
-      <organizationUrl>http://www.jpl.nasa.gov</organizationUrl>
-      <timezone>-8</timezone>
+      <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>committer</role>
+        <role>developer</role>
       </roles>
     </developer>
   </developers>
@@ -67,20 +66,19 @@
        =========================================================== -->
   <build>
     <plugins>
-
-      <!-- Collect JAR files in <root>/target/binaries directory. -->
+      <!-- Anticipation for Java 9 -->
       <plugin>
-        <groupId>org.apache.sis.core</groupId>
-        <artifactId>sis-build-helper</artifactId>
-        <version>${sis.plugin.version}</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>compile-resources</goal>
-              <goal>collect-jars</goal>
-            </goals>
-          </execution>
-        </executions>
+        <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>
@@ -91,42 +89,15 @@
        =========================================================== -->
   <dependencies>
     <dependency>
-      <groupId>org.apache.sis.storage</groupId>
-      <artifactId>sis-storage</artifactId>
+      <groupId>org.apache.sis.core</groupId>
+      <artifactId>sis-metadata</artifactId>
       <version>${project.version}</version>
     </dependency>
-
-    <!-- Test dependencies -->
     <dependency>
-      <groupId>org.opengis</groupId>
-      <artifactId>geoapi-conformance</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sis.core</groupId>
-      <artifactId>sis-utility</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
+      <groupId>org.webjars</groupId>
+      <artifactId>material-design-icons</artifactId>
+      <version>3.0.1</version>
     </dependency>
   </dependencies>
 
-
-  <!-- ===========================================================
-           Sub-modules included in the build in dependency order
-       =========================================================== -->
-  <modules>
-    <module>sis-console</module>
-    <module>sis-webapp</module>
-  </modules>
-
-  <!-- Following module is omitted for now (unless doing a release)
-       because of the numerous warnings emitted by Pack200. -->
-  <profiles>
-    <profile>
-      <id>apache-release</id>
-      <modules>
-        <module>sis-openoffice</module>
-      </modules>
-    </profile>
-  </profiles>
 </project>
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.java
new file mode 100644
index 0000000..9b56e14
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.java
@@ -0,0 +1,220 @@
+/*
+ * 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.net.URL;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import javax.annotation.Generated;
+import org.opengis.util.InternationalString;
+import org.apache.sis.util.resources.KeyConstants;
+import org.apache.sis.util.resources.IndexedResourceBundle;
+import org.apache.sis.util.resources.ResourceInternationalString;
+
+
+/**
+ * Warning and error messages that are specific to the {@code sis-storage} 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  Martin Desruisseaux (IRD, Geomatys)
+ * @version 0.8
+ * @since   0.8
+ * @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.
+     *
+     * @author  Martin Desruisseaux (IRD, Geomatys)
+     * @since   0.3
+     * @module
+     */
+    @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() {
+        }
+
+        /**
+         * Axis convention
+         */
+        public static final short AxisConvention = 3;
+
+        /**
+         * CRS
+         */
+        public static final short CRS = 4;
+
+        /**
+         * Code
+         */
+        public static final short Code = 1;
+
+        /**
+         * Description
+         */
+        public static final short Description = 2;
+
+        /**
+         * Logitude first
+         */
+        public static final short LongitudeFirst = 5;
+    }
+
+    /**
+     * 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 given locale.
+     *
+     * @param  locale  the locale, or {@code null} for the default locale.
+     * @return resources in the given locale.
+     * @throws MissingResourceException if resources can not be found.
+     */
+    public static Resources forLocale(final Locale locale) throws MissingResourceException {
+        return getBundle(Resources.class, locale);
+    }
+
+    /**
+     * 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 forLocale(null).getString(key);
+    }
+
+    /**
+     * Gets a string for the given key are replace all occurrence of "{0}"
+     * with values 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 forLocale(null).getString(key, arg0);
+    }
+
+    /**
+     * Gets a string for the given key are replace 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 forLocale(null).getString(key, arg0, arg1);
+    }
+
+    /**
+     * Gets a string for the given key are replace 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 forLocale(null).getString(key, arg0, arg1, arg2);
+    }
+
+    /**
+     * The international string to be returned by {@link formatInternational}.
+     */
+    private static final class International extends ResourceInternationalString {
+        private static final long serialVersionUID = -7265791441872360274L;
+
+        International(short key)                           {super(key);}
+        International(short key, Object args)              {super(key, args);}
+        @Override protected KeyConstants getKeyConstants() {return Keys.INSTANCE;}
+        @Override protected IndexedResourceBundle getBundle(final Locale locale) {
+            return forLocale(locale);
+        }
+    }
+
+    /**
+     * Gets an international string for the given key. This method does not check for the key
+     * validity. If the key is invalid, then a {@link MissingResourceException} may be thrown
+     * when a {@link InternationalString#toString(Locale)} method is invoked.
+     *
+     * @param  key  the key for the desired string.
+     * @return an international string for the given key.
+     */
+    public static InternationalString formatInternational(final short key) {
+        return new International(key);
+    }
+
+    /**
+     * Gets an international string for the given key. This method does not check for the key
+     * validity. If the key is invalid, then a {@link MissingResourceException} may be thrown
+     * when a {@link InternationalString#toString(Locale)} method is invoked.
+     *
+     * @param  key   the key for the desired string.
+     * @param  args  values to substitute to "{0}", "{1}", <i>etc</i>.
+     * @return an international string for the given key.
+     */
+    public static InternationalString formatInternational(final short key, final Object... args) {
+        return new International(key, args);
+    }
+}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.properties b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.properties
new file mode 100644
index 0000000..06bad7b
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources.properties
@@ -0,0 +1,27 @@
+#
+# 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.
+#
+
+Code            = Code
+Description     = Description
+CRS             = CRS
+LongitudeFirst  = Logitude first
+AxisConvention  = Axis convention
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources_fr.properties b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources_fr.properties
new file mode 100644
index 0000000..878ee29
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/Resources_fr.properties
@@ -0,0 +1,32 @@
+#
+# 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  :
+#
+
+Code            = Code
+Description     = Description
+CRS             = CRS
+LongitudeFirst  = Longitude en premier
+AxisConvention  = Convention
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSButton.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSButton.java
new file mode 100644
index 0000000..2ddd516
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSButton.java
@@ -0,0 +1,79 @@
+/*
+ * 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.crs;
+
+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/crs/CRSChooser.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSChooser.java
new file mode 100644
index 0000000..649743d
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSChooser.java
@@ -0,0 +1,155 @@
+/*
+ * 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.crs;
+
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.DialogPane;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.BorderPane;
+import org.apache.sis.internal.gui.JavaFxUtilities;
+import org.apache.sis.referencing.crs.DefaultGeographicCRS;
+import org.apache.sis.referencing.cs.AxesConvention;
+import org.apache.sis.referencing.CRS;
+import org.apache.sis.referencing.IdentifiedObjects;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.util.FactoryException;
+import org.apache.sis.referencing.crs.AbstractCRS;
+
+/**
+ * Widget configuration panel used to select a {@link CoordinateReferenceSystem}.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 0.8
+ * @since   0.8
+ * @module
+ */
+public class CRSChooser extends BorderPane {
+
+    @FXML
+    private CheckBox uiLongFirst;
+    @FXML
+    private CheckBox uiAxisConv;
+    @FXML
+    private BorderPane uiPane;
+    @FXML
+    private TextField uiSearch;
+    @FXML
+    private ChoiceBox<AxesConvention> uiChoice;
+
+    private CRSTable uiTable;
+
+    private final ObjectProperty<CoordinateReferenceSystem> crsProperty = new SimpleObjectProperty<>();
+    private boolean updateText;
+
+    /**
+     * Create a new CRSChooser with no {@link CoordinateReferenceSystem} defined.
+     */
+    public CRSChooser() {
+        JavaFxUtilities.loadJRXML(this,CRSChooser.class);
+
+        uiSearch.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
+
+            @Override
+            public void handle(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;
+            }
+        });
+
+        uiChoice.setItems(FXCollections.observableArrayList(AxesConvention.values()));
+
+    }
+
+    public CoordinateReferenceSystem getCorrectedCRS(){
+        CoordinateReferenceSystem crs = crsProperty.get();
+        if (crs == null) return null;
+
+        //fix longitude first
+        try {
+            Integer epsg = IdentifiedObjects.lookupEPSG(crs);
+            if (epsg != null) {
+                crs = CRS.forCode("EPSG:"+epsg);
+                if (uiLongFirst.isSelected()) {
+                    crs = AbstractCRS.castOrCopy(crs).forConvention(AxesConvention.RIGHT_HANDED);
+                }
+            }
+        } catch (FactoryException ex) {/*no important*/}
+
+        //fix axes convention
+        if (uiAxisConv.isSelected() && crs instanceof DefaultGeographicCRS && uiChoice.getValue() != null) {
+            crs = ((DefaultGeographicCRS) crs).forConvention(uiChoice.getValue());
+        }
+
+        return crs;
+    }
+
+    /**
+     * 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.getCorrectedCRS();
+    }
+
+}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSTable.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSTable.java
new file mode 100644
index 0000000..77530ac
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/CRSTable.java
@@ -0,0 +1,340 @@
+/*
+ * 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.crs;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.logging.Level;
+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.gui.Resources;
+import org.apache.sis.internal.gui.FontGlyphs;
+import org.apache.sis.internal.gui.JavaFxUtilities;
+import org.apache.sis.io.wkt.FormattableObject;
+import org.apache.sis.metadata.iso.citation.Citations;
+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.OperationMethod;
+import org.opengis.referencing.operation.PlanarProjection;
+import org.opengis.referencing.operation.Projection;
+import org.opengis.util.FactoryException;
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 0.8
+ * @since   0.8
+ * @module
+ */
+public class CRSTable extends ScrollPane{
+
+    private static final Color COLOR = new Color(30, 150, 250);
+    private static final Image ICON_GEO = JavaFxUtilities.getImage("/org/apache/sis/gui/crs/proj_geo.png", new Dimension(16, 16));
+    private static final Image ICON_SQUARE = JavaFxUtilities.getImage("/org/apache/sis/gui/crs/proj_square.png", new Dimension(16, 16));
+    private static final Image ICON_STEREO = JavaFxUtilities.getImage("/org/apache/sis/gui/crs/proj_stereo.png", new Dimension(16, 16));
+    private static final Image ICON_UTM = JavaFxUtilities.getImage("/org/apache/sis/gui/crs/proj_utm.png", new Dimension(16, 16));
+    private static final Image ICON_CONIC = JavaFxUtilities.getImage("/org/apache/sis/gui/crs/proj_conic.png", new Dimension(16, 16));
+    private static final Image ICON_UNKNOWNED = FontGlyphs.createImage("\uE22F",16,COLOR);
+
+    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) {
+                        JavaFxUtilities.LOGGER.log(Level.INFO,ex.getMessage(),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) {
+                    JavaFxUtilities.LOGGER.log(Level.WARNING,ex.getMessage(),ex);
+                }
+            }
+        }.start();
+
+    }
+
+    public ObjectProperty<CoordinateReferenceSystem> crsProperty(){
+        return crsProperty;
+    }
+
+    public void searchCRS(final String searchword){
+        filter(searchword);
+    }
+
+    /**
+     * 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_UNKNOWNED;
+        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_UNKNOWNED;
+                                try {
+                                    final IdentifiedObject obj = item.createObject();
+                                    icon = getIcon(obj);
+                                } catch (FactoryException ex) {
+                                    JavaFxUtilities.LOGGER.log(Level.INFO, ex.getMessage(),ex);
+                                }
+                                setGraphic(new ImageView(icon));
+                            }
+                        }
+                    };
+                }
+            });
+        }
+
+    }
+
+    private static class CodeColumn extends TableColumn<Code, String> {
+
+        public CodeColumn() {
+            super(Resources.format(Resources.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(Resources.format(Resources.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) {
+                                                FormattableObjectPane.showDialog(this, (FormattableObject) obj);
+                                            }
+                                        } catch (FactoryException ex) {
+                                            JavaFxUtilities.LOGGER.log(Level.INFO,ex.getMessage(),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/crs/Code.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/Code.java
new file mode 100644
index 0000000..f47a97c
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/Code.java
@@ -0,0 +1,105 @@
+/*
+ * 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.crs;
+
+import org.apache.sis.util.ArgumentChecks;
+import org.opengis.referencing.AuthorityFactory;
+import org.opengis.referencing.IdentifiedObject;
+import org.opengis.util.FactoryException;
+
+
+/**
+ * This element stores the {@linkplain #code code value}.
+ * The description name will be fetched when first needed and returned by {@link #toString}.
+ *
+ * @author Martin Desruisseaux (IRD)
+ * @version 0.8
+ * @since   0.8
+ * @module
+ */
+final class Code {
+
+    /**
+     * The authority code.
+     */
+    public final String code;
+
+    /**
+     * The CRS object description for the {@linkplain #code}.
+     * Will be extracted only when first needed.
+     */
+    private String name;
+
+    private String description;
+
+    /**
+     * 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.
+     *
+     * @param factory The authority factory.
+     * @param code The authority code.
+     */
+    public Code(final AuthorityFactory factory, final String code) {
+        ArgumentChecks.ensureNonNull("factory", factory);
+        ArgumentChecks.ensureNonNull("code", code);
+        this.factory = factory;
+        this.code    = code;
+    }
+
+    /**
+     * Create the Object identified by code.
+     *
+     * @return IdentifiedObject
+     * @throws FactoryException
+     */
+    public IdentifiedObject createObject() throws FactoryException{
+        return factory.createObject(code);
+    }
+
+    /**
+     * Returns a description of the object.
+     *
+     * @return
+     */
+    public String getDescription(){
+        if (description == null) try {
+            description = factory.getDescriptionText(code).toString();
+        } catch (FactoryException e) {
+            description = e.getLocalizedMessage();
+        }
+        return description;
+    }
+
+    /**
+     * Returns the name for this code.
+     *
+     * @todo Maybe we should use the widget Locale when invoking InternationalString.toString(...).
+     */
+    @Override
+    public String toString() {
+        if (name == null) {
+            name = code + " - "+getDescription();
+        }
+        return name;
+    }
+}
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/FormattableObjectPane.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/FormattableObjectPane.java
new file mode 100644
index 0000000..9909695
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/crs/FormattableObjectPane.java
@@ -0,0 +1,68 @@
+/*
+ * 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.crs;
+
+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 0.8
+ * @since   0.8
+ * @module
+ */
+class FormattableObjectPane extends BorderPane {
+
+    private final ChoiceBox<Convention> choice = new ChoiceBox<>(FXCollections.observableArrayList(Convention.values()));
+    private final TextArea text = new TextArea();
+
+    public FormattableObjectPane(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 FormattableObjectPane chooser = new FormattableObjectPane(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/gui/dataset/ResourceTree.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceTree.java
new file mode 100644
index 0000000..c892e95
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceTree.java
@@ -0,0 +1,246 @@
+/*
+ * 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.internal.util.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 0.8
+ * @since   0.8
+ * @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(), false);
+                    }
+                    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();
+                }
+                return lst;
+            }
+            return Collections.EMPTY_LIST;
+        }
+
+    }
+
+    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/internal/gui/FontGlyphs.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FontGlyphs.java
new file mode 100644
index 0000000..9675057
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/FontGlyphs.java
@@ -0,0 +1,142 @@
+/*
+ * 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 0.8
+ * @since   0.8
+ * @module
+ */
+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/JavaFxUtilities.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/JavaFxUtilities.java
new file mode 100644
index 0000000..69acf9e
--- /dev/null
+++ b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/JavaFxUtilities.java
@@ -0,0 +1,98 @@
+/*
+ * 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 java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.image.Image;
+import javax.imageio.ImageIO;
+import org.apache.sis.gui.Resources;
+import org.apache.sis.util.logging.Logging;
+
+/**
+ * Internal JavaFx utilities.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @version 0.8
+ * @since   0.8
+ * @module
+ */
+public final class JavaFxUtilities {
+
+    public static final Logger LOGGER = Logging.getLogger("org.apache.sis.gui");
+
+    private JavaFxUtilities(){}
+
+    /**
+     * Load an image and resize it to requested size.
+     *
+     * @param path path to image in the jar
+     * @param resize null for no resize
+     * @return resized image
+     */
+    public static Image getImage(final String path, Dimension resize) {
+        BufferedImage img = null;
+        try {
+            img = ImageIO.read(JavaFxUtilities.class.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;
+            }
+
+        } catch (IOException ex) {
+            LOGGER.log(Level.WARNING, ex.getMessage(), ex);
+        }
+        return SwingFXUtils.toFXImage(img, null);
+    }
+
+    /**
+     * Load and initialize widget from jrxml definition set this module bundle.
+     *
+     * @param candidate widget to load JRXML in
+     * @param cdtClass class as base for resource classloader
+     */
+    public static void loadJRXML(Parent candidate, Class cdtClass) {
+        final String fxmlpath = "/"+cdtClass.getName().replace('.', '/')+".fxml";
+        final FXMLLoader loader = new FXMLLoader(cdtClass.getResource(fxmlpath));
+        loader.setResources(Resources.forLocale(Locale.getDefault()));
+        loader.setController(candidate);
+        loader.setRoot(candidate);
+        //in special environement like osgi or other, we must use the proper class loaders
+        //not necessarly the one who loaded the FXMLLoader class
+        loader.setClassLoader(cdtClass.getClassLoader());
+        try {
+            loader.load();
+        } catch (IOException ex) {
+            throw new IllegalArgumentException(ex.getMessage(), ex);
+        }
+    }
+
+}
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/CRSChooser.fxml b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/CRSChooser.fxml
new file mode 100644
index 0000000..cb22507
--- /dev/null
+++ b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/CRSChooser.fxml
@@ -0,0 +1,36 @@
+<?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="%CRS" GridPane.rowSpan="2" />
+            <CheckBox fx:id="uiLongFirst" maxWidth="1.7976931348623157E308" mnemonicParsing="false" styleClass="property-key" text="%LongitudeFirst" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.halignment="LEFT" />
+            <TextField fx:id="uiSearch" GridPane.columnSpan="3" GridPane.rowIndex="2" />
+            <CheckBox fx:id="uiAxisConv" mnemonicParsing="false" text="%AxisConvention" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+            <ChoiceBox fx:id="uiChoice" prefWidth="150.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
+         </children>
+         <BorderPane.margin>
+            <Insets bottom="10.0" left="10.0" right="10.0" />
+         </BorderPane.margin>
+      </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/crs/proj_conic.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_conic.png
new file mode 100644
index 0000000..a062e1f
Binary files /dev/null and b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_conic.png differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_geo.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_geo.png
new file mode 100644
index 0000000..6f9340c
Binary files /dev/null and b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_geo.png differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_square.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_square.png
new file mode 100644
index 0000000..6e21c43
Binary files /dev/null and b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_square.png differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_stereo.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_stereo.png
new file mode 100644
index 0000000..d22f575
Binary files /dev/null and b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_stereo.png differ
diff --git a/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_utm.png b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_utm.png
new file mode 100644
index 0000000..d04a803
Binary files /dev/null and b/application/sis-javafx/src/main/resources/org/apache/sis/gui/crs/proj_utm.png differ
diff --git a/ide-project/NetBeans/nbproject/build-impl.xml b/ide-project/NetBeans/nbproject/build-impl.xml
index 3161fdd..cb32f3f 100644
--- a/ide-project/NetBeans/nbproject/build-impl.xml
+++ b/ide-project/NetBeans/nbproject/build-impl.xml
@@ -19,7 +19,7 @@ is divided into following sections:
   - cleanup
 
         -->
-<project xmlns:if="ant:if" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" xmlns:unless="ant:unless" basedir=".." default="default" name="Apache_SIS_on_GeoAPI_3.0-impl">
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="Apache_SIS_on_GeoAPI_3.0-impl">
     <fail message="Please build using Ant 1.8.0 or higher.">
         <condition>
             <not>
@@ -53,72 +53,7 @@ is divided into following sections:
         <property file="nbproject/configs/${config}.properties"/>
         <property file="nbproject/project.properties"/>
     </target>
-    <target name="-init-modules-supported">
-        <condition property="modules.supported.internal" value="true">
-            <not>
-                <matches pattern="1\.[0-8](\..*)?" string="${javac.source}"/>
-            </not>
-        </condition>
-    </target>
-    <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-modulename">
-        <macrodef name="modulename" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute name="property"/>
-            <attribute name="sourcepath"/>
-            <sequential>
-                <loadresource property="@{property}" quiet="true">
-                    <javaresource classpath="@{sourcepath}" name="module-info.java" parentFirst="false"/>
-                    <filterchain>
-                        <stripjavacomments/>
-                        <linecontainsregexp>
-                            <regexp pattern="module .* \{"/>
-                        </linecontainsregexp>
-                        <tokenfilter>
-                            <linetokenizer/>
-                            <replaceregex flags="s" pattern="(\s*module\s+)(\S*)(\s*\{.*)" replace="\2"/>
-                        </tokenfilter>
-                        <striplinebreaks/>
-                    </filterchain>
-                </loadresource>
-            </sequential>
-        </macrodef>
-    </target>
-    <target depends="-init-modules-supported,-init-macrodef-modulename" if="modules.supported.internal" name="-init-source-module-properties">
-        <fail message="Java 9 support requires Ant 1.10.0 or higher.">
-            <condition>
-                <not>
-                    <antversion atleast="1.10.0"/>
-                </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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}"/>
-        <condition property="named.module.internal">
-            <and>
-                <isset property="module.name"/>
-                <length length="0" string="${module.name}" when="greater"/>
-            </and>
-        </condition>
-        <condition property="unnamed.module.internal">
-            <not>
-                <isset property="named.module.internal"/>
-            </not>
-        </condition>
-        <property name="javac.modulepath" value=""/>
-        <property name="run.modulepath" value="${javac.modulepath}"/>
-        <property name="module.build.classes.dir" value="${build.classes.dir}"/>
-        <property name="debug.modulepath" value="${run.modulepath}"/>
-        <property name="javac.upgrademodulepath" value=""/>
-        <property name="run.upgrademodulepath" value="${javac.upgrademodulepath}"/>
-        <condition else="" property="javac.systemmodulepath.cmd.line.arg" value="--system '${javac.systemmodulepath}'">
-            <and>
-                <isset property="javac.systemmodulepath"/>
-                <length length="0" string="${javac.systemmodulepath}" when="greater"/>
-            </and>
-        </condition>
-        <property name="dist.jlink.dir" value="${dist.dir}/jlink"/>
-        <property name="dist.jlink.output" value="${dist.jlink.dir}/${application.title}"/>
-        <property name="module.name" value=""/>
-    </target>
-    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property,-init-modules-supported" name="-do-init">
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
         <property name="platform.java" value="${java.home}/bin/java"/>
         <available file="${manifest.file}" property="manifest.available"/>
         <condition property="splashscreen.available">
@@ -141,9 +76,7 @@ is divided into following sections:
             <and>
                 <isset property="javac.profile"/>
                 <length length="0" string="${javac.profile}" when="greater"/>
-                <not>
-                    <matches pattern="1\.[0-7](\..*)?" string="${javac.source}"/>
-                </not>
+                <matches pattern="((1\.[89])|9)(\..*)?" string="${javac.source}"/>
             </and>
         </condition>
         <condition property="do.archive">
@@ -161,9 +94,6 @@ is divided into following sections:
                 <not>
                     <istrue value="${mkdist.disabled}"/>
                 </not>
-                <not>
-                    <istrue value="${modules.supported.internal}"/>
-                </not>
             </and>
         </condition>
         <condition property="do.archive+manifest.available">
@@ -193,6 +123,7 @@ is divided into following sections:
         <condition property="have.tests">
             <or>
                 <available file="${test.webapp.dir}"/>
+                <available file="${test.javafx.dir}"/>
                 <available file="${test.console.dir}"/>
                 <available file="${test.portrayal.dir}"/>
                 <available file="${test.earth-obs.dir}"/>
@@ -216,6 +147,7 @@ is divided into following sections:
             <or>
                 <available file="${src.local-src.dir}"/>
                 <available file="${src.webapp.dir}"/>
+                <available file="${src.javafx.dir}"/>
                 <available file="${src.console.dir}"/>
                 <available file="${src.portrayal.dir}"/>
                 <available file="${src.earth-obs.dir}"/>
@@ -338,6 +270,7 @@ is divided into following sections:
     <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.javafx.dir">Must set src.javafx.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>
@@ -357,6 +290,7 @@ is divided into following sections:
         <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.javafx.dir">Must set test.javafx.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>
@@ -392,80 +326,11 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="modules.supported.internal" name="-init-macrodef-javac-with-module">
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
         <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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.javafx.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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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"/>
-            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
-            <attribute default="${javac.processorpath}" name="processorpath"/>
-            <attribute default="${javac.processormodulepath}" name="processormodulepath"/>
-            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
-            <attribute default="${includes}" name="includes"/>
-            <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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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>
-                <condition property="warn.excludes.internal">
-                    <and>
-                        <isset property="named.module.internal"/>
-                        <length length="0" string="@{excludes}" trim="true" when="greater"/>
-                    </and>
-                </condition>
-                <echo if:set="warn.excludes.internal" level="warning" message="The javac excludes are not supported in the JDK 9 Named Module."/>
-                <property location="${build.dir}/empty" name="empty.dir"/>
-                <mkdir dir="${empty.dir}"/>
-                <mkdir dir="@{apgeneratedsrcdir}"/>
-                <condition property="processormodulepath.set">
-                    <resourcecount count="0" when="greater">
-                        <path>
-                            <pathelement path="@{processormodulepath}"/>
-                        </path>
-                    </resourcecount>
-                </condition>
-                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
-                    <src>
-                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
-                            <include name="*"/>
-                        </dirset>
-                    </src>
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <modulepath>
-                        <path path="@{modulepath}"/>
-                    </modulepath>
-                    <upgrademodulepath>
-                        <path path="@{upgrademodulepath}"/>
-                    </upgrademodulepath>
-                    <compilerarg line="${javac.systemmodulepath.cmd.line.arg}"/>
-                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
-                    <compilerarg line="${javac.compilerargs}"/>
-                    <compilerarg if:set="processormodulepath.set" value="--processor-module-path"/>
-                    <compilerarg if:set="processormodulepath.set" path="@{processormodulepath}"/>
-                    <compilerarg unless:set="processormodulepath.set" value="-processorpath"/>
-                    <compilerarg path="@{processorpath}:${empty.dir}" unless:set="processormodulepath.set"/>
-                    <compilerarg line="${ap.processors.internal}"/>
-                    <compilerarg line="${annotation.processing.processor.options}"/>
-                    <compilerarg value="-s"/>
-                    <compilerarg path="@{apgeneratedsrcdir}"/>
-                    <compilerarg line="${ap.proc.none.internal}"/>
-                    <customize/>
-                </javac>
-            </sequential>
-        </macrodef>
-    </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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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"/>
-            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
             <attribute default="${javac.processorpath}" name="processorpath"/>
             <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
             <attribute default="${includes}" name="includes"/>
@@ -502,13 +367,11 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-ap-cmdline-properties,-init-source-module-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+    <target depends="-init-ap-cmdline-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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.javafx.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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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"/>
-            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
             <attribute default="${javac.processorpath}" name="processorpath"/>
             <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
             <attribute default="${includes}" name="includes"/>
@@ -537,9 +400,9 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-macrodef-javac-with-module,-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+    <target depends="-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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}" name="srcdir"/>
+            <attribute default="${src.local-src.dir}:${src.webapp.dir}:${src.javafx.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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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>
@@ -592,150 +455,113 @@ is divided into following sections:
         <property name="test.binarytestincludes" value=""/>
         <property name="test.binaryexcludes" value=""/>
     </target>
-    <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-junit-prototype-with-module">
-        <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
+    <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
             <attribute default="${includes}" name="includes"/>
             <attribute default="${excludes}" name="excludes"/>
-            <element name="customizePrototype" optional="true"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
             <sequential>
                 <property name="junit.forkmode" value="perTest"/>
                 <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
                     <syspropertyset>
                         <propertyref prefix="test-sys-prop."/>
                         <mapper from="test-sys-prop.*" to="*" type="glob"/>
                     </syspropertyset>
-                    <classpath>
-                        <path path="${run.test.classpath}"/>
-                    </classpath>
-                    <modulepath>
-                        <path path="${run.test.modulepath}"/>
-                    </modulepath>
                     <formatter type="brief" usefile="false"/>
                     <formatter type="xml"/>
-                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
                     <jvmarg value="-ea"/>
-                    <jvmarg line="${run.test.jvmargs}"/>
-                    <customizePrototype/>
+                    <customize/>
                 </junit>
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-modules-supported" name="-init-macrodef-junit-prototype-without-module" unless="modules.supported.internal">
-        <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
             <attribute default="${includes}" name="includes"/>
             <attribute default="${excludes}" name="excludes"/>
-            <element name="customizePrototype" optional="true"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
             <sequential>
                 <property name="junit.forkmode" value="perTest"/>
                 <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.webapp.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.javafx.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>
+                        <fileset dir="${test.geotiff.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <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>
+                        <fileset dir="${test.xmlstore.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.storage.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.feature.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.raster.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.referencing.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.ref-by-id.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.metadata.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.utility.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.fra-profile.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.gdal.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
                     <syspropertyset>
                         <propertyref prefix="test-sys-prop."/>
                         <mapper from="test-sys-prop.*" to="*" type="glob"/>
                     </syspropertyset>
-                    <classpath>
-                        <path path="${run.test.classpath}"/>
-                    </classpath>
                     <formatter type="brief" usefile="false"/>
                     <formatter type="xml"/>
-                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
                     <jvmarg value="-ea"/>
-                    <customizePrototype/>
+                    <customize/>
                 </junit>
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
-        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${includes}" name="includes"/>
-            <attribute default="${excludes}" name="excludes"/>
-            <attribute default="**" name="testincludes"/>
-            <attribute default="" name="testmethods"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <j2seproject3:junit-prototype>
-                    <customizePrototype>
-                        <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
-                        <customize/>
-                    </customizePrototype>
-                </j2seproject3:junit-prototype>
-            </sequential>
-        </macrodef>
-    </target>
-    <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
-        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${includes}" name="includes"/>
-            <attribute default="${excludes}" name="excludes"/>
-            <attribute default="**" name="testincludes"/>
-            <attribute default="" name="testmethods"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <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>
-                            <fileset dir="${test.geotiff.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <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>
-                            <fileset dir="${test.xmlstore.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.storage.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.feature.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.raster.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.referencing.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.ref-by-id.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.metadata.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.utility.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.fra-profile.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${test.gdal.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                                <filename name="@{testincludes}"/>
-                            </fileset>
-                            <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
-                                <filename name="${test.binarytestincludes}"/>
-                            </fileset>
-                        </batchtest>
-                        <customize/>
-                    </customizePrototype>
-                </j2seproject3:junit-prototype>
-            </sequential>
-        </macrodef>
-    </target>
     <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
     <target if="${testng.available}" name="-init-macrodef-testng">
         <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
@@ -752,6 +578,9 @@ is divided into following sections:
                     <fileset dir="${test.webapp.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
                         <filename name="@{testincludes}"/>
                     </fileset>
+                    <fileset dir="${test.javafx.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>
@@ -811,10 +640,6 @@ is divided into following sections:
                         <propertyref prefix="test-sys-prop."/>
                         <mapper from="test-sys-prop.*" to="*" type="glob"/>
                     </propertyset>
-                    <classpath>
-                        <path path="${run.test.classpath}"/>
-                    </classpath>
-                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
                     <customize/>
                 </testng>
             </sequential>
@@ -869,6 +694,10 @@ is divided into following sections:
             <sequential>
                 <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
                     <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
                         <jvmarg line="${run.jvmargs}"/>
                         <jvmarg line="${run.jvmargs.ide}"/>
                     </customize>
@@ -876,20 +705,128 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+    <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.webapp.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.javafx.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>
+                        <fileset dir="${test.geotiff.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <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>
+                        <fileset dir="${test.xmlstore.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.storage.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.feature.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.raster.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.referencing.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.ref-by-id.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.metadata.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.utility.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.fra-profile.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${test.gdal.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
         <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
             <attribute default="${includes}" name="includes"/>
             <attribute default="${excludes}" name="excludes"/>
             <attribute default="**" name="testincludes"/>
             <attribute default="" name="testmethods"/>
-            <element name="customizeDebuggee" optional="true"/>
+            <element implicit="true" name="customize" optional="true"/>
             <sequential>
-                <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
-                    <customize>
-                        <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
-                        <customizeDebuggee/>
-                    </customize>
-                </j2seproject3:junit>
+                <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit-debug>
             </sequential>
         </macrodef>
     </target>
@@ -908,14 +845,14 @@ is divided into following sections:
                 <delete dir="${build.test.results.dir}" quiet="true"/>
                 <mkdir dir="${build.test.results.dir}"/>
                 <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
-                    <customizeDebuggee>
+                    <customize>
                         <customize2/>
                         <jvmarg value="-ea"/>
                         <arg line="${testng.debug.mode}"/>
                         <arg line="-d ${build.test.results.dir}"/>
                         <arg line="-listener org.testng.reporters.VerboseReporter"/>
                         <arg line="${testng.cmd.args}"/>
-                    </customizeDebuggee>
+                    </customize>
                 </j2seproject3:debug>
             </sequential>
         </macrodef>
@@ -942,10 +879,14 @@ is divided into following sections:
             <attribute default="" name="testMethod"/>
             <sequential>
                 <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
-                    <customizeDebuggee>
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
                         <jvmarg line="${run.jvmargs}"/>
                         <jvmarg line="${run.jvmargs.ide}"/>
-                    </customizeDebuggee>
+                    </customize>
                 </j2seproject3:test-debug-impl>
             </sequential>
         </macrodef>
@@ -1025,14 +966,10 @@ is divided into following sections:
     <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
         <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
             <attribute default="${main.class}" name="name"/>
-            <attribute default="${debug.modulepath}" name="modulepath"/>
             <attribute default="${debug.classpath}" name="classpath"/>
             <attribute default="" name="stopclassname"/>
             <sequential>
                 <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
-                    <modulepath>
-                        <path path="@{modulepath}"/>
-                    </modulepath>
                     <classpath>
                         <path path="@{classpath}"/>
                     </classpath>
@@ -1051,6 +988,18 @@ is divided into following sections:
         </macrodef>
     </target>
     <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
         <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
             <os family="windows"/>
         </condition>
@@ -1060,79 +1009,21 @@ is divided into following sections:
     </target>
     <target depends="-init-debug-args" name="-init-macrodef-debug">
         <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${module.name}" name="modulename"/>
             <attribute default="${main.class}" name="classname"/>
-            <attribute default="${debug.modulepath}" name="modulepath"/>
             <attribute default="${debug.classpath}" name="classpath"/>
-            <element name="customizeDebuggee" optional="true"/>
-            <sequential>
-                <j2seproject1:java classname="@{classname}" classpath="@{classpath}" modulename="@{modulename}" modulepath="@{modulepath}">
-                    <customize>
-                        <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
-                        <customizeDebuggee/>
-                    </customize>
-                </j2seproject1:java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target depends="-init-source-module-properties" if="named.module.internal" name="-init-macrodef-java-with-module">
-        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="${module.name}" name="modulename"/>
-            <attribute default="${main.class}" name="classname"/>
-            <attribute default="${run.modulepath}" name="modulepath"/>
-            <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
-            <attribute default="${run.classpath}" name="classpath"/>
-            <attribute default="jvm" name="jvm"/>
             <element name="customize" optional="true"/>
             <sequential>
-                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" module="@{modulename}">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <modulepath>
-                        <pathelement path="@{modulepath}"/>
-                        <pathelement location="${module.build.classes.dir}"/>
-                    </modulepath>
-                    <upgrademodulepath>
-                        <path path="@{upgrademodulepath}"/>
-                    </upgrademodulepath>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
                     <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
                     <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
                     <jvmarg line="${run.jvmargs}"/>
                     <jvmarg line="${run.jvmargs.ide}"/>
-                    <syspropertyset>
-                        <propertyref prefix="run-sys-prop."/>
-                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
-                    </syspropertyset>
-                    <customize/>
-                </java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target depends="-init-source-module-properties" if="unnamed.module.internal" name="-init-macrodef-java-with-unnamed-module">
-        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="" name="modulename"/>
-            <attribute default="${main.class}" name="classname"/>
-            <attribute default="${run.modulepath}" name="modulepath"/>
-            <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
-            <attribute default="${run.classpath}" name="classpath"/>
-            <attribute default="jvm" name="jvm"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
                     <classpath>
                         <path path="@{classpath}"/>
                     </classpath>
-                    <modulepath>
-                        <path path="@{modulepath}"/>
-                    </modulepath>
-                    <upgrademodulepath>
-                        <path path="@{upgrademodulepath}"/>
-                    </upgrademodulepath>
-                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
-                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
-                    <jvmarg line="${run.jvmargs}"/>
-                    <jvmarg line="${run.jvmargs.ide}"/>
                     <syspropertyset>
                         <propertyref prefix="run-sys-prop."/>
                         <mapper from="run-sys-prop.*" to="*" type="glob"/>
@@ -1142,11 +1033,9 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-source-module-properties" name="-init-macrodef-java-without-module" unless="modules.supported.internal">
+    <target name="-init-macrodef-java">
         <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="" name="modulename"/>
             <attribute default="${main.class}" name="classname"/>
-            <attribute default="" name="modulepath"/>
             <attribute default="${run.classpath}" name="classpath"/>
             <attribute default="jvm" name="jvm"/>
             <element name="customize" optional="true"/>
@@ -1169,7 +1058,6 @@ is divided into following sections:
             </sequential>
         </macrodef>
     </target>
-    <target depends="-init-macrodef-java-with-module, -init-macrodef-java-with-unnamed-module, -init-macrodef-java-without-module" name="-init-macrodef-java"/>
     <target name="-init-macrodef-copylibs">
         <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
             <attribute default="${manifest.file}" name="manifest"/>
@@ -1259,9 +1147,7 @@ is divided into following sections:
         <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
     </target>
     <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
-        <antcall target="clean">
-            <param name="no.dependencies" value="true"/>
-        </antcall>
+        <antcall target="clean"/>
     </target>
     <target depends="init,deps-jar" name="-pre-pre-compile">
         <mkdir dir="${build.classes.dir}"/>
@@ -1276,13 +1162,14 @@ 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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile.dir}:${src.gdal.dir}:${src.c.gdal.dir}:${build.generated.subdirs}"/>
+        <j2seproject3:depend srcdir="${src.local-src.dir}:${src.webapp.dir}:${src.javafx.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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-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.javafx.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}"/>
@@ -1321,7 +1208,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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile. [...]
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.local-src.dir}:${src.webapp.dir}:${src.javafx.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.raster.dir}:${src.referencing.dir}:${src.ref-by-id.dir}:${src.metadata.dir}:${src.utility.dir}:${src.fra-profile. [...]
     </target>
     <target name="-post-compile-single">
         <!-- Empty placeholder for easier customization. -->
@@ -1341,25 +1228,6 @@ is divided into following sections:
         <!-- Empty placeholder for easier customization. -->
         <!-- You can override this target in the ../build.xml file. -->
     </target>
-    <target depends="init,compile" name="-check-module-main-class">
-        <pathconvert property="main.class.file">
-            <string value="${main.class}"/>
-            <unpackagemapper from="*" to="*.class"/>
-        </pathconvert>
-        <condition property="do.module.main.class">
-            <and>
-                <isset property="main.class.available"/>
-                <available file="${build.classes.dir}/module-info.class"/>
-                <available file="${build.classes.dir}/${main.class.file}"/>
-                <isset property="libs.CopyLibs.classpath"/>
-                <available classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}"/>
-            </and>
-        </condition>
-    </target>
-    <target depends="-check-module-main-class" if="do.module.main.class" name="-set-module-main-class">
-        <taskdef classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}" name="modulemainclass"/>
-        <modulemainclass failonerror="false" mainclass="${main.class}" moduleinfo="${build.classes.dir}/module-info.class"/>
-    </target>
     <target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
         <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
         <touch file="${tmp.manifest.file}" verbose="false"/>
@@ -1396,37 +1264,11 @@ is divided into following sections:
         <j2seproject1:jar manifest="${tmp.manifest.file}"/>
         <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
         <property location="${dist.jar}" name="dist.jar.resolved"/>
-        <condition else="${dist.jar.resolved}" property="jar.usage.message.class.path.replacement" value="">
-            <isset property="named.module.internal"/>
-        </condition>
         <pathconvert property="run.classpath.with.dist.jar">
             <path path="${run.classpath}"/>
-            <map from="${build.classes.dir.resolved}" to="${jar.usage.message.class.path.replacement}"/>
-        </pathconvert>
-        <pathconvert property="run.modulepath.with.dist.jar">
-            <path location="${dist.jar.resolved}"/>
-            <path path="${run.modulepath}"/>
             <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
         </pathconvert>
-        <condition else="${run.modulepath}" property="jar.usage.message.run.modulepath.with.dist.jar" value="${run.modulepath.with.dist.jar}">
-            <isset property="named.module.internal"/>
-        </condition>
-        <condition else="" property="jar.usage.message.module.path" value=" -p ${jar.usage.message.run.modulepath.with.dist.jar}">
-            <and>
-                <isset property="modules.supported.internal"/>
-                <length length="0" string="${jar.usage.message.run.modulepath.with.dist.jar}" when="greater"/>
-            </and>
-        </condition>
-        <condition else="" property="jar.usage.message.class.path" value=" -cp ${run.classpath.with.dist.jar}">
-            <length length="0" string="${run.classpath.with.dist.jar}" when="greater"/>
-        </condition>
-        <condition else="/${main.class}" property="jar.usage.message.main.class.class.selector" value="">
-            <isset property="do.module.main.class"/>
-        </condition>
-        <condition else=" ${main.class}" property="jar.usage.message.main.class" value=" -m ${module.name}${jar.usage.message.main.class.class.selector}">
-            <isset property="named.module.internal"/>
-        </condition>
-        <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java}${jar.usage.message.module.path}${jar.usage.message.class.path}${jar.usage.message.main.class}">
+        <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java} -cp ${run.classpath.with.dist.jar} ${main.class}">
             <isset property="main.class.available"/>
         </condition>
         <condition else="debug" property="jar.usage.level" value="info">
@@ -1445,73 +1287,8 @@ is divided into following sections:
         <!-- Empty placeholder for easier customization. -->
         <!-- You can override this target in the ../build.xml file. -->
     </target>
-    <target depends="init,compile,-pre-jar,-set-module-main-class,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
-    <target depends="init,compile,-pre-jar,-do-jar,-post-jar,deploy" description="Build JAR." name="jar"/>
-    <!--
-                =================
-                DEPLOY SECTION
-                =================
-            -->
-    <target name="-pre-deploy">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init" name="-check-jlink">
-        <condition property="do.jlink.internal">
-            <and>
-                <istrue value="${do.jlink}"/>
-                <isset property="do.archive"/>
-                <isset property="named.module.internal"/>
-            </and>
-        </condition>
-    </target>
-    <target depends="init,-do-jar,-post-jar,-pre-deploy,-check-jlink" if="do.jlink.internal" name="-do-deploy">
-        <delete dir="${dist.jlink.dir}" failonerror="false" quiet="true"/>
-        <property name="jlink.launcher.name" value="${application.title}"/>
-        <condition else="${module.name}" property="jlink.add.modules" value="${module.name},${jlink.additionalmodules}">
-            <and>
-                <isset property="jlink.additionalmodules"/>
-                <length length="0" string="${jlink.additionalmodules}" when="greater"/>
-            </and>
-        </condition>
-        <condition property="jlink.do.strip.internal">
-            <and>
-                <isset property="jlink.strip"/>
-                <istrue value="${jlink.strip}"/>
-            </and>
-        </condition>
-        <condition property="jlink.do.additionalparam.internal">
-            <and>
-                <isset property="jlink.additionalparam"/>
-                <length length="0" string="${jlink.additionalparam}" when="greater"/>
-            </and>
-        </condition>
-        <condition property="jlink.do.launcher.internal">
-            <and>
-                <istrue value="${jlink.launcher}"/>
-                <isset property="main.class.available"/>
-            </and>
-        </condition>
-        <property name="platform.jlink" value="${jdk.home}/bin/jlink"/>
-        <property name="jlink.systemmodules.internal" value="${jdk.home}/jmods"/>
-        <exec executable="${platform.jlink}">
-            <arg value="--module-path"/>
-            <arg path="${jlink.systemmodules.internal}:${run.modulepath}:${dist.jar}"/>
-            <arg value="--add-modules"/>
-            <arg value="${jlink.add.modules}"/>
-            <arg if:set="jlink.do.strip.internal" value="--strip-debug"/>
-            <arg if:set="jlink.do.launcher.internal" value="--launcher"/>
-            <arg if:set="jlink.do.launcher.internal" value="${jlink.launcher.name}=${module.name}/${main.class}"/>
-            <arg if:set="jlink.do.additionalparam.internal" line="${jlink.additionalparam}"/>
-            <arg value="--output"/>
-            <arg value="${dist.jlink.output}"/>
-        </exec>
-    </target>
-    <target name="-post-deploy">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="-do-jar,-post-jar,-pre-deploy,-do-deploy,-post-deploy" name="deploy"/>
+    <target depends="init,compile,-pre-jar,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
+    <target depends="init,compile,-pre-jar,-do-jar,-post-jar" description="Build JAR." name="jar"/>
     <!--
                 =================
                 EXECUTION SECTION
@@ -1548,9 +1325,9 @@ is divided into following sections:
     </target>
     <target depends="init,compile" name="-debug-start-debuggee">
         <j2seproject3:debug>
-            <customizeDebuggee>
+            <customize>
                 <arg line="${application.args}"/>
-            </customizeDebuggee>
+            </customize>
         </j2seproject3:debug>
     </target>
     <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
@@ -1616,24 +1393,28 @@ is divided into following sections:
             </customize>
         </profile>
     </target>
-    <target depends="-init-macrodef-junit,profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+    <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
         <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
         <nbprofiledirect>
             <classpath>
                 <path path="${run.test.classpath}"/>
             </classpath>
         </nbprofiledirect>
-        <j2seproject3:junit excludes="${excludes}" includes="${includes}" testincludes="${profile.class}" testmethods="">
-            <customize>
-                <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
-                <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
-                <jvmarg value="${profiler.info.jvmargs.agent}"/>
-                <jvmarg line="${profiler.info.jvmargs}"/>
-                <classpath>
-                    <path path="${run.test.classpath}"/>
-                </classpath>
-            </customize>
-        </j2seproject3:junit>
+        <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+            <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <test name="${profile.class}"/>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper from="test-sys-prop.*" to="*" type="glob"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+        </junit>
     </target>
     <!--
                 end of pre NB72 profiling section
@@ -1689,12 +1470,6 @@ is divided into following sections:
         <condition else="" property="bug5101868workaround" value="*.java">
             <matches pattern="1\.[56](\..*)?" string="${java.version}"/>
         </condition>
-        <condition else="" property="javadoc.html5.cmd.line.arg" value="-html5">
-            <and>
-                <isset property="javadoc.html5"/>
-                <available file="${jdk.home}${file.separator}lib${file.separator}jrt-fs.jar"/>
-            </and>
-        </condition>
         <javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version} [...]
             <classpath>
                 <path path="${javac.classpath}"/>
@@ -1705,6 +1480,9 @@ is divided into following sections:
             <fileset dir="${src.webapp.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
+            <fileset dir="${src.javafx.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
             <fileset dir="${src.console.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
@@ -1764,7 +1542,6 @@ is divided into following sections:
                 <exclude name="*.java"/>
             </fileset>
             <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
-            <arg line="${javadoc.html5.cmd.line.arg}"/>
         </javadoc>
         <copy todir="${dist.javadoc.dir}">
             <fileset dir="${src.local-src.dir}" excludes="${excludes}" includes="${includes}">
@@ -1773,6 +1550,9 @@ is divided into following sections:
             <fileset dir="${src.webapp.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
+            <fileset dir="${src.javafx.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
             <fileset dir="${src.console.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/doc-files/**"/>
             </fileset>
@@ -1848,65 +1628,14 @@ is divided into following sections:
         <!-- Empty placeholder for easier customization. -->
         <!-- 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.raster.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-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.raster.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-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.raster.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.gdal.dir} --add-reads ${module.name}=ALL-UNNAMED" property="javac.test.compiler [...]
-            <and>
-                <isset property="test.module.name"/>
-                <length length="0" string="${test.module.name}" when="greater"/>
-            </and>
-        </condition>
-    </target>
-    <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-run-module-properties">
-        <condition else="${module.name}" property="run.test.addexport.source.module.internal" value="${test.module.name}">
-            <and>
-                <isset property="test.module.name"/>
-                <length length="0" string="${test.module.name}" when="greater"/>
-            </and>
-        </condition>
-        <fileset dir="${build.test.classes.dir}" id="run.test.packages.internal" includes="**/*.class"/>
-        <property location="${build.test.classes.dir}" name="build.test.classes.dir.abs.internal"/>
-        <pathconvert pathsep=" " property="run.test.addexports.internal" refid="run.test.packages.internal">
-            <chainedmapper>
-                <regexpmapper from="^(.*)\Q${file.separator}\E.*\.class$$" to="\1"/>
-                <filtermapper>
-                    <uniqfilter/>
-                    <replacestring from="${build.test.classes.dir.abs.internal}" to=""/>
-                </filtermapper>
-                <cutdirsmapper dirs="1"/>
-                <packagemapper from="*" to="--add-exports ${run.test.addexport.source.module.internal}/*=ALL-UNNAMED"/>
-            </chainedmapper>
-        </pathconvert>
-        <condition else="--patch-module ${module.name}=${build.test.classes.dir} --add-modules ${module.name} --add-reads ${module.name}=ALL-UNNAMED ${run.test.addexports.internal}" property="run.test.jvmargs" value="--add-modules ${test.module.name} --add-reads ${test.module.name}=ALL-UNNAMED ${run.test.addexports.internal}">
-            <and>
-                <isset property="test.module.name"/>
-                <length length="0" string="${test.module.name}" when="greater"/>
-            </and>
-        </condition>
-    </target>
-    <target depends="-init-source-module-properties" name="-init-test-module-properties-without-module" unless="named.module.internal">
-        <property name="javac.test.sourcepath" value="${empty.dir}"/>
-        <property name="javac.test.compilerargs" value=""/>
-        <property name="run.test.jvmargs" value=""/>
-    </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.raster.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-profile.dir}:${test.gdal.dir}"/>
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.webapp.dir}:${test.javafx.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.raster.dir}:${test.referencing.dir}:${test.ref-by-id.dir}:${test.metadata.dir}:${test.utility.dir}:${test.fra-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 [...]
-            <customize>
-                <compilerarg line="${javac.test.compilerargs}"/>
-            </customize>
-        </j2seproject3:javac>
+    <target depends="init,deps-jar,compile,-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}" processorpath="${javac.test.processorpath}" srcdir="${test.webapp.dir}:${test.javafx.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.raster.dir}:${test.referencing.dir [...]
         <copy todir="${build.test.classes.dir}">
             <fileset dir="${test.webapp.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+            <fileset dir="${test.javafx.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}"/>
@@ -1935,16 +1664,13 @@ is divided into following sections:
         <!-- Empty placeholder for easier customization. -->
         <!-- You can override this target in the ../build.xml file. -->
     </target>
-    <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">
+    <target depends="init,deps-jar,compile,-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} [...]
-            <customize>
-                <compilerarg line="${javac.test.compilerargs}"/>
-            </customize>
-        </j2seproject3:javac>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.webapp.dir}:${test.javafx.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.d [...]
         <copy todir="${build.test.classes.dir}">
             <fileset dir="${test.webapp.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+            <fileset dir="${test.javafx.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}"/>
@@ -1977,7 +1703,7 @@ is divided into following sections:
     <target depends="init" if="have.tests" name="-pre-test-run">
         <mkdir dir="${build.test.results.dir}"/>
     </target>
-    <target depends="init,compile-test,-init-test-run-module-properties,-pre-test-run" if="have.tests" name="-do-test-run">
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
         <j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
     </target>
     <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
@@ -1989,14 +1715,14 @@ is divided into following sections:
     <target depends="init" if="have.tests" name="-pre-test-run-single">
         <mkdir dir="${build.test.results.dir}"/>
     </target>
-    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
         <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
         <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
     </target>
     <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
         <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
     </target>
-    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
     <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
         <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
         <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
@@ -2005,7 +1731,7 @@ is divided into following sections:
     <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
         <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
     </target>
-    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
     <!--
                 =======================
                 TEST DEBUGGING SECTION
@@ -2023,8 +1749,8 @@ is divided into following sections:
     <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
         <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
     </target>
-    <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
-    <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
     <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
         <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
     </target>
@@ -2050,9 +1776,9 @@ is divided into following sections:
     <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
         <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
         <j2seproject3:debug classname="sun.applet.AppletViewer">
-            <customizeDebuggee>
+            <customize>
                 <arg value="${applet.url}"/>
-            </customizeDebuggee>
+            </customize>
         </j2seproject3:debug>
     </target>
     <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
@@ -2079,7 +1805,6 @@ is divided into following sections:
     </target>
     <target depends="init" name="-do-clean">
         <delete dir="${build.dir}"/>
-        <delete dir="${dist.jlink.output}"/>
         <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
     </target>
     <target name="-post-clean">
diff --git a/ide-project/NetBeans/nbproject/genfiles.properties b/ide-project/NetBeans/nbproject/genfiles.properties
index 5ebcb62..67e4176 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=475f2d8e
-nbproject/build-impl.xml.script.CRC32=29b9056c
-nbproject/build-impl.xml.stylesheet.CRC32=3a2fa800@1.88.0.48
+nbproject/build-impl.xml.data.CRC32=a2f58f6b
+nbproject/build-impl.xml.script.CRC32=3e1070bc
+nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
diff --git a/ide-project/NetBeans/nbproject/project.properties b/ide-project/NetBeans/nbproject/project.properties
index e3807f0..c547dbf 100644
--- a/ide-project/NetBeans/nbproject/project.properties
+++ b/ide-project/NetBeans/nbproject/project.properties
@@ -52,6 +52,8 @@ 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.javafx.dir       = ${project.root}/application/sis-javafx/src/main/java
+test.javafx.dir      = ${project.root}/application/sis-javafx/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
diff --git a/ide-project/NetBeans/nbproject/project.xml b/ide-project/NetBeans/nbproject/project.xml
index 968bb17..434385d 100644
--- a/ide-project/NetBeans/nbproject/project.xml
+++ b/ide-project/NetBeans/nbproject/project.xml
@@ -25,6 +25,7 @@
             <source-roots>
                 <root id="src.local-src.dir" name="Local sources (unversioned)"/>
                 <root id="src.webapp.dir" name="Web application"/>
+                <root id="src.javafx.dir" name="JavaFX"/>
                 <root id="src.console.dir" name="Console"/>
                 <root id="src.portrayal.dir" name="Portrayal"/>
                 <root id="src.earth-obs.dir" name="Earth observation"/>
@@ -46,6 +47,7 @@
             </source-roots>
             <test-roots>
                 <root id="test.webapp.dir" name="Test web application"/>
+                <root id="test.javafx.dir" name="Test JavaFX"/>
                 <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"/>


Mime
View raw message