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 66e632e42062de4569185d6a0fe698df70bf2785..c51c2ade63a16aa81859b73ec7bbdaa91794c602 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>microscope-remote</artifactId>
-    <version>3.0.0</version>
+    <version>3.0.0-a.1</version>
 
     <name>Microscope Remote</name>
     <description>Move your XY Stage and Focus Device with your mouse.</description>
@@ -63,8 +63,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/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java b/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java
index d49896a9ce9440b461bf6cd6afb2702ee10fd194..8269d8466df6c432ce40a149ae9c4bcff7f8a393 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.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,18 @@
 
 package plugins.tprovoost.Microscopy.MicroscopeRemote;
 
-import icy.gui.frame.IcyFrameAdapter;
-import icy.gui.frame.IcyFrameEvent;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
+import org.bioimageanalysis.icy.gui.frame.IcyFrameAdapter;
+import org.bioimageanalysis.icy.gui.frame.IcyFrameEvent;
 import plugins.tprovoost.Microscopy.MicroManagerForIcy.MicroscopePlugin;
 import plugins.tprovoost.Microscopy.gui.RemoteFrame;
 
 /**
  * @author Irsath Nguyen
  */
+@IcyPluginName("Microscope Remote")
+@IcyPluginIcon(path = "/micro-remote.png")
 public class MicroscopeRemotePlugin extends MicroscopePlugin {
     // static instance
     static RemoteFrame instance = null;
diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java b/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java
index 2f1625876872c079ca41fee799cbec600e76bbef..b64c4fb0dafec351c6c5acb5d006839ab8ef0aa3 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.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
diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java b/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java
index 4cf2a336f9db0ff3f29a834e8a990137a24f506d..13dee07ccd8b7248e03654657f509270ff07c270 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.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,8 @@
 
 package plugins.tprovoost.Microscopy.gui;
 
-import icy.gui.frame.progress.AnnounceFrame;
-import icy.gui.frame.progress.FailedAnnounceFrame;
-import icy.type.point.Point3D;
+import org.bioimageanalysis.icy.common.geom.point.Point3D;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover;
 
 import javax.swing.*;
@@ -103,7 +102,7 @@ public class MemoryButton extends JButton implements MouseListener {
                 gotoPoint();
             }
             catch (final Exception e1) {
-                new AnnounceFrame("Error while going to the saved point.");
+                IcyLogger.error(this.getClass(), e1, "Error while going to the saved point.");
             }
         }
         else {
@@ -112,7 +111,7 @@ public class MemoryButton extends JButton implements MouseListener {
                 rememberPoint();
             }
             catch (final Exception e1) {
-                new FailedAnnounceFrame("Failed to save position, please try again", 3);
+                IcyLogger.error(this.getClass(), e1, "Failed to save position, please try again.");
             }
         }
     }
diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java
index ce128cc336cbd3bbd4a7b31a0a068a8109c142c5..796915654f4ce5a9c81646609c2e7c24382068a5 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.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,8 @@
 
 package plugins.tprovoost.Microscopy.gui;
 
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.jetbrains.annotations.NotNull;
 import plugins.tprovoost.Microscopy.MicroManager.MicroManager;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover;
 
@@ -45,7 +47,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi
     private final RemoteFrame frame;
     private final Thread moveThread;
 
-    public PanelMoverXY(final RemoteFrame frame) {
+    public PanelMoverXY(final @NotNull RemoteFrame frame) {
         super();
 
         this.frame = frame;
@@ -154,14 +156,14 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi
         StageMover.moveXYRelative(movementX, movementY, true);
     }
 
-    private double norm(final Point2D vector) {
+    private double norm(final @NotNull Point2D vector) {
         final double x = vector.getX();
         final double y = vector.getY();
         return Math.sqrt(x * x + y * y);
     }
 
     @Override
-    public void mouseDragged(final MouseEvent e) {
+    public void mouseDragged(final @NotNull MouseEvent e) {
         int x = e.getX();
         int y = e.getY();
         final int width = getWidth();
@@ -181,7 +183,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi
     }
 
     @Override
-    public void mousePressed(final MouseEvent e) {
+    public void mousePressed(final @NotNull MouseEvent e) {
         vector.setLocation(e.getX() - (getWidth() / 2d), e.getY() - (getHeight() / 2d));
         repaint();
     }
@@ -208,6 +210,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi
     public void mouseExited(final MouseEvent e) {
     }
 
+    @SuppressWarnings("BusyWait")
     @Override
     public void run() {
         while (!moveThread.isInterrupted()) {
@@ -219,7 +222,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi
                 moveThread.interrupt();
             }
             catch (final Exception e) {
-                System.err.println(e.getMessage());
+                IcyLogger.error(this.getClass(), e);
             }
         }
     }
diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java
index 6aa7088d1d0490f83076f2fb5ed68170b17db160..e082b4ba5b7bb4c193dc7d774c0c38b06512b4b5 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.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,8 @@
 
 package plugins.tprovoost.Microscopy.gui;
 
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.jetbrains.annotations.NotNull;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover;
 
 import javax.swing.*;
@@ -50,7 +52,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis
     private final Thread moveThread;
     private double offZ = 0d;
 
-    public PanelMoverZ(final RemoteFrame frame) {
+    public PanelMoverZ(final @NotNull RemoteFrame frame) {
         super();
 
         this.frame = frame;
@@ -100,7 +102,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis
     }
 
     @Override
-    public void mouseDragged(final MouseEvent e) {
+    public void mouseDragged(final @NotNull MouseEvent e) {
         final int movY = e.getY() - oldY;
         if (movY == 0)
             return;
@@ -143,7 +145,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis
     }
 
     @Override
-    public void mousePressed(final MouseEvent e) {
+    public void mousePressed(final @NotNull MouseEvent e) {
         oldY = e.getY();
         setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
         repaint();
@@ -155,6 +157,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis
         repaint();
     }
 
+    @SuppressWarnings("BusyWait")
     @Override
     public void run() {
         while (!moveThread.isInterrupted()) {
@@ -174,7 +177,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis
                     moveThread.interrupt();
                 }
                 catch (final Exception e) {
-                    System.err.println(e.getMessage());
+                    IcyLogger.error(this.getClass(), e);
                 }
             }
         }
diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java b/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java
index 0decec3250a03c4a9c07461205a02e05091b3a35..28214dde6945a96bdb9313787be6baca99a502c5 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.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,13 +18,14 @@
 
 package plugins.tprovoost.Microscopy.gui;
 
-import icy.gui.frame.IcyFrame;
-import icy.gui.util.GuiUtil;
-import icy.image.ImageUtil;
-import icy.network.NetworkUtil;
-import icy.resource.icon.IcyIcon;
-import icy.type.point.Point3D;
-import icy.util.StringUtil;
+import org.bioimageanalysis.icy.common.geom.point.Point3D;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.gui.GuiUtil;
+import org.bioimageanalysis.icy.gui.LookAndFeelUtil;
+import org.bioimageanalysis.icy.gui.frame.IcyFrame;
+import org.bioimageanalysis.icy.model.image.ImageUtil;
+import org.bioimageanalysis.icy.network.NetworkUtil;
+import org.jetbrains.annotations.NotNull;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover.StageListener;
 import plugins.tprovoost.Microscopy.MicroManagerForIcy.MicroscopePlugin;
@@ -84,7 +85,7 @@ public class RemoteFrame extends IcyFrame implements StageListener {
     private static final String REMOTE = "prefs_remote";
     private static final String SPEED = "speed";
 
-    public RemoteFrame(final MicroscopeRemotePlugin plugin) {
+    public RemoteFrame(final @NotNull MicroscopeRemotePlugin plugin) {
         super("Remote", false, true, false, true);
 
         this.plugin = plugin;
@@ -130,7 +131,6 @@ public class RemoteFrame extends IcyFrame implements StageListener {
         panel_speed.setOpaque(false);
 
         _sliderSpeed = new JSlider(1, 10, 1) {
-            private static final long serialVersionUID = 1L;
             private final BufferedImage toDraw;
             final int heightKnob;
 
@@ -188,9 +188,8 @@ public class RemoteFrame extends IcyFrame implements StageListener {
         final MemoryButton btnM3 = new MemoryButton("M3", imgMemBtnOn, imgMemBtnOff);
         final MemoryButton btnM4 = new MemoryButton("M4", imgMemBtnOn, imgMemBtnOff);
 
-        final JButton btnHelp = new JButton(new IcyIcon(imgMemBtnOff)) {
-            private static final long serialVersionUID = 1L;
-
+        final int iconSize = LookAndFeelUtil.getDefaultIconSize();
+        final JButton btnHelp = new JButton(new ImageIcon(imgMemBtnOff.getScaledInstance(iconSize, iconSize, Image.SCALE_SMOOTH))) {
             @Override
             public void paint(final Graphics g) {
                 final int w = getWidth();
@@ -245,7 +244,7 @@ public class RemoteFrame extends IcyFrame implements StageListener {
 
         final JPanel panelAll = new JPanel() {
             @Override
-            protected void paintComponent(final Graphics g) {
+            protected void paintComponent(final @NotNull Graphics g) {
                 checkInverts();
                 g.drawImage(imgRemoteBg, 0, 0, getWidth(), getHeight(), null);
             }
diff --git a/src/main/resources/micro-remote.png b/src/main/resources/micro-remote.png
new file mode 100644
index 0000000000000000000000000000000000000000..733d83a9526fa9eeda04f6a6bba56f9d76bd5a7f
Binary files /dev/null and b/src/main/resources/micro-remote.png differ