diff --git a/.gitignore b/.gitignore
index b2f15ce895696fd311b35bd9ebb831c094d75ac0..57f16fb67c1b1589981416b323d7a9debc728665 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,41 @@
-.idea/
-.settings/
-build/
+/build*
+/workspace
+setting.xml
+release/
 target/
-bin/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+icy.log
+
+### IntelliJ IDEA ###
+.idea/
+*.iws
 *.iml
-*.jar
+*.ipr
+
+### Eclipse ###
+.apt_generated
 .classpath
+.factorypath
 .project
-export.jardesc
-**/.DS_Store
\ No newline at end of file
+.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 3c8ae15a3d8fd31a78ccd09ee0ab247463756965..6f8278b2a8af96065eb39a9c6a539e93e4785086 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,13 +7,11 @@
     <parent>
         <groupId>org.bioimageanalysis.icy</groupId>
         <artifactId>pom-icy</artifactId>
-        <version>2.2.0</version>
+        <version>3.0.0-a.1</version>
     </parent>
 
     <artifactId>convexify</artifactId>
-    <version>3.0.0</version>
-
-    <packaging>jar</packaging>
+    <version>3.0.0-a.1</version>
 
     <name>Convexify</name>
     <description>
@@ -21,6 +19,14 @@
     </description>
 
     <dependencies>
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>kernel-extensions</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>ezplug</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
             <artifactId>protocols</artifactId>
@@ -33,12 +39,16 @@
             <groupId>org.bioimageanalysis.icy</groupId>
             <artifactId>3d-mesh-roi</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>vecmath</artifactId>
+        </dependency>
     </dependencies>
 
     <repositories>
         <repository>
             <id>icy</id>
-            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+            <url>https://nexus-icy.pasteur.cloud/repository/icy/</url>
         </repository>
     </repositories>
 </project>
\ No newline at end of file
diff --git a/src/main/java/plugins/adufour/roi/Convexify.java b/src/main/java/plugins/adufour/roi/Convexify.java
index ef15db7f09951d41c34c7c66e99a226d02d04bc9..aa48917f28b4c7d001bad52c8edc3e5012e0c3ce 100644
--- a/src/main/java/plugins/adufour/roi/Convexify.java
+++ b/src/main/java/plugins/adufour/roi/Convexify.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,12 +18,19 @@
 
 package plugins.adufour.roi;
 
-import icy.roi.ROI;
-import icy.roi.ROI2D;
-import icy.roi.ROI3D;
-import icy.roi.ROIUtil;
-import icy.sequence.Sequence;
-import icy.type.point.Point3D;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DArea;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DPolygon;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DShape;
+import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea;
+import org.bioimageanalysis.icy.common.geom.point.Point3D;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.bioimageanalysis.icy.model.roi.ROI;
+import org.bioimageanalysis.icy.model.roi.ROI2D;
+import org.bioimageanalysis.icy.model.roi.ROI3D;
+import org.bioimageanalysis.icy.model.roi.ROIUtil;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.tools.roi.ROIBlock;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.ezplug.EzPlug;
@@ -33,23 +40,18 @@ import plugins.adufour.quickhull.QuickHull2D;
 import plugins.adufour.quickhull.QuickHull3D;
 import plugins.adufour.roi.mesh.polygon.ROI3DPolygonalMesh;
 import plugins.adufour.vars.lang.VarROIArray;
-import plugins.kernel.roi.roi2d.ROI2DArea;
-import plugins.kernel.roi.roi2d.ROI2DPolygon;
-import plugins.kernel.roi.roi2d.ROI2DShape;
-import plugins.kernel.roi.roi3d.ROI3DArea;
 
 import javax.vecmath.Point3d;
 import java.awt.geom.Point2D;
 import java.util.Arrays;
 import java.util.List;
 
+@IcyPluginName("Convexify")
+@IcyPluginIcon(path = "/convexify.png")
 public class Convexify extends EzPlug implements ROIBlock {
     private final EzVarSequence input = new EzVarSequence("Input sequence");
-
     private final EzVarBoolean replace = new EzVarBoolean("Replace existing ROI", false);
-
     private final VarROIArray roiIN = new VarROIArray("List of ROI");
-
     private final VarROIArray roiOUT = new VarROIArray("List of ROI");
 
     @Override
@@ -96,11 +98,11 @@ public class Convexify extends EzPlug implements ROIBlock {
      * future.
      * @throws IllegalArgumentException if the specified ROI is not supported
      */
-    public static ROI createConvexROI(final ROI roi) throws IllegalArgumentException {
+    public static @NotNull ROI createConvexROI(final ROI roi) throws IllegalArgumentException {
         ROI output = null;
 
         try {
-            if (roi instanceof ROI2D) {
+            if (roi instanceof final ROI2D roi2d) {
                 final List<Point2D> envelope;
 
                 if (roi instanceof ROI2DShape) {
@@ -118,12 +120,11 @@ public class Convexify extends EzPlug implements ROIBlock {
                 output = new ROI2DPolygon(envelope);
 
                 // copy position info
-                final ROI2D roi2d = (ROI2D) roi;
                 ((ROI2D) output).setT(roi2d.getT());
                 ((ROI2D) output).setZ(roi2d.getZ());
                 ((ROI2D) output).setC(roi2d.getC());
             }
-            else if (roi instanceof ROI3D) {
+            else if (roi instanceof final ROI3D roi3d) {
                 final Point3D[] points = ((ROI3D) roi).getBooleanMask(true).getContourPoints();
 
                 // convert to vecmath's Point3d
@@ -140,7 +141,6 @@ public class Convexify extends EzPlug implements ROIBlock {
                 output = new ROI3DPolygonalMesh(qhull);
 
                 // copy position info
-                final ROI3D roi3d = (ROI3D) roi;
                 ((ROI3D) output).setT(roi3d.getT());
                 ((ROI3D) output).setC(roi3d.getC());
             }
@@ -162,12 +162,12 @@ public class Convexify extends EzPlug implements ROIBlock {
     }
 
     @Override
-    public void declareInput(final VarList inputMap) {
+    public void declareInput(final @NotNull VarList inputMap) {
         inputMap.add("Regions of interest", roiIN);
     }
 
     @Override
-    public void declareOutput(final VarList outputMap) {
+    public void declareOutput(final @NotNull VarList outputMap) {
         outputMap.add("Regions of interest", roiOUT);
     }
 }
diff --git a/src/main/resources/convexify.png b/src/main/resources/convexify.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b534343c248ab246770930bde041725bc46e0ce
Binary files /dev/null and b/src/main/resources/convexify.png differ