diff --git a/.gitignore b/.gitignore
index 8d47cace3a5bd898da9fb12bed716d60838191a4..57f16fb67c1b1589981416b323d7a9debc728665 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,41 @@
-.idea/
+/build*
+/workspace
+setting.xml
+release/
 target/
-.settings/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+icy.log
+
+### IntelliJ IDEA ###
+.idea/
+*.iws
 *.iml
-.project
+*.ipr
+
+### Eclipse ###
+.apt_generated
 .classpath
-**/.DS_Store
\ No newline at end of file
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+**/.DS_Store
+Icon?
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 35269f78fb521c0989c2fe05f3523e10a0ed6605..b84e39d32bf3877f926ab684666840eeccbd7bce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,12 +8,12 @@
     <parent>
         <artifactId>pom-icy</artifactId>
         <groupId>org.bioimageanalysis.icy</groupId>
-        <version>2.2.0</version>
+        <version>3.0.0-a.1</version>
     </parent>
 
     <!-- Project Information -->
     <artifactId>track-processor-excel-export</artifactId>
-    <version>2.0.0</version>
+    <version>2.0.0-a.1</version>
 
     <name>Track Processor Export Track to Excel</name>
     <description>This processor exports the tracks in an xls file (compatible with Protocols)</description>
@@ -53,16 +53,18 @@
 
     <!-- List of project's dependencies -->
     <dependencies>
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>ezplug</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
             <artifactId>protocols</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>net.sourceforge.jexcelapi</groupId>
-            <artifactId>jxl</artifactId>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>spot-detection-utilities</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
             <artifactId>track-manager</artifactId>
@@ -73,8 +75,7 @@
     <repositories>
         <repository>
             <id>icy</id>
-            <name>Icy's Nexus</name>
-            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+            <url>https://nexus-icy.pasteur.cloud/repository/icy/</url>
         </repository>
     </repositories>
 </project>
diff --git a/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java b/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java
index 2d9ddf8b320ad8b89a3f2f1f45704a1db1827093..4290328ed0576f76fdba11a66a1a890a995fa170 100644
--- a/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java
+++ b/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2023. Institut Pasteur.
+ * Copyright (c) 2010-2024. Institut Pasteur.
  *
  * This file is part of Icy.
  * Icy is free software: you can redistribute it and/or modify
@@ -18,18 +18,17 @@
 
 package plugins.fab.trackmanager.processors;
 
-import icy.gui.dialog.MessageDialog;
-import icy.gui.util.GuiUtil;
-import icy.main.Icy;
-import icy.system.IcyExceptionHandler;
-import icy.util.XLSUtil;
-import jxl.write.WritableSheet;
-import jxl.write.WritableWorkbook;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.bioimageanalysis.icy.gui.GuiUtil;
+import org.bioimageanalysis.icy.io.xls.XLSXUtil;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.fab.trackmanager.PluginTrackManagerProcessor;
 import plugins.fab.trackmanager.TrackSegment;
 import plugins.nchenouard.spot.Detection;
 
 import javax.swing.*;
+import javax.swing.filechooser.FileNameExtensionFilter;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.File;
@@ -68,7 +67,9 @@ public class TrackProcessorExportTrackToXLS extends PluginTrackManagerProcessor
 
     private static void exportToXLS(final List<TrackSegment> tracks) {
         final JFileChooser chooser = new JFileChooser();
-        chooser.setDialogTitle("Select xls file.");
+        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+        chooser.setFileFilter(new FileNameExtensionFilter("Excel files", "xlsx"));
+        chooser.setDialogTitle("Select xlsx file.");
 
         final int returnVal = chooser.showOpenDialog(null);
         if (returnVal != JFileChooser.APPROVE_OPTION)
@@ -79,45 +80,42 @@ public class TrackProcessorExportTrackToXLS extends PluginTrackManagerProcessor
 
     public static boolean exportToXLS(final List<TrackSegment> trackSegmentList, final File file) {
         try {
-            final WritableWorkbook doc = XLSUtil.loadWorkbookForWrite(file);
-            final WritableSheet sh = XLSUtil.createNewPage(doc, "Tracks");
+            final Workbook doc = XLSXUtil.loadWorkbookForWrite(file);
+            final Sheet sh = XLSXUtil.createNewPage(doc, "Tracks");
             int cursorY = 0;
 
             for (final TrackSegment ts : trackSegmentList) {
                 cursorY++;
-                XLSUtil.setCellString(sh, 0, cursorY, "track #");
-                XLSUtil.setCellNumber(sh, 1, cursorY, trackSegmentList.indexOf(ts));
+                XLSXUtil.setCellString(sh, 0, cursorY, "track #");
+                XLSXUtil.setCellNumber(sh, 1, cursorY, trackSegmentList.indexOf(ts));
                 cursorY++;
 
-                XLSUtil.setCellString(sh, 2, cursorY, "t");
-                XLSUtil.setCellString(sh, 3, cursorY, "x");
-                XLSUtil.setCellString(sh, 4, cursorY, "y");
-                XLSUtil.setCellString(sh, 5, cursorY, "z");
-                XLSUtil.setCellString(sh, 6, cursorY, "virtual");
+                XLSXUtil.setCellString(sh, 2, cursorY, "t");
+                XLSXUtil.setCellString(sh, 3, cursorY, "x");
+                XLSXUtil.setCellString(sh, 4, cursorY, "y");
+                XLSXUtil.setCellString(sh, 5, cursorY, "z");
+                XLSXUtil.setCellString(sh, 6, cursorY, "virtual");
                 cursorY++;
 
                 final ArrayList<Detection> detectionList = ts.getDetectionList();
 
                 for (final Detection d : detectionList) {
                     if (d.isEnabled()) {
-                        XLSUtil.setCellNumber(sh, 2, cursorY, d.getT());
-                        XLSUtil.setCellNumber(sh, 3, cursorY, d.getX());
-                        XLSUtil.setCellNumber(sh, 4, cursorY, d.getY());
-                        XLSUtil.setCellNumber(sh, 5, cursorY, d.getZ());
-                        XLSUtil.setCellNumber(sh, 6, cursorY, (d.getDetectionType() == Detection.DETECTIONTYPE_VIRTUAL_DETECTION) ? 1 : 0);
+                        XLSXUtil.setCellNumber(sh, 2, cursorY, d.getT());
+                        XLSXUtil.setCellNumber(sh, 3, cursorY, d.getX());
+                        XLSXUtil.setCellNumber(sh, 4, cursorY, d.getY());
+                        XLSXUtil.setCellNumber(sh, 5, cursorY, d.getZ());
+                        XLSXUtil.setCellNumber(sh, 6, cursorY, (d.getDetectionType() == Detection.DETECTIONTYPE_VIRTUAL_DETECTION) ? 1 : 0);
 
                         cursorY++;
                     }
                 }
             }
 
-            XLSUtil.saveAndClose(doc);
+            XLSXUtil.saveAndClose(doc, file);
         }
         catch (final Exception e) {
-            if (Icy.getMainInterface().isHeadLess())
-                IcyExceptionHandler.showErrorMessage(e, true);
-            else
-                MessageDialog.showDialog("Cannot open file.", MessageDialog.ERROR_MESSAGE);
+            IcyLogger.error(TrackProcessorExportTrackToXLS.class, e);
 
             return false;
         }
diff --git a/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java b/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java
index 055ac95af5faa95eb4cd1ea2b0956ae1a91deaf2..cfd6a058ad5917e64f13a03934d09028d83a813e 100644
--- a/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java
+++ b/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2023. Institut Pasteur.
+ * Copyright (c) 2010-2024. Institut Pasteur.
  *
  * This file is part of Icy.
  * Icy is free software: you can redistribute it and/or modify
@@ -18,8 +18,10 @@
 
 package plugins.fab.trackmanager.processors;
 
-import icy.plugin.abstract_.Plugin;
-import icy.plugin.interface_.PluginBundled;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.Var;
@@ -31,9 +33,11 @@ import java.io.File;
 /**
  * Block (Protocols) to export Tracks (TrackGroup) in XLS format.
  *
- * @author Stephane
+ * @author Stephane Dallongeville
  */
-public class TrackXLSExport extends Plugin implements Block, PluginBundled {
+@IcyPluginName("Track XLSX Export")
+@IcyPluginIcon(path = "/track-processor-xls-export.png")
+public class TrackXLSExport extends Plugin implements Block {
     public final VarMutable file;
     public final Var<TrackGroup> tracks;
 
@@ -50,7 +54,7 @@ public class TrackXLSExport extends Plugin implements Block, PluginBundled {
     }
 
     @Override
-    public void declareInput(final VarList inputMap) {
+    public void declareInput(final @NotNull VarList inputMap) {
         inputMap.add("tracks", tracks);
         inputMap.add("file", file);
     }
@@ -76,9 +80,4 @@ public class TrackXLSExport extends Plugin implements Block, PluginBundled {
             TrackProcessorExportTrackToXLS.exportToXLS(tg.getTrackSegmentList(), f);
         }
     }
-
-    @Override
-    public String getMainPluginClassName() {
-        return TrackProcessorExportTrackToXLS.class.getName();
-    }
 }
diff --git a/src/main/resources/track-processor-xls-export.png b/src/main/resources/track-processor-xls-export.png
new file mode 100644
index 0000000000000000000000000000000000000000..413f16fe3ba1af24be12131dda2d4911a945c760
Binary files /dev/null and b/src/main/resources/track-processor-xls-export.png differ