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 bd41c5749d991632768133db6ca730594474ff73..16bc3e93de0286918d087b4ef9cdefb2764b82ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,14 +8,12 @@
     <parent>
         <groupId>org.bioimageanalysis.icy</groupId>
         <artifactId>pom-icy</artifactId>
-        <version>2.2.0</version>
+        <version>3.0.0-a.1</version>
     </parent>
 
     <!-- Project Information -->
     <artifactId>ruler-helper</artifactId>
-    <version>2.0.0</version>
-
-    <packaging>jar</packaging>
+    <version>2.0.0-a.1</version>
 
     <name>Ruler Helper</name>
     <description>Widget to measure distances over images considering current image scale.</description>
@@ -57,8 +55,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>
\ No newline at end of file
diff --git a/src/main/java/plugins/fab/Ruler/Anchor2DTarget.java b/src/main/java/plugins/fab/Ruler/Anchor2DTarget.java
index 2daefb08b2ea75b1ca109c54a9eef1177cfb88d6..68479009dfe2b81af105f855e7a6f9b598d042b4 100644
--- a/src/main/java/plugins/fab/Ruler/Anchor2DTarget.java
+++ b/src/main/java/plugins/fab/Ruler/Anchor2DTarget.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,9 +18,10 @@
 
 package plugins.fab.Ruler;
 
-import icy.canvas.IcyCanvas;
-import icy.painter.Anchor2D;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.gui.canvas.IcyCanvas;
+import org.bioimageanalysis.icy.model.overlay.anchor.Anchor2D;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.jetbrains.annotations.NotNull;
 
 import java.awt.*;
 import java.awt.geom.Line2D;
@@ -29,7 +30,6 @@ import java.awt.geom.Line2D;
  * @author Fabrice de Chaumont
  */
 public class Anchor2DTarget extends Anchor2D {
-
     Line2D line1 = new Line2D.Double();
     Line2D line2 = new Line2D.Double();
 
@@ -39,7 +39,6 @@ public class Anchor2DTarget extends Anchor2D {
 
     @Override
     public void paint(final Graphics2D g, final Sequence sequence, final IcyCanvas canvas) {
-
         if (!visible)
             return;
 
@@ -67,17 +66,14 @@ public class Anchor2DTarget extends Anchor2D {
         }
         g.draw(line1);
         g.draw(line2);
-
     }
 
-    void updateGeometry(final IcyCanvas canvas) {
+    void updateGeometry(final @NotNull IcyCanvas canvas) {
         final double adjRayX = canvas.canvasToImageLogDeltaX(ray);
         final double adjRayY = canvas.canvasToImageLogDeltaY(ray);
 
         line1.setLine(position.x - adjRayX, position.y, position.x + adjRayX, position.y);
 
         line2.setLine(position.x, position.y - adjRayY, position.x, position.y + adjRayY);
-
     }
-
 }
diff --git a/src/main/java/plugins/fab/Ruler/Ruler.java b/src/main/java/plugins/fab/Ruler/Ruler.java
index 88ac6c706560982c8d3f3bfa17f76d9f44faa6b3..d452f3af259fbac35458bb97d0b3d37223b13231 100644
--- a/src/main/java/plugins/fab/Ruler/Ruler.java
+++ b/src/main/java/plugins/fab/Ruler/Ruler.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,20 @@
 
 package plugins.fab.Ruler;
 
-import icy.gui.dialog.MessageDialog;
-import icy.plugin.abstract_.PluginActionable;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.PluginActionable;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.bioimageanalysis.icy.gui.dialog.MessageDialog;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 
 /**
  * @author Fabrice de Chaumont
  */
+@IcyPluginName("Ruler Helper")
+@IcyPluginIcon(path = "/ruler-helper.png")
 public class Ruler extends PluginActionable {
-
     @Override
     public void run() {
-
         final Sequence sequence = getActiveSequence();
 
         if (sequence != null) {
@@ -38,7 +40,5 @@ public class Ruler extends PluginActionable {
         else {
             MessageDialog.showDialog("Please open an image first.", MessageDialog.INFORMATION_MESSAGE);
         }
-
     }
-
 }
diff --git a/src/main/java/plugins/fab/Ruler/RulerPainter.java b/src/main/java/plugins/fab/Ruler/RulerPainter.java
index e6147f1287bc3a799b375da498ec55937b1ad857..cefa198592a3e9ffd7f0e655f13c8e46035e8311 100644
--- a/src/main/java/plugins/fab/Ruler/RulerPainter.java
+++ b/src/main/java/plugins/fab/Ruler/RulerPainter.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,17 +18,17 @@
 
 package plugins.fab.Ruler;
 
-import icy.canvas.Canvas2D;
-import icy.canvas.IcyCanvas;
-import icy.main.Icy;
-import icy.math.UnitUtil;
-import icy.math.UnitUtil.UnitPrefix;
-import icy.painter.Overlay;
-import icy.painter.OverlayEvent;
-import icy.painter.OverlayListener;
-import icy.sequence.Sequence;
-import icy.type.point.Point5D;
-import icy.util.GraphicsUtil;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.common.geom.point.Point5D;
+import org.bioimageanalysis.icy.common.math.UnitUtil;
+import org.bioimageanalysis.icy.gui.GraphicsUtil;
+import org.bioimageanalysis.icy.gui.canvas.Canvas2D;
+import org.bioimageanalysis.icy.gui.canvas.IcyCanvas;
+import org.bioimageanalysis.icy.model.overlay.Overlay;
+import org.bioimageanalysis.icy.model.overlay.OverlayEvent;
+import org.bioimageanalysis.icy.model.overlay.OverlayListener;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.jetbrains.annotations.NotNull;
 
 import java.awt.*;
 import java.awt.event.KeyEvent;
@@ -42,7 +42,6 @@ import java.util.ArrayList;
  * @author Fabrice de Chaumont
  */
 public class RulerPainter extends Overlay implements OverlayListener {
-
     private Anchor2DTarget a1;
     private Anchor2DTarget a2;
 
@@ -52,7 +51,6 @@ public class RulerPainter extends Overlay implements OverlayListener {
 
     // Listener of Anchor
 
-
     @Override
     public void overlayChanged(final OverlayEvent overlayEvent) {
         for (final Sequence sequence : Icy.getMainInterface().getSequencesContaining(this)) {
@@ -171,7 +169,7 @@ public class RulerPainter extends Overlay implements OverlayListener {
         final Font font = new Font("Arial", Font.PLAIN, fontSize);
         final String pixelString;
         final double realDistance = Math.sqrt((Math.pow(vx * distance * sequence.getPixelSizeX(), 2) + Math.pow(vy * distance * sequence.getPixelSizeY(), 2)));
-        pixelString = " " + (int) distance + " px" + " / " + UnitUtil.getBestUnitInMeters(realDistance, 2, UnitPrefix.MICRO);
+        pixelString = " " + (int) distance + " px" + " / " + UnitUtil.getBestUnitInMeters(realDistance, 2, UnitUtil.UnitPrefix.MICRO);
         final Rectangle2D pixelBounds = GraphicsUtil.getStringBounds(g, font, pixelString);
         g.translate(distance / 2 - pixelBounds.getWidth() / 2, -convertScale(canvas, 20));
         g.setFont(font);
@@ -190,7 +188,7 @@ public class RulerPainter extends Overlay implements OverlayListener {
         a2.paint(g, sequence, canvas);
     }
 
-    double convertScale(final IcyCanvas canvas, final int value) {
+    double convertScale(final @NotNull IcyCanvas canvas, final int value) {
         return canvas.canvasToImageLogDeltaX(value);
     }
 
diff --git a/src/main/java/plugins/fab/Ruler/ShapeDefinition.java b/src/main/java/plugins/fab/Ruler/ShapeDefinition.java
index 60d12c02e241f74dff30224c3a0f7631cba90d28..cac36cf3e0f1c87879ea9bde8206df6efba78103 100644
--- a/src/main/java/plugins/fab/Ruler/ShapeDefinition.java
+++ b/src/main/java/plugins/fab/Ruler/ShapeDefinition.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,25 +18,27 @@
 
 package plugins.fab.Ruler;
 
+import org.jetbrains.annotations.Contract;
+
 import java.awt.*;
 
 /**
  * @author Fabrice de Chaumont
  */
 public class ShapeDefinition {
-
     public int stroke;
     public Shape shape;
     public float alpha = 1;
 
+    @Contract(pure = true)
     public ShapeDefinition(final int stroke, final Shape shape) {
         this.stroke = stroke;
         this.shape = shape;
     }
 
+    @Contract(pure = true)
     public ShapeDefinition(final int stroke, final Shape shape, final float alpha) {
         this(stroke, shape);
         this.alpha = alpha;
     }
-
 }
diff --git a/src/main/resources/ruler-helper.png b/src/main/resources/ruler-helper.png
new file mode 100644
index 0000000000000000000000000000000000000000..4575143f9b4c365fa6b33670aa1d4ef08c303a46
Binary files /dev/null and b/src/main/resources/ruler-helper.png differ