diff --git a/.gitignore b/.gitignore
index 5fe16ebb8b4e949b1d5f2b3189fcef93a07f070c..57f16fb67c1b1589981416b323d7a9debc728665 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,41 @@
-/ROIToDistanceMap/bin/
-*.jar
+/build*
+/workspace
+setting.xml
+release/
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+icy.log
+
+### IntelliJ IDEA ###
 .idea/
+*.iws
 *.iml
-.settings/
-.project
+*.ipr
+
+### Eclipse ###
+.apt_generated
 .classpath
-target/
+.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 fb3ae4ddc30b36b199d0244852143d54046ea86d..5cea3293f698f951a26cb46f3c41d42936205dbc 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>roi-to-distance-map</artifactId>
-    <version>4.0.0</version>
+    <version>4.0.0-a.1</version>
 
     <name>ROI to Distance Map</name>
     <description>Convert ROI to a Distance Map</description>
@@ -62,23 +62,19 @@
     <dependencies>
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
-            <artifactId>protocols</artifactId>
+            <artifactId>ezplug</artifactId>
         </dependency>
-
-        <!-- The EzPlug library, simplifies writing UI for Icy plugins. -->
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
-            <artifactId>ezplug</artifactId>
+            <artifactId>protocols</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
-            <artifactId>3d-mesh-roi</artifactId>
+            <artifactId>kernel-extensions</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
-            <artifactId>icy-bioformats</artifactId>
+            <artifactId>3d-mesh-roi</artifactId>
         </dependency>
     </dependencies>
 
@@ -86,8 +82,7 @@
     <repositories>
         <repository>
             <id>icy</id>
-            <name>Icy's Nexus</name>
-            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+            <url>https://nexus.pasteur.cloud/repository/icy/</url>
         </repository>
     </repositories>
 </project>
diff --git a/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java b/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java
index 0ca266af963fc9764efc93265410bffa8bbc58cb..4087f44f964b6da3d0ac2b9e9275368c5eb830dc 100644
--- a/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java
+++ b/src/main/java/plugins/adufour/distancetransforms/Chamfer3.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,6 +18,10 @@
 
 package plugins.adufour.distancetransforms;
 
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.jetbrains.annotations.NotNull;
+
 /**
  * Pseudo-Euclidean distance transform based on a two-pass sweeping algorithm using a 3x3 (in 2D) or
  * 3x3x3 (in 3D) chamfer mask. <br>
@@ -35,9 +39,11 @@ package plugins.adufour.distancetransforms;
  *
  * @author Alexandre Dufour
  */
+@IcyPluginName("Chamfer 3")
+@IcyPluginIcon(path = "/distance-transforms.png")
 public class Chamfer3 extends ChamferDistanceTransform {
     @Override
-    public void updateUnsignedChamferDistance2D(final float[] map, final int width, final float planarLateralDistance) {
+    public void updateUnsignedChamferDistance2D(final float @NotNull [] map, final int width, final float planarLateralDistance) {
         final double xy2 = planarLateralDistance * planarLateralDistance;
         final float planarDiagonalDistance = (float) Math.sqrt(xy2 + xy2);
 
@@ -95,7 +101,7 @@ public class Chamfer3 extends ChamferDistanceTransform {
     }
 
     @Override
-    public void updateUnsignedChamferDistance3D(final float[][] map, final int width, final float planoLateralDistance, final float axioLateralDistance) {
+    public void updateUnsignedChamferDistance3D(final float @NotNull [] @NotNull [] map, final int width, final float planoLateralDistance, final float axioLateralDistance) {
         final double xy2 = planoLateralDistance * planoLateralDistance;
         final double xz2 = axioLateralDistance * axioLateralDistance;
         final float planoDiagonalDistance = (float) Math.sqrt(xy2 + xy2);
diff --git a/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java b/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java
index 7682d7403d7be3ecf41b47ec3596703b7765a443..0696d08953e6d7fe823b4239106451a6f556585a 100644
--- a/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java
+++ b/src/main/java/plugins/adufour/distancetransforms/Chamfer5.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,6 +18,10 @@
 
 package plugins.adufour.distancetransforms;
 
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.jetbrains.annotations.NotNull;
+
 /**
  * Pseudo-Euclidean distance transform based on a two-pass sweeping algorithm using a 5x5 (in 2D) or
  * 5x5x5 (in 3D) chamfer mask. <br>
@@ -40,9 +44,11 @@ package plugins.adufour.distancetransforms;
  *
  * @author Alexandre Dufour
  */
+@IcyPluginName("Chamfer 5")
+@IcyPluginIcon(path = "/distance-transforms.png")
 public class Chamfer5 extends ChamferDistanceTransform {
     @Override
-    public void updateUnsignedChamferDistance2D(final float[] map, final int width, final float lateralDistance) {
+    public void updateUnsignedChamferDistance2D(final float @NotNull [] map, final int width, final float lateralDistance) {
         // pre-calculate distances
         final float a = lateralDistance;
         final float b = (float) Math.sqrt(a * a + a * a);
@@ -121,8 +127,9 @@ public class Chamfer5 extends ChamferDistanceTransform {
             }
     }
 
+    // TODO: Make this method more simple
     @Override
-    public void updateUnsignedChamferDistance3D(final float[][] map, final int width, final float planarLateralDistance, final float axialLateralDistance) {
+    public void updateUnsignedChamferDistance3D(final float @NotNull [] @NotNull [] map, final int width, final float planarLateralDistance, final float axialLateralDistance) {
         // 2D distances
         final float xySq = planarLateralDistance * planarLateralDistance;
         final float b = (float) Math.sqrt(xySq + xySq);
diff --git a/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java b/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java
index 1ee632d68092046ab2ccccd3c0a54a1396a19fa6..bbe2ed78f43148538c680887e07d9b2ef187b08c 100644
--- a/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java
+++ b/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.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,21 +18,18 @@
 
 package plugins.adufour.distancetransforms;
 
-import icy.common.Version;
-import icy.image.IcyBufferedImage;
-import icy.main.Icy;
-import icy.roi.ROI;
-import icy.roi.ROI2D;
-import icy.roi.ROI3D;
-import icy.sequence.Sequence;
-import icy.sequence.SequenceDataIterator;
-import icy.type.DataIteratorUtil;
-import icy.type.DataType;
-import icy.type.collection.array.Array1DUtil;
-import icy.util.OMEUtil;
+import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea;
+import org.bioimageanalysis.icy.common.collection.array.Array1DUtil;
+import org.bioimageanalysis.icy.common.type.DataIteratorUtil;
+import org.bioimageanalysis.icy.common.type.DataType;
+import org.bioimageanalysis.icy.model.OMEUtil;
+import org.bioimageanalysis.icy.model.image.IcyBufferedImage;
+import org.bioimageanalysis.icy.model.roi.ROI;
+import org.bioimageanalysis.icy.model.roi.ROI3D;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.bioimageanalysis.icy.model.sequence.SequenceDataIterator;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.roi.mesh.ROI3DMesh;
-import plugins.kernel.roi.roi3d.ROI3DArea;
-import plugins.kernel.roi.roi3d.ROI3DStack;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -41,12 +38,12 @@ import java.util.concurrent.Future;
 
 public abstract class ChamferDistanceTransform extends DistanceTransform {
     @Override
-    public Sequence createDistanceMap(final Sequence input, final int channel, final double threshold, final boolean invertMap, final boolean useRealUnits) {
+    public Sequence createDistanceMap(final @NotNull Sequence input, final int channel, final double threshold, final boolean invertMap, final boolean useRealUnits) {
         final int width = input.getSizeX();
         final int height = input.getSizeY();
         final int depth = input.getSizeZ();
         final int time = input.getSizeT();
-        final DataType type = input.getDataType_();
+        final DataType type = input.getDataType();
 
         final int maxDistance = width * height * depth;
 
@@ -92,7 +89,7 @@ public abstract class ChamferDistanceTransform extends DistanceTransform {
      * @return sequence
      */
     @Override
-    public Sequence createDistanceMap(final Sequence sequence, final boolean mapOnlySelectedROI, final boolean invertMap, final boolean useRealUnits) throws InterruptedException {
+    public Sequence createDistanceMap(final @NotNull Sequence sequence, final boolean mapOnlySelectedROI, final boolean invertMap, final boolean useRealUnits) throws InterruptedException {
         final List<ROI> rois = mapOnlySelectedROI ? sequence.getSelectedROIs() : sequence.getROIs();
 
         String title = "Distance map ";
@@ -121,17 +118,17 @@ public abstract class ChamferDistanceTransform extends DistanceTransform {
 
         // Fill the ROI with the default distance
         // Warning: Icy <= 1.8.6 have an issue with the data iterator
-        final Version patch = new Version(1, 8, 6);
+        //final Version patch = new Version(1, 8, 6);
 
         for (final ROI r : rois) {
-            if (Icy.version.isLowerOrEqual(patch) && r instanceof ROI3DStack) {
-                final ROI3DStack<?> stack = (ROI3DStack<?>) r;
+            /*if (Icy.VERSION.isLowerOrEqual(patch) && r instanceof final ROI3DStack<?> stack) {
                 for (final ROI2D slice : stack) {
                     final SequenceDataIterator iterator = new SequenceDataIterator(output, slice, true);
                     DataIteratorUtil.set(iterator, maxDistance);
                 }
             }
-            else if (r instanceof ROI3DMesh) {
+            else*/
+            if (r instanceof ROI3DMesh) {
                 final ROI3D rea = new ROI3DArea(((ROI3D) r).getBooleanMask(true));
                 rea.setC(((ROI3D) r).getC());
                 rea.setT(((ROI3D) r).getT());
@@ -150,7 +147,7 @@ public abstract class ChamferDistanceTransform extends DistanceTransform {
         return output;
     }
 
-    private void updateUnsignedChamferDistance(final Sequence output, final boolean useRealUnits) {
+    private void updateUnsignedChamferDistance(final @NotNull Sequence output, final boolean useRealUnits) {
         final int width = output.getSizeX();
         final int length = output.getSizeT();
 
diff --git a/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java b/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java
index 8a7868db9a884a270fdae97760d843ae4eb5caef..1cb708004be60b545a8ca4b26a18e05159e1af3b 100644
--- a/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java
+++ b/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.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,14 +18,13 @@
 
 package plugins.adufour.distancetransforms;
 
-import icy.plugin.abstract_.Plugin;
-import icy.plugin.interface_.PluginLibrary;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-public abstract class DistanceTransform extends Plugin implements PluginLibrary {
+public abstract class DistanceTransform extends Plugin {
     protected static ExecutorService multiThreadService = Executors.newCachedThreadPool();
 
     /**
diff --git a/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java b/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java
index 358fe29febf1400c38c376fd096ff0262471b77b..172cf7b2929e04750cd30f78fcdd6fcb3da3b7de 100644
--- a/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java
+++ b/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java
@@ -18,7 +18,10 @@
 
 package plugins.adufour.distancetransforms;
 
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.ezplug.EzPlug;
@@ -27,6 +30,8 @@ import plugins.adufour.ezplug.EzVarPlugin;
 import plugins.adufour.ezplug.EzVarSequence;
 import plugins.adufour.vars.lang.VarSequence;
 
+@IcyPluginName("ROI to Distance Map")
+@IcyPluginIcon(path = "/distance-transforms.png")
 public class ROIToDistanceMap extends EzPlug implements Block {
     EzVarSequence sequence = new EzVarSequence("Sequence");
 
@@ -41,7 +46,7 @@ public class ROIToDistanceMap extends EzPlug implements Block {
     VarSequence map = new VarSequence("Distance map", null);
 
     @Override
-    public void declareInput(final VarList inputMap) {
+    public void declareInput(final @NotNull VarList inputMap) {
         inputMap.add("Use ROI from", sequence.getVariable());
         inputMap.add("Algorithm", transform.getVariable());
         inputMap.add("Invert map", invert.getVariable());
@@ -49,7 +54,7 @@ public class ROIToDistanceMap extends EzPlug implements Block {
     }
 
     @Override
-    public void declareOutput(final VarList outputMap) {
+    public void declareOutput(final @NotNull VarList outputMap) {
         outputMap.add("Distance map", map);
     }
 
@@ -64,6 +69,7 @@ public class ROIToDistanceMap extends EzPlug implements Block {
         setTimeDisplay(true);
     }
 
+    @SuppressWarnings("resource")
     @Override
     protected void execute() {
         try {
diff --git a/src/main/resources/distance-transforms.png b/src/main/resources/distance-transforms.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a94830619320fe2524441b7180769d3196dc1c8
Binary files /dev/null and b/src/main/resources/distance-transforms.png differ