diff --git a/.gitignore b/.gitignore
index 1a26a7589e5250a64526897d7b52a94455384951..9d5e2adf2559faf63c3ad3f92c26e7d181ddb5f1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,36 @@
-*.jar
-.idea/
-.settings/
-bin/
-build/
 target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/
+*.iws
 *.iml
-*.eml
+*.ipr
+
+### Eclipse ###
+.apt_generated
 .classpath
+.factorypath
 .project
-export.jardesc
+.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 a1bb3d30e845f7d550677877165c026470c63842..75212a4af4d807b4adf90d8378ba9418c3a4aeff 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>protocols</artifactId>
-    <version>4.0.0</version>
-
-    <packaging>jar</packaging>
+    <version>4.0.0-a.1</version>
 
     <name>Protocols</name>
     <description>
@@ -21,6 +19,10 @@
     </description>
 
     <dependencies>
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>kernel-extensions</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.bioimageanalysis.icy</groupId>
             <artifactId>ezplug</artifactId>
@@ -35,7 +37,7 @@
     <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/blocks/lang/Batch.java b/src/main/java/plugins/adufour/blocks/lang/Batch.java
index b0b88c01e059e6e809cb30d5bafa8a25468008ad..b0e01a2f28921610b9af9d6323b54586f6de6d9f 100644
--- a/src/main/java/plugins/adufour/blocks/lang/Batch.java
+++ b/src/main/java/plugins/adufour/blocks/lang/Batch.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/adufour/blocks/lang/Block.java b/src/main/java/plugins/adufour/blocks/lang/Block.java
index 933bc5865d546ee72399a40bb70e9976c4a0cd6a..7a2b6b517b1f3bd4dac0d901929a1dd34921d313 100644
--- a/src/main/java/plugins/adufour/blocks/lang/Block.java
+++ b/src/main/java/plugins/adufour/blocks/lang/Block.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,7 @@
 
 package plugins.adufour.blocks.lang;
 
+import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
 import plugins.adufour.blocks.util.VarList;
 
 /**
diff --git a/src/main/java/plugins/adufour/blocks/lang/BlockDescriptor.java b/src/main/java/plugins/adufour/blocks/lang/BlockDescriptor.java
index 2ed032f0c0b2009ff20430b8907b6bce82daf161..c8c4521274dfc0b9f081476f19a524d5a3c8049f 100644
--- a/src/main/java/plugins/adufour/blocks/lang/BlockDescriptor.java
+++ b/src/main/java/plugins/adufour/blocks/lang/BlockDescriptor.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,16 +18,17 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.file.xml.XMLPersistent;
-import icy.gui.plugin.PluginErrorReport;
-import icy.network.NetworkUtil;
-import icy.plugin.PluginDescriptor;
-import icy.plugin.PluginInstaller;
-import icy.plugin.PluginRepositoryLoader;
-import icy.plugin.abstract_.Plugin;
-import icy.util.ClassUtil;
-import icy.util.StringUtil;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.common.reflect.ClassUtil;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.extension.plugin.PluginDescriptor;
+import org.bioimageanalysis.icy.extension.plugin.PluginInstaller;
+import org.bioimageanalysis.icy.extension.plugin.PluginRepositoryLoader;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.gui.plugin.PluginErrorReport;
+import org.bioimageanalysis.icy.io.xml.XMLPersistent;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.network.NetworkUtil;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import plugins.adufour.blocks.tools.Display;
@@ -604,8 +605,7 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
         final String blockType = XMLUtil.getAttributeValue(blockNode, "blockType", null);
 
         try {
-            final Class<? extends Block> blockClass = installRequiredBlock(
-                    XMLUtil.getAttributeValue(blockNode, "className", null), blockType);
+            final Class<? extends Block> blockClass = installRequiredBlock(XMLUtil.getAttributeValue(blockNode, "className", null), blockType);
 
             block = blockClass.getDeclaredConstructor().newInstance();
 
@@ -632,11 +632,12 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
                 final Var<?> var = inputVars.get(uid);
 
                 if (var == null) {
-                    if (noWarnings) {
+                    /*if (noWarnings) {
                         System.err.println("Error(s) while loading protocol:");
                         noWarnings = false;
                     }
-                    System.err.println(new NoSuchVariableException(this, uid).getMessage());
+                    System.err.println(new NoSuchVariableException(this, uid).getMessage());*/
+                    IcyLogger.warn(BlockDescriptor.class, new NoSuchVariableException(this, uid), "Error while loading protocol.");
                     continue;
                 }
 
@@ -669,11 +670,12 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
                 final Var<?> var = outputVars.get(uid);
 
                 if (var == null) {
-                    if (noWarnings) {
+                    /*if (noWarnings) {
                         System.err.println("Error(s) while loading protocol:");
                         noWarnings = false;
                     }
-                    System.err.println(new NoSuchVariableException(this, uid).getMessage());
+                    System.err.println(new NoSuchVariableException(this, uid).getMessage());*/
+                    IcyLogger.warn(BlockDescriptor.class, new NoSuchVariableException(this, uid), "Error while loading protocol.");
                     continue;
                 }
 
@@ -698,7 +700,7 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
             throw new BlocksException("Cannot create block (" + e1.getMessage() + ") => class not found", true);
         }
         catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
-            e.printStackTrace();
+            IcyLogger.error(BlockDescriptor.class, e, e.getLocalizedMessage());
         }
 
         return noWarnings;
@@ -802,11 +804,10 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
             newBlock = blockClass.getDeclaredConstructor().newInstance();
         }
         catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e1) {
-            e1.printStackTrace();
+            IcyLogger.error(BlockDescriptor.class, e1, e1.getLocalizedMessage());
         }
 
-        cpy = (newBlock instanceof WorkFlow ? ((WorkFlow) newBlock).getBlockDescriptor()
-                : new BlockDescriptor(-1, newBlock));
+        cpy = (newBlock instanceof WorkFlow ? ((WorkFlow) newBlock).getBlockDescriptor() : new BlockDescriptor(-1, newBlock));
 
         cpy.setDefinedName(getDefinedName());
         cpy.setLocation(getLocation().x + 12, getLocation().y + 12);
@@ -950,24 +951,28 @@ public class BlockDescriptor implements Runnable, VarListener, VarListListener,
     private static void cloneLinks(final Iterable<Link<?>> iterable, final Map<BlockDescriptor, BlockDescriptor> copies, final WorkFlow dest) {
         for (final Link<?> l : iterable) {
             if (l.srcBlock.getBlock() instanceof Loop || l.dstBlock.getBlock() instanceof Loop) {
-                System.err.println("Warning : cannot copy a link to a loop variable");
+                IcyLogger.warn(BlockDescriptor.class, "Cannot copy a link to a loop variable.");
                 continue;
             }
             if (l.srcBlock.getBlock() instanceof WorkFlow || l.dstBlock.getBlock() instanceof WorkFlow) {
-                System.err.println("Warning : cannot copy a link to an exposed variable");
+                IcyLogger.warn(BlockDescriptor.class, "Cannot copy a link to an exposed variable.");
                 continue;
             }
             try {
-                dest.addLink(copies.get(l.srcBlock),
+                dest.addLink(
+                        copies.get(l.srcBlock),
                         copies.get(l.srcBlock).inputVars.get(l.srcBlock.inputVars.getID(l.srcVar)),
                         copies.get(l.dstBlock),
-                        copies.get(l.dstBlock).inputVars.get(l.dstBlock.inputVars.getID(l.dstVar)));
+                        copies.get(l.dstBlock).inputVars.get(l.dstBlock.inputVars.getID(l.dstVar))
+                );
             }
             catch (final NoSuchVariableException nsve) {
-                dest.addLink(copies.get(l.srcBlock),
+                dest.addLink(
+                        copies.get(l.srcBlock),
                         copies.get(l.srcBlock).outputVars.get(l.srcBlock.outputVars.getID(l.srcVar)),
                         copies.get(l.dstBlock),
-                        copies.get(l.dstBlock).inputVars.get(l.dstBlock.inputVars.getID(l.dstVar)));
+                        copies.get(l.dstBlock).inputVars.get(l.dstBlock.inputVars.getID(l.dstVar))
+                );
             }
         }
     }
diff --git a/src/main/java/plugins/adufour/blocks/lang/FileBatch.java b/src/main/java/plugins/adufour/blocks/lang/FileBatch.java
index cdf415b1e5f0f29db11b01c1d788c5b06dcc1fad..356ecf8e558896d7b332d714b9bcbd86d3971e20 100644
--- a/src/main/java/plugins/adufour/blocks/lang/FileBatch.java
+++ b/src/main/java/plugins/adufour/blocks/lang/FileBatch.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,9 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.file.FileUtil;
-import icy.gui.frame.progress.AnnounceFrame;
-import icy.main.Icy;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.gui.frame.progress.AnnounceFrame;
+import org.bioimageanalysis.icy.io.FileUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/lang/Link.java b/src/main/java/plugins/adufour/blocks/lang/Link.java
index 0c8373dbee66247aac3b23197036dacc9a577b23..1ed8952c05f474e3e77cdb934c427b95f662d4eb 100644
--- a/src/main/java/plugins/adufour/blocks/lang/Link.java
+++ b/src/main/java/plugins/adufour/blocks/lang/Link.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,9 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.file.xml.XMLPersistent;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.io.xml.XMLPersistent;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import plugins.adufour.blocks.util.BlocksException;
@@ -86,7 +87,7 @@ public class Link<T> implements XMLPersistent {
             theSrcVar = theSrcBlock.inputVars.get(srcVarID);
 
         if (theSrcVar == null) {
-            System.err.println("Cannot create a link from variable " + srcVarID + " (from block " + theSrcBlock + ")");
+            IcyLogger.error(Link.class, "Cannot create a link from variable " + srcVarID + " (from block " + theSrcBlock + ")");
             return false;
         }
 
diff --git a/src/main/java/plugins/adufour/blocks/lang/Loop.java b/src/main/java/plugins/adufour/blocks/lang/Loop.java
index fdbcbe2992a723e8eea000698a0e2c5984d390c2..c47164869c7cf955b1a479067933229d69c745a0 100644
--- a/src/main/java/plugins/adufour/blocks/lang/Loop.java
+++ b/src/main/java/plugins/adufour/blocks/lang/Loop.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,7 +18,7 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.system.IcyHandledException;
+import org.bioimageanalysis.icy.system.IcyHandledException;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
 import plugins.adufour.blocks.tools.ReLoop;
 import plugins.adufour.blocks.util.BlocksException;
@@ -145,7 +145,7 @@ public class Loop extends WorkFlow {
             afterIteration();
         }
 
-        if (exceptions.size() > 0) {
+        if (!exceptions.isEmpty()) {
             final StringBuilder message = new StringBuilder("The following errors occurred during the loop:\n\n");
             for (final Exception e : exceptions)
                 message.append(" - ").append(e.getMessage()).append("\n");
@@ -213,9 +213,7 @@ public class Loop extends WorkFlow {
         }
         catch (final LoopException e) {
             // authorize loops only if the destination is a "ReLoop" block
-            if (link.dstBlock.getBlock() instanceof ReLoop) {
-                final ReLoop reLoop = (ReLoop) link.dstBlock.getBlock();
-
+            if (link.dstBlock.getBlock() instanceof final ReLoop reLoop) {
                 if (link.dstVar == reLoop.reloopValue)
                     return;
             }
diff --git a/src/main/java/plugins/adufour/blocks/lang/RangeLoop.java b/src/main/java/plugins/adufour/blocks/lang/RangeLoop.java
index 363cd4605ce1728f714306a5007bd7e321893f7d..254b7a13cfeb1d22732b7eb06c7012a4610793f5 100644
--- a/src/main/java/plugins/adufour/blocks/lang/RangeLoop.java
+++ b/src/main/java/plugins/adufour/blocks/lang/RangeLoop.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/adufour/blocks/lang/SequenceFileBatch.java b/src/main/java/plugins/adufour/blocks/lang/SequenceFileBatch.java
index a35621ae6ad4cb2ab8900c9606cd7c4ff9945caa..707f59ae3cf612bcd2409d31d4bcf2f1940f13a7 100644
--- a/src/main/java/plugins/adufour/blocks/lang/SequenceFileBatch.java
+++ b/src/main/java/plugins/adufour/blocks/lang/SequenceFileBatch.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,7 +18,7 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.file.Loader;
+import org.bioimageanalysis.icy.io.Loader;
 import plugins.adufour.vars.lang.VarSequence;
 
 import java.io.File;
diff --git a/src/main/java/plugins/adufour/blocks/lang/SequenceSeriesBatch.java b/src/main/java/plugins/adufour/blocks/lang/SequenceSeriesBatch.java
index df3eb2be5bc7a5e5ab73332f33a8fa46d1d884cd..e0bb3d7e07c9c0a37a1159d529d674be6c32a014 100644
--- a/src/main/java/plugins/adufour/blocks/lang/SequenceSeriesBatch.java
+++ b/src/main/java/plugins/adufour/blocks/lang/SequenceSeriesBatch.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,10 +18,10 @@
 
 package plugins.adufour.blocks.lang;
 
-import icy.common.exception.UnsupportedFormatException;
-import icy.file.Loader;
-import icy.file.SequenceFileImporter;
-import icy.sequence.MetaDataUtil;
+import org.bioimageanalysis.icy.common.exception.UnsupportedFormatException;
+import org.bioimageanalysis.icy.io.Loader;
+import org.bioimageanalysis.icy.io.SequenceFileImporter;
+import org.bioimageanalysis.icy.model.sequence.MetaDataUtil;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
 import plugins.adufour.vars.lang.VarFile;
@@ -30,7 +30,6 @@ import plugins.adufour.vars.util.VarException;
 import plugins.kernel.importer.LociImporterPlugin;
 
 import java.io.File;
-import java.io.IOException;
 
 /**
  * A Sequence series batch will iteratively load all series contained in a multi-series
@@ -93,12 +92,12 @@ public class SequenceSeriesBatch extends Batch {
         catch (final UnsupportedFormatException e) {
             throw new VarException(multiSeriesFile, path + " is not an imaging file");
         }
-        catch (final IOException e) {
-            throw new VarException(multiSeriesFile, "Unable to read " + path);
-        }
         catch (final InterruptedException e) {
             throw new VarException(multiSeriesFile, "Process interrupted !");
         }
+        catch (final Exception e) {
+            throw new VarException(multiSeriesFile, "Unable to read " + path);
+        }
     }
 
     @Override
diff --git a/src/main/java/plugins/adufour/blocks/lang/WorkFlow.java b/src/main/java/plugins/adufour/blocks/lang/WorkFlow.java
index 47b04f3d72d12e2b98b67f1042f7114bc7788428..b7be8a6e4858e241a58ed43d4d55018e33afdf84 100644
--- a/src/main/java/plugins/adufour/blocks/lang/WorkFlow.java
+++ b/src/main/java/plugins/adufour/blocks/lang/WorkFlow.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.adufour.blocks.lang;
 
-import icy.gui.dialog.ConfirmDialog;
-import icy.main.Icy;
-import icy.math.UnitUtil;
-import icy.plugin.abstract_.Plugin;
-import icy.system.IcyHandledException;
-import icy.system.thread.ThreadUtil;
-import icy.util.StringUtil;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.common.math.UnitUtil;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.gui.dialog.ConfirmDialog;
+import org.bioimageanalysis.icy.system.IcyHandledException;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
 import plugins.adufour.blocks.tools.input.InputBlock;
 import plugins.adufour.blocks.tools.output.OutputBlock;
@@ -432,7 +433,7 @@ public class WorkFlow extends Plugin implements Block, Iterable<BlockDescriptor>
     }
 
     @Override
-    public Iterator<BlockDescriptor> iterator() {
+    public @NotNull Iterator<BlockDescriptor> iterator() {
         // return orderedBlocks.iterator();
         return new Iterator<>() {
             private final Iterator<BlockDescriptor> orderedBlocksIt = orderedBlocks.iterator();
@@ -518,8 +519,7 @@ public class WorkFlow extends Plugin implements Block, Iterable<BlockDescriptor>
 
     public void removeBlock(final BlockDescriptor blockInfo, boolean checkSelection) {
         // pops out workflows' selections
-        if (blockInfo.getBlock() instanceof WorkFlow) {
-            final WorkFlow wf = ((WorkFlow) blockInfo.getBlock());
+        if (blockInfo.getBlock() instanceof final WorkFlow wf) {
             if (checkSelection && !wf.getBlockSelection().isEmpty())
                 try {
                     // use location in the main container instead of in the inner workflow
@@ -722,7 +722,7 @@ public class WorkFlow extends Plugin implements Block, Iterable<BlockDescriptor>
      */
     @Override
     public void run() {
-        if (orderedBlocks.size() == 0)
+        if (orderedBlocks.isEmpty())
             return;
 
         descriptor.setStatus(BlockStatus.RUNNING);
diff --git a/src/main/java/plugins/adufour/blocks/tools/Accumulator.java b/src/main/java/plugins/adufour/blocks/tools/Accumulator.java
index 90b6336a3a89ccddf1839fddfee5ef3dc89315a5..6755e81e86ac130d6d4d4056e37c4940eb06bf9d 100644
--- a/src/main/java/plugins/adufour/blocks/tools/Accumulator.java
+++ b/src/main/java/plugins/adufour/blocks/tools/Accumulator.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.blocks.util.VarListListener;
 import plugins.adufour.vars.lang.Var;
@@ -36,6 +36,7 @@ public class Accumulator extends Plugin implements ToolsBlock, TypeChangeListene
 
     private final VarMutable output = new VarMutable("output", null);
 
+    @SuppressWarnings("SuspiciousSystemArraycopy")
     @Override
     public void run() {
         int arrayLength = 0;
diff --git a/src/main/java/plugins/adufour/blocks/tools/Display.java b/src/main/java/plugins/adufour/blocks/tools/Display.java
index 6fec431bcec4a279f4a67bab1b2505153358b793..4bc82e10f82c3a0089f252c913aa0c5be3f9a9dc 100644
--- a/src/main/java/plugins/adufour/blocks/tools/Display.java
+++ b/src/main/java/plugins/adufour/blocks/tools/Display.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,9 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.main.Icy;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.Var;
@@ -33,7 +34,7 @@ public class Display extends Plugin implements Block {
     public void run() {
         if (Icy.getMainInterface().isHeadLess()) {
             // Print to the standard output stream
-            System.out.println(object.getValueAsString());
+            IcyLogger.info(Display.class, object.getValueAsString());
         }
     }
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/Indexer.java b/src/main/java/plugins/adufour/blocks/tools/Indexer.java
index 1f07fba5f251855da4c86edf0fa80b7cf73800ce..228218e012c1808bcfccaceaa7ca7341a7d5aa6f 100644
--- a/src/main/java/plugins/adufour/blocks/tools/Indexer.java
+++ b/src/main/java/plugins/adufour/blocks/tools/Indexer.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.Var;
 import plugins.adufour.vars.lang.VarInteger;
diff --git a/src/main/java/plugins/adufour/blocks/tools/Iterator.java b/src/main/java/plugins/adufour/blocks/tools/Iterator.java
index 24aa0b33fa89d9cf20be79106595f87200d24e21..9ea12b0b2e95e429e27f0c4193ef698ac17309aa 100644
--- a/src/main/java/plugins/adufour/blocks/tools/Iterator.java
+++ b/src/main/java/plugins/adufour/blocks/tools/Iterator.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.*;
 import plugins.adufour.vars.util.VarListener;
diff --git a/src/main/java/plugins/adufour/blocks/tools/ListSize.java b/src/main/java/plugins/adufour/blocks/tools/ListSize.java
index 1c32e4cd11ff496325ce48909877d55cdad86957..b49101be7b5bb6e30b0b2484d2ac088f251c5486 100644
--- a/src/main/java/plugins/adufour/blocks/tools/ListSize.java
+++ b/src/main/java/plugins/adufour/blocks/tools/ListSize.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarInteger;
 import plugins.adufour.vars.lang.VarMutableArray;
diff --git a/src/main/java/plugins/adufour/blocks/tools/ReLoop.java b/src/main/java/plugins/adufour/blocks/tools/ReLoop.java
index 74af8efa5893135c8dd30d4ef54ab43a50036876..7af37b57f59175837f3de086119d3056b7806c7c 100644
--- a/src/main/java/plugins/adufour/blocks/tools/ReLoop.java
+++ b/src/main/java/plugins/adufour/blocks/tools/ReLoop.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarMutable;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/ToolsBlock.java b/src/main/java/plugins/adufour/blocks/tools/ToolsBlock.java
index e1888ff52a9f8f7d7f666cff92cd604b9c939f32..631d1ee7b3e12049fe34a8c68047b299d5647666 100644
--- a/src/main/java/plugins/adufour/blocks/tools/ToolsBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/ToolsBlock.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/adufour/blocks/tools/ij/CallIJMacro.java b/src/main/java/plugins/adufour/blocks/tools/ij/CallIJMacro.java
deleted file mode 100644
index 25c4dc304f0bcfbcea0dcd619d814b04233b77f9..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/CallIJMacro.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.plugin.abstract_.Plugin;
-import ij.IJ;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarFile;
-
-public class CallIJMacro extends Plugin implements IJBlock {
-    private final VarFile macroFile = new VarFile("Macro file", null);
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        inputMap.add("Macro file", macroFile);
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-
-    }
-
-    @Override
-    public void run() {
-        IJ.runMacroFile(macroFile.getValue(true).getPath());
-    }
-
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/CallIJPlugin.java b/src/main/java/plugins/adufour/blocks/tools/ij/CallIJPlugin.java
deleted file mode 100644
index d98232c0a37f05ee35bdedba7a3169c6c618d3e5..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/CallIJPlugin.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.plugin.abstract_.Plugin;
-import icy.system.IcyHandledException;
-import ij.IJ;
-import ij.ImagePlus;
-import ij.WindowManager;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarImagePlus;
-import plugins.adufour.vars.lang.VarString;
-
-public class CallIJPlugin extends Plugin implements IJBlock {
-    private final VarImagePlus varIp = new VarImagePlus("Input ImagePlus", null);
-
-    private final VarString pluginName = new VarString("plug-in name", "");
-
-    private final VarString pluginParams = new VarString("parameters", "");
-
-    private final VarImagePlus varActiveIP = new VarImagePlus("Output (active) ImagePlus", null);
-
-    @Override
-    public void run() {
-        try {
-            final ImagePlus imgPlus = varIp.getValue(false);
-            final String params = pluginParams.getValue(false);
-
-            if (imgPlus != null)
-                IJ.run(imgPlus, pluginName.getValue(true), params);
-            else
-                IJ.run(pluginName.getValue(true), params);
-
-            ImagePlus output = null;
-
-            try {
-                // Set the output image (if available) with the following priority
-                output = WindowManager.getCurrentImage();
-            }
-            catch (final RuntimeException e) {
-                // just in case
-            }
-
-            // Default to the current "temporary" image (if any)
-            if (output == null)
-                output = WindowManager.getTempCurrentImage();
-            // Default to the input image (may have been modified "in-place"
-            if (output == null)
-                output = varIp.getValue();
-
-            varActiveIP.setValue(output);
-        }
-        catch (final RuntimeException e) {
-            throw new IcyHandledException(e.getLocalizedMessage());
-        }
-    }
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        inputMap.add("Input ImagePlus", varIp);
-        inputMap.add("ImageJ plug-in name", pluginName);
-        inputMap.add("ImageJ plug-in parameters", pluginParams);
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-        outputMap.add("Output ImagePlus", varActiveIP);
-    }
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/GetActiveImagePlus.java b/src/main/java/plugins/adufour/blocks/tools/ij/GetActiveImagePlus.java
deleted file mode 100644
index 72b82b3f0989d9b38949ab0e20247644d985ff6f..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/GetActiveImagePlus.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.plugin.abstract_.Plugin;
-import ij.ImagePlus;
-import ij.WindowManager;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarImagePlus;
-
-public class GetActiveImagePlus extends Plugin implements IJBlock {
-    private final VarImagePlus ip = new VarImagePlus("ImagePlus", null);
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        //
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-        outputMap.add("ImagePlus", ip);
-    }
-
-    @Override
-    public void run() {
-        // Set the output image (if available) with the following priority
-        ImagePlus imgPlus = WindowManager.getCurrentImage();
-        // Default to the current "temporary" image (if any)
-        if (imgPlus == null)
-            imgPlus = WindowManager.getTempCurrentImage();
-
-        ip.setValue(imgPlus);
-    }
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/IJBlock.java b/src/main/java/plugins/adufour/blocks/tools/ij/IJBlock.java
deleted file mode 100644
index 9cac90ed26bd414358544ee9aa90d269d4678e06..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/IJBlock.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import plugins.adufour.blocks.lang.Block;
-
-/**
- * Interface used to flag ImageJ-related blocks
- *
- * @author Alexandre Dufour
- */
-public interface IJBlock extends Block {
-}
\ No newline at end of file
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/ImagePlusToSequence.java b/src/main/java/plugins/adufour/blocks/tools/ij/ImagePlusToSequence.java
deleted file mode 100644
index 91af54ad74b05e79ead48285f855fd4021d34a3e..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/ImagePlusToSequence.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.imagej.ImageJUtil;
-import icy.plugin.abstract_.Plugin;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarImagePlus;
-import plugins.adufour.vars.lang.VarSequence;
-import plugins.adufour.vars.util.VarException;
-
-public class ImagePlusToSequence extends Plugin implements IJBlock {
-    private final VarImagePlus vip = new VarImagePlus("IJ ImagePlus", null);
-    private final VarSequence vs = new VarSequence("Icy Sequence", null);
-
-    @Override
-    public void run() {
-        try {
-            vs.setValue(ImageJUtil.convertToIcySequence(vip.getValue(true), null));
-        }
-        catch (final IllegalAccessError e) {
-            throw new VarException(vip, e.getMessage());
-        }
-        catch (final InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        inputMap.add("IJ ImagePlus", vip);
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-        outputMap.add("Icy Sequence", vs);
-    }
-
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/SequenceToImagePlus.java b/src/main/java/plugins/adufour/blocks/tools/ij/SequenceToImagePlus.java
deleted file mode 100644
index cb8c97f0de87082f3337162627ad5f97c4ea1bf1..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/SequenceToImagePlus.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.imagej.ImageJUtil;
-import icy.plugin.abstract_.Plugin;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarImagePlus;
-import plugins.adufour.vars.lang.VarSequence;
-import plugins.adufour.vars.util.VarException;
-
-public class SequenceToImagePlus extends Plugin implements IJBlock {
-    private final VarSequence vs = new VarSequence("Icy Sequence", null);
-    private final VarImagePlus vip = new VarImagePlus("ImagePlus", null);
-
-    @Override
-    public void run() {
-        try {
-            vip.setValue(ImageJUtil.convertToImageJImage(vs.getValue(true), null));
-        }
-        catch (final IllegalAccessError e) {
-            throw new VarException(vs, e.getMessage());
-        }
-        catch (final InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        inputMap.add("Icy Sequence", vs);
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-        outputMap.add("IJ ImagePlus", vip);
-    }
-
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/ij/ShowImagePlus.java b/src/main/java/plugins/adufour/blocks/tools/ij/ShowImagePlus.java
deleted file mode 100644
index fe3314a346da401e57be838ddbb1631001266f20..0000000000000000000000000000000000000000
--- a/src/main/java/plugins/adufour/blocks/tools/ij/ShowImagePlus.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2010-2023. Institut Pasteur.
- *
- * This file is part of Icy.
- * Icy is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Icy is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Icy. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package plugins.adufour.blocks.tools.ij;
-
-import icy.plugin.abstract_.Plugin;
-import plugins.adufour.blocks.util.VarList;
-import plugins.adufour.vars.lang.VarImagePlus;
-
-public class ShowImagePlus extends Plugin implements IJBlock {
-    private final VarImagePlus ip = new VarImagePlus("ImagePlus", null);
-
-    @Override
-    public void declareInput(final VarList inputMap) {
-        inputMap.add("ImagePlus", ip);
-    }
-
-    @Override
-    public void declareOutput(final VarList outputMap) {
-    }
-
-    @Override
-    public void run() {
-        ip.getValue(true).show();
-    }
-
-}
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Boolean.java b/src/main/java/plugins/adufour/blocks/tools/input/Boolean.java
index 13dbfd7b9395cf833b3b1d9f866e6a99dc03c693..1ad2592307cf62283303011b5ad9b7e5f95310b2 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Boolean.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Boolean.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarBoolean;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Decimal.java b/src/main/java/plugins/adufour/blocks/tools/input/Decimal.java
index 3ccdbb6f44ae1333cef77e286f4d1d30a376c9d0..f0912ef84d727bffab1df37ba3b97698f654bdcc 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Decimal.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Decimal.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarDouble;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Decimals.java b/src/main/java/plugins/adufour/blocks/tools/input/Decimals.java
index 0a724d1a38c8fdd076bcb64af8f8020ad17df040..6139ba13b2c2f34cb9604cea4b59cc7d2c1eaad7 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Decimals.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Decimals.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarDoubleArrayNative;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/File.java b/src/main/java/plugins/adufour/blocks/tools/input/File.java
index 5c4140fd2343762a417515a3a899fd4f01bd3188..400058fe228d8375a2df433aa0fd1ad70a7e51e3 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/File.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/File.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Files.java b/src/main/java/plugins/adufour/blocks/tools/input/Files.java
index 43dc14792872b6a7316d32cfb3007c29cd8b9246..4d0760e969c3de7dd421a8303bdaa5bf19c56ef6 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Files.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Files.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeListModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Folder.java b/src/main/java/plugins/adufour/blocks/tools/input/Folder.java
index 5a96c272dc07237a778a2f55ea0488b5de1331f5..ec80e2eb8758d2c0be95999c9c330656d6d42fd0 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Folder.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Folder.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Folders.java b/src/main/java/plugins/adufour/blocks/tools/input/Folders.java
index 0a390ef0eb4c99df23db0960b2cbfa265187f1d4..8b49e0be6af710b0bbddaba3904844f98352e2f2 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Folders.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Folders.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeListModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/InputBlock.java b/src/main/java/plugins/adufour/blocks/tools/input/InputBlock.java
index e8ba5a337e2a0b35f6249840fe14bd9534113290..7599fa0a661628b7b6cd71cb6dd1c501be4205d3 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/InputBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/InputBlock.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/adufour/blocks/tools/input/Integer.java b/src/main/java/plugins/adufour/blocks/tools/input/Integer.java
index 9fc5b5930346862fec75625600e492dda175ac81..53b76fb3207f2b41006ae205442dda8eae615c3d 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Integer.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Integer.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarInteger;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Integers.java b/src/main/java/plugins/adufour/blocks/tools/input/Integers.java
index fb97208fa265862bbf0a15df573982ca816d8d88..994fc2290cc960d99255e0095a2fb7a467bbdc23 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Integers.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Integers.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarIntegerArrayNative;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Sequence.java b/src/main/java/plugins/adufour/blocks/tools/input/Sequence.java
index 9e9f9fa56bb4c3682df2e99ee7337c174d4f81e6..95ae6020920c1b8e31365fc1b4c32cd8b3e69edc 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Sequence.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Sequence.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,12 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequence;
 
 /**
- * Utility block reading a {@link icy.sequence.Sequence} object
+ * Utility block reading a {@link org.bioimageanalysis.icy.model.sequence.Sequence} object
  *
  * @author Alexandre Dufour
  */
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Sequences.java b/src/main/java/plugins/adufour/blocks/tools/input/Sequences.java
index 6395bfef983adc86b19623d4039fb5166355ae82..5ea4524fa0ae823cf62999fb762a720ded1e09b2 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Sequences.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Sequences.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,12 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequenceArray;
 
 /**
- * Utility block reading a list of {@link icy.sequence.Sequence} objects
+ * Utility block reading a list of {@link org.bioimageanalysis.icy.model.sequence.Sequence} objects
  *
  * @author Alexandre Dufour
  */
diff --git a/src/main/java/plugins/adufour/blocks/tools/input/Text.java b/src/main/java/plugins/adufour/blocks/tools/input/Text.java
index 7d74e34cc2f579bfe5c5c1671b0d11a50f179abf..075d27686cedcc785e900ace51173b8c691a19c4 100644
--- a/src/main/java/plugins/adufour/blocks/tools/input/Text.java
+++ b/src/main/java/plugins/adufour/blocks/tools/input/Text.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.input;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarString;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/AppendFilePath.java b/src/main/java/plugins/adufour/blocks/tools/io/AppendFilePath.java
index c55616a901b510144a62faae6ece8ffac4683794..9e3eef532251b6c5be04329bbc29d3ace214b8fc 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/AppendFilePath.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/AppendFilePath.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,8 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.FileUtil;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.FileUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarBoolean;
 import plugins.adufour.vars.lang.VarFile;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/CreateFile.java b/src/main/java/plugins/adufour/blocks/tools/io/CreateFile.java
index f0ccb87eb7870467eb89e091fa3374d19491e9ec..abc30a2ebf99536840a7dd9f933341bbf8f74f43 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/CreateFile.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/CreateFile.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,8 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.FileUtil;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.FileUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/CreateFolder.java b/src/main/java/plugins/adufour/blocks/tools/io/CreateFolder.java
index d3f539495513d6395f548c191bf633e3c1b53392..5644d8312521ef8fc1ec3642f37571c4ebca48da 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/CreateFolder.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/CreateFolder.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,8 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.FileUtil;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.FileUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/FileToPath.java b/src/main/java/plugins/adufour/blocks/tools/io/FileToPath.java
index c12a94e7c78a57dcf06c868947f3f1986358a265..e8bc94c5087dbdcb05006b06fea406d5b4bc8b75 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/FileToPath.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/FileToPath.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarFile;
 import plugins.adufour.vars.lang.VarString;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/FileToSequence.java b/src/main/java/plugins/adufour/blocks/tools/io/FileToSequence.java
index 5c08e27f6bf325f76635fd774e751caf7bd31bba..126b868ac5bc7530382241ed16023f4a275d5582 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/FileToSequence.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/FileToSequence.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,9 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.Loader;
-import icy.plugin.abstract_.Plugin;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.Loader;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarFile;
 import plugins.adufour.vars.lang.VarInteger;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/FilesToSequence.java b/src/main/java/plugins/adufour/blocks/tools/io/FilesToSequence.java
index 831aa2b4364e36af08631adb1e16ef03851ddccb..0aa810ea0526a2b18ff00f7bc026dec1bb892b18 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/FilesToSequence.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/FilesToSequence.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.adufour.blocks.tools.io;
 
-import icy.file.Loader;
-import icy.plugin.abstract_.Plugin;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.Loader;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarFileArray;
 import plugins.adufour.vars.lang.VarSequence;
@@ -31,7 +30,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Utility block that reads multiple image files from disk into a {@link Sequence}
+ * Utility block that reads multiple image files from disk into a {@link org.bioimageanalysis.icy.model.sequence.Sequence}
  *
  * @author Alexandre Dufour
  */
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/GetSequenceFolder.java b/src/main/java/plugins/adufour/blocks/tools/io/GetSequenceFolder.java
index 0c22f9481c9c8cfc7a7d3a7885e6c727681712b9..32be0ce97dcf2be2750c6321cdcb4e9e6586bb32 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/GetSequenceFolder.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/GetSequenceFolder.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,8 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.FileUtil;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.FileUtil;
 import plugins.adufour.blocks.tools.sequence.SequenceBlock;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarFile;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/IOBlock.java b/src/main/java/plugins/adufour/blocks/tools/io/IOBlock.java
index d9c51cde6f52e388642511928b8e7a17d1a4f2c2..41d4a3169122aed3824e42b9d10b1ce7378bf22c 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/IOBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/IOBlock.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
@@ -26,5 +26,4 @@ import plugins.adufour.blocks.lang.Block;
  * @author Alexandre Dufour
  */
 public interface IOBlock extends Block {
-
 }
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/PathToFile.java b/src/main/java/plugins/adufour/blocks/tools/io/PathToFile.java
index 255d258722e8b423347a19037519d8a2b560a361..a5f6754d6a501cacbc6b4ed0647ce89187a6f724 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/PathToFile.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/PathToFile.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarFile;
 import plugins.adufour.vars.lang.VarString;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/SendToSwimmingPool.java b/src/main/java/plugins/adufour/blocks/tools/io/SendToSwimmingPool.java
index bbb265f06a1794e7fd1b4c6cbe461c400ba911ac..da2968facf6ddec951217ea20b6742f49049a7c5 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/SendToSwimmingPool.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/SendToSwimmingPool.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,9 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.main.Icy;
-import icy.plugin.abstract_.Plugin;
-import icy.swimmingPool.SwimmingObject;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.swimmingPool.SwimmingObject;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarMutable;
diff --git a/src/main/java/plugins/adufour/blocks/tools/io/SequenceToFile.java b/src/main/java/plugins/adufour/blocks/tools/io/SequenceToFile.java
index b204e52d575cf2448f3c713c8e4e77ac78138445..4208f3c215a5b99a532514148f580ce347349682 100644
--- a/src/main/java/plugins/adufour/blocks/tools/io/SequenceToFile.java
+++ b/src/main/java/plugins/adufour/blocks/tools/io/SequenceToFile.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,8 @@
 
 package plugins.adufour.blocks.tools.io;
 
-import icy.file.Saver;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.io.Saver;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java
index 8aacf28e17c15923e93e60d0ae9570a31b502837..09f12b884e1a900a268eadf5cda0c0a10f308ca9 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarBoolean;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java
index 73869f33f7347c60e8a15b6218c2b4ba743f20e2..f85d47803d6e31ec60a61d951cc5c94f344d7d70 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarDouble;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java
index 063e9a051bfe996045f73a2d711090414dd9a0b4..c3955ef4ee3cf9e76a0d698f3dd9717203a86584 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarDoubleArrayNative;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java
index abb7aeabf7e6c06a965b78153672292ad96d2c0f..b891cca1038296b462060ed66a16a0dd21a99097 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java
index 078f130ec036d515ac3d76f4545212003cc240de..f2f85fade30abb09687eef9384d4d8663ceae363 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeListModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java
index 7aba8f61503fe9f10dd9b7d98bd27f5fa60d584b..c20fdf2d0318cf41fa00f7769d5431043dd87800 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java
index 34da2c1b911dcbbba7f517ba8baef7b4467d1ce6..15231bda156f438268d4cba1e97691eaf0c36cc9 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.FileMode;
 import plugins.adufour.vars.gui.model.FileTypeListModel;
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java
index 7373642a9e0d8c68e47ffabb1de2f431ac93708a..2dfad0c769152fd303748cf3b5050184c6187e7b 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarInteger;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java
index 63d54564087a22ffd67da590c10e132ce028ba3c..c1d24a490ceb8713efcb3a2c878f52ed7fbe41e0 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarIntegerArrayNative;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java b/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java
index ee2ff647ab61014b99dd65e0e74ded7e8646f2e2..f84acb362630072ca49500bb8fb26161b91d99c5 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.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/adufour/blocks/tools/output/SequenceOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java
index 7ffa75b89d984b506707e6498117c3dd3e16afbe..986420b677fe0cbd521cfcb2a8803915c9e933aa 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.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,12 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequence;
 
 /**
- * Utility block reading a {@link icy.sequence.Sequence} object
+ * Utility block reading a {@link org.bioimageanalysis.icy.model.sequence.Sequence} object
  *
  * @author Alexandre Dufour
  */
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java
index a9e18ab79697c9f523938cae75fba5f83b58676f..e4b2b3e47a8bae6febc598b096f7b9bea3857d89 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.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,12 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequenceArray;
 
 /**
- * Utility block reading a list of {@link icy.sequence.Sequence} objects
+ * Utility block reading a list of {@link org.bioimageanalysis.icy.model.sequence.Sequence} objects
  *
  * @author Alexandre Dufour
  */
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java
index 773df1996fef5cff6fa79f13f198bc4c0558994d..75e6cec180c062fe4d05c28a28fcd10ad429f1fc 100644
--- a/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java
+++ b/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.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,7 +18,7 @@
 
 package plugins.adufour.blocks.tools.output;
 
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarString;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/CropSequenceToROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/CropSequenceToROI.java
index 06dc8e53db6098ecc046c4985ba91af2cd53f297..48139e75867fc267bf16bdc71b492f7d02629ee8 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/CropSequenceToROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/CropSequenceToROI.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,14 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.image.IcyBufferedImage;
-import icy.image.IcyBufferedImageUtil;
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
-import icy.sequence.Sequence;
-import icy.type.rectangle.Rectangle5D;
-import icy.util.OMEUtil;
-import icy.util.StringUtil;
+import org.bioimageanalysis.icy.common.geom.rectangle.Rectangle5D;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.OMEUtil;
+import org.bioimageanalysis.icy.model.image.IcyBufferedImage;
+import org.bioimageanalysis.icy.model.image.IcyBufferedImageUtil;
+import org.bioimageanalysis.icy.model.roi.ROI;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarGenericArray;
 import plugins.adufour.vars.lang.VarROIArray;
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/DilateROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/DilateROI.java
index fe94702180042e493cda8e49ebd1412282047d59..9c875073d90c1f47716b96097447039b1cfe2f28 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/DilateROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/DilateROI.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,17 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.roi.*;
-import icy.type.point.Point3D;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DArea;
+import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea;
+import org.bioimageanalysis.icy.common.geom.point.Point3D;
+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.mask.BooleanMask2D;
+import org.bioimageanalysis.icy.model.roi.mask.BooleanMask3D;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.adufour.vars.lang.VarROIArray;
 import plugins.adufour.vars.util.VarException;
-import plugins.kernel.roi.roi2d.ROI2DArea;
-import plugins.kernel.roi.roi3d.ROI3DArea;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -200,9 +205,7 @@ public class DilateROI extends MorphROI {
 
             return r2;
         }
-        else if (roi instanceof ROI3D) {
-            final ROI3D roi3D = (ROI3D) roi;
-
+        else if (roi instanceof final ROI3D roi3D) {
             final BooleanMask3D m3 = roi3D.getBooleanMask(true);
 
             final ROI3DArea r3 = new ROI3DArea(m3);
@@ -247,7 +250,7 @@ public class DilateROI extends MorphROI {
             return r3;
         }
 
-        System.out.println("[Dilate ROI] Warning: unsupported ROI: " + roi.getName());
+        IcyLogger.warn(DilateROI.class, "Unsupported ROI: " + roi.getName());
         return null;
     }
 }
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/ErodeROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/ErodeROI.java
index 53fdc2aba554f67710c26480b2e995efad932a07..bdfc66fd5cdfd98e639e0f7c5b3653a6878808ab 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/ErodeROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/ErodeROI.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,17 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.roi.*;
-import icy.type.point.Point3D;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DArea;
+import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea;
+import org.bioimageanalysis.icy.common.geom.point.Point3D;
+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.mask.BooleanMask2D;
+import org.bioimageanalysis.icy.model.roi.mask.BooleanMask3D;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.adufour.vars.lang.VarROIArray;
 import plugins.adufour.vars.util.VarException;
-import plugins.kernel.roi.roi2d.ROI2DArea;
-import plugins.kernel.roi.roi3d.ROI3DArea;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -176,9 +181,7 @@ public class ErodeROI extends MorphROI {
 
             return r2.getNumberOfPoints() > 0 ? r2 : null;
         }
-        else if (roi instanceof ROI3D) {
-            final ROI3D roi3D = (ROI3D) roi;
-
+        else if (roi instanceof final ROI3D roi3D) {
             final BooleanMask3D m3 = roi3D.getBooleanMask(true);
 
             final ROI3DArea r3 = new ROI3DArea(m3);
@@ -237,7 +240,7 @@ public class ErodeROI extends MorphROI {
             return r3.getNumberOfPoints() > 0 ? r3 : null;
         }
 
-        System.out.println("[Erode ROI] Warning: unsupported ROI: " + roi.getName());
+        IcyLogger.warn(ErodeROI.class, "Unsupported ROI: " + roi.getName());
         return null;
     }
 }
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/GetROIFromSequence.java b/src/main/java/plugins/adufour/blocks/tools/roi/GetROIFromSequence.java
index c2d502a8fed6c079ee873f8a5a78dec75568411b..477ec74f789ce94a5dc34e63c0fa5a96f45c4b42 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/GetROIFromSequence.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/GetROIFromSequence.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,9 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.roi.ROI;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarEnum;
 import plugins.adufour.vars.lang.VarROIArray;
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/MergeROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/MergeROI.java
index 640940bd401155520df23469c0e803e7b3f0e8db..5bd2159e0afaf441855d1cc548a7257cb4f1ae4e 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/MergeROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/MergeROI.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,10 +18,10 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
-import icy.roi.ROIUtil;
-import icy.util.ShapeUtil.BooleanOperator;
+import org.bioimageanalysis.icy.common.geom.shape.ShapeUtil;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.roi.ROI;
+import org.bioimageanalysis.icy.model.roi.ROIUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarEnum;
 import plugins.adufour.vars.lang.VarROIArray;
@@ -30,7 +30,7 @@ import java.util.Arrays;
 import java.util.List;
 
 public class MergeROI extends Plugin implements ROIBlock {
-    private final VarEnum<BooleanOperator> operation = new VarEnum<>("Merge operation", BooleanOperator.AND);
+    private final VarEnum<ShapeUtil.BooleanOperator> operation = new VarEnum<>("Merge operation", ShapeUtil.BooleanOperator.AND);
 
     private final VarROIArray roiIn = new VarROIArray("List of ROI");
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/MorphROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/MorphROI.java
index b1dc9df83b1cd45da26cac390ddc59ffa73bc169..18c5e53014679283e9606b79ff94d3340f4831a0 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/MorphROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/MorphROI.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,8 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.roi.ROI;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.gui.model.IntegerRangeModel;
 import plugins.adufour.vars.lang.VarEnum;
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/ROIBlock.java b/src/main/java/plugins/adufour/blocks/tools/roi/ROIBlock.java
index 5c7ccfe112a4b8f3b2a9d0e7e32da9221cc2f1d2..a08140bc329a6bc7cc110e334716e21db96bc2e6 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/ROIBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/ROIBlock.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/adufour/blocks/tools/roi/SubtractROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/SubtractROI.java
index ac46a4a0a82a221486aecc038d80705a13a5e374..8beca1bab50febe0a301ddedc91383a51b9ed287 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/SubtractROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/SubtractROI.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,8 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.roi.ROI;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarROIArray;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/roi/TranslateROI.java b/src/main/java/plugins/adufour/blocks/tools/roi/TranslateROI.java
index 9d5a1bfabdb9b37708d5eb44b8e913526449ff0a..56952993693b648c1637546c422c16ec76d7006e 100644
--- a/src/main/java/plugins/adufour/blocks/tools/roi/TranslateROI.java
+++ b/src/main/java/plugins/adufour/blocks/tools/roi/TranslateROI.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,14 @@
 
 package plugins.adufour.blocks.tools.roi;
 
-import icy.plugin.abstract_.Plugin;
-import icy.roi.ROI;
-import icy.type.point.Point5D;
+import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DArea;
+import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea;
+import org.bioimageanalysis.icy.common.geom.point.Point5D;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.roi.ROI;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarInteger;
 import plugins.adufour.vars.lang.VarROIArray;
-import plugins.kernel.roi.roi2d.ROI2DArea;
-import plugins.kernel.roi.roi3d.ROI3DArea;
 
 import java.awt.geom.Point2D;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceBlock.java b/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceBlock.java
index 81b2fa1266c8151c74d51e37fb02cd85618ac452..1ce61fd7515a03412654a03835e453558c49a975 100644
--- a/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceBlock.java
+++ b/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceBlock.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
@@ -26,5 +26,4 @@ import plugins.adufour.blocks.lang.Block;
  * @author Alexandre Dufour
  */
 public interface SequenceBlock extends Block {
-
 }
diff --git a/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceScreenshot.java b/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceScreenshot.java
index e04cb02fa473967a81765394fe235c14016ddb92..3f2cee68c5d5412953b85ac668bccaad461691d7 100644
--- a/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceScreenshot.java
+++ b/src/main/java/plugins/adufour/blocks/tools/sequence/SequenceScreenshot.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,11 +18,11 @@
 
 package plugins.adufour.blocks.tools.sequence;
 
-import icy.canvas.Canvas2D;
-import icy.gui.viewer.Viewer;
-import icy.plugin.abstract_.Plugin;
-import icy.sequence.Sequence;
-import icy.system.thread.ThreadUtil;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.gui.canvas.Canvas2D;
+import org.bioimageanalysis.icy.gui.viewer.Viewer;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequence;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/sequence/ShowSequence.java b/src/main/java/plugins/adufour/blocks/tools/sequence/ShowSequence.java
index 756c6e5e66f1944d2e17b690e59145b5f79bf77f..27aa8e580719ae925a6da404d7bee09651e9bbf2 100644
--- a/src/main/java/plugins/adufour/blocks/tools/sequence/ShowSequence.java
+++ b/src/main/java/plugins/adufour/blocks/tools/sequence/ShowSequence.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,8 @@
 
 package plugins.adufour.blocks.tools.sequence;
 
-import icy.main.Icy;
-import icy.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.vars.lang.VarSequence;
 
diff --git a/src/main/java/plugins/adufour/blocks/tools/text/AppendText.java b/src/main/java/plugins/adufour/blocks/tools/text/AppendText.java
index cb77da266c113fae954352b57f66dc0220a8a9bc..01a6c814cb306d0bb230a2f36592b622d76fa23c 100644
--- a/src/main/java/plugins/adufour/blocks/tools/text/AppendText.java
+++ b/src/main/java/plugins/adufour/blocks/tools/text/AppendText.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,9 @@
 
 package plugins.adufour.blocks.tools.text;
 
-import icy.plugin.abstract_.Plugin;
-import icy.plugin.interface_.PluginBundled;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.interface_.PluginBundled;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 import plugins.adufour.blocks.tools.ToolsBlock;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.protocols.Protocols;
diff --git a/src/main/java/plugins/adufour/blocks/util/BlockAnnotations.java b/src/main/java/plugins/adufour/blocks/util/BlockAnnotations.java
index 9c0ae85ce583559e331be3c03a09fc1dad64ef49..264f2db66f940f9fefda41b960ead51ab3ac7f61 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlockAnnotations.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlockAnnotations.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,9 @@
 
 package plugins.adufour.blocks.util;
 
-import icy.plugin.abstract_.Plugin;
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.vars.lang.*;
 
@@ -153,7 +154,7 @@ public class BlockAnnotations {
                     if (outputVariable != null) outputVariable.setValue(result);
                 }
                 catch (final Exception e) {
-                    e.printStackTrace();
+                    IcyLogger.error(BlockAnnotations.class, e, e.getLocalizedMessage());
                 }
             }
 
@@ -171,7 +172,7 @@ public class BlockAnnotations {
                     }
                 }
                 catch (final Exception e) {
-                    e.printStackTrace();
+                    IcyLogger.error(BlockAnnotations.class, e, e.getLocalizedMessage());
                 }
 
                 if (outputVariable != null) outputMap.add("output", outputVariable);
@@ -201,7 +202,7 @@ public class BlockAnnotations {
                     }
                 }
                 catch (final Exception e) {
-                    e.printStackTrace();
+                    IcyLogger.error(BlockAnnotations.class, e, e.getLocalizedMessage());
                 }
             }
         };
diff --git a/src/main/java/plugins/adufour/blocks/util/BlockListener.java b/src/main/java/plugins/adufour/blocks/util/BlockListener.java
index 7baf43585f3914f505766f4ede626271eb205c81..e542459c40384efeefeea66515717ef6fec5e6c0 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlockListener.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlockListener.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/adufour/blocks/util/BlocksException.java b/src/main/java/plugins/adufour/blocks/util/BlocksException.java
index 9d991993675971e3a2b67e23eb4aa1f350391952..ed58ea80589fef7de9de2083727fccee6a2af4d0 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksException.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksException.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/adufour/blocks/util/BlocksFinder.java b/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java
index d66aa967e333cddfc43405c51a2cdf365a4e7481..9db8e164911fd3578918d9d166406f03835eed0f 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksFinder.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,16 @@
 
 package plugins.adufour.blocks.util;
 
-import icy.gui.component.menu.IcyMenu;
-import icy.gui.component.menu.IcyMenuItem;
-import icy.gui.component.menu.IcyPluginMenuItem;
-import icy.plugin.PluginDescriptor;
-import icy.plugin.PluginLoader;
-import icy.plugin.abstract_.Plugin;
-import icy.util.ClassUtil;
-import jiconfont.icons.google_material_design_icons.GoogleMaterialDesignIcons;
+import org.bioimageanalysis.icy.common.reflect.ClassUtil;
+import org.bioimageanalysis.icy.extension.plugin.PluginDescriptor;
+import org.bioimageanalysis.icy.extension.plugin.PluginLoader;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIcon;
+import org.bioimageanalysis.icy.gui.component.menu.IcyMenu;
+import org.bioimageanalysis.icy.gui.component.menu.IcyMenuItem;
+import org.bioimageanalysis.icy.gui.component.menu.IcyPluginMenuItem;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.Loop;
@@ -33,7 +35,6 @@ import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.blocks.tools.Display;
 import plugins.adufour.blocks.tools.ReLoop;
 import plugins.adufour.blocks.tools.ToolsBlock;
-import plugins.adufour.blocks.tools.ij.IJBlock;
 import plugins.adufour.blocks.tools.input.InputBlock;
 import plugins.adufour.blocks.tools.io.IOBlock;
 import plugins.adufour.blocks.tools.output.OutputBlock;
@@ -106,18 +107,17 @@ public class BlocksFinder {
         }
 
         @Override
-        public Object getTransferData(final DataFlavor flavor) {
+        public @NotNull Object getTransferData(final DataFlavor flavor) {
             return this;
         }
 
         @Override
         public DataFlavor[] getTransferDataFlavors() {
             try {
-                return new DataFlavor[]{
-                        new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=java.util.ArrayList")};
+                return new DataFlavor[]{new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=java.util.ArrayList")};
             }
             catch (final ClassNotFoundException e) {
-                e.printStackTrace();
+                IcyLogger.error(BlocksFinder.class, e, e.getLocalizedMessage());
             }
             return null;
         }
@@ -190,9 +190,9 @@ public class BlocksFinder {
      * @param searchText    String
      */
     public void createSearchMenu(final BlockSearchPanel menuContainer, String searchText) {
-        final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, true, false, false);
+        final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, false, false);
 
-        if (plugins.size() == 0) {
+        if (plugins.isEmpty()) {
             final JMenuItem item = new JMenuItem("The plug-in list has been updated.\nPlease close and re-open the Protocols editor.");
             item.setFont(item.getFont().deriveFont(Font.ITALIC));
             menuContainer.add(item);
@@ -270,37 +270,34 @@ public class BlocksFinder {
      * @param location      Point
      */
     public final void createJMenu(final Container menuContainer, final WorkFlowContainer workFlowPane, final Point location) {
-        final IcyMenu mnBlocks = new IcyMenu("Blocks...", GoogleMaterialDesignIcons.WIDGETS);
+        final IcyMenu mnBlocks = new IcyMenu("Blocks...", SVGIcon.WIDGETS);
         //mnBlocks.setIcon(new IcyIcon(ResourceUtil.getAlphaIconAsImage("box.png"), 22));
 
-        final IcyMenu mnInput = new IcyMenu("Read...", GoogleMaterialDesignIcons.REDO);
+        final IcyMenu mnInput = new IcyMenu("Read...", SVGIcon.REDO);
         //mnInput.setIcon(new IcyIcon(ResourceUtil.ICON_REDO, 22));
 
-        final IcyMenu mnOutput = new IcyMenu("Out...", GoogleMaterialDesignIcons.UNDO);
+        final IcyMenu mnOutput = new IcyMenu("Out...", SVGIcon.UNDO);
         //mnOutput.setIcon(new IcyIcon(ResourceUtil.ICON_UNDO, 22));
 
-        final IcyMenu mnIO = new IcyMenu("I/O...", GoogleMaterialDesignIcons.SAVE);
+        final IcyMenu mnIO = new IcyMenu("I/O...", SVGIcon.SAVE);
         //mnIO.setIcon(new IcyIcon(ResourceUtil.ICON_SAVE, 22));
 
-        final IcyMenu mnSeq = new IcyMenu("Sequence...", GoogleMaterialDesignIcons.PHOTO);
+        final IcyMenu mnSeq = new IcyMenu("Sequence...", SVGIcon.IMAGE);
         //mnSeq.setIcon(new IcyIcon(ResourceUtil.ICON_PHOTO, 22));
 
-        final IcyMenu mnROI = new IcyMenu("ROI...", GoogleMaterialDesignIcons.GRAIN);
+        final IcyMenu mnROI = new IcyMenu("ROI...", SVGIcon.DRAW_ABSTRACT);
         //mnROI.setIcon(new IcyIcon(ResourceUtil.ICON_ROI_POLYGON, 22));
 
-        final IcyMenu mnImageJ = new IcyMenu("ImageJ...", GoogleMaterialDesignIcons.REPORT);
-        //mnImageJ.setIcon(new IcyIcon(ResourceUtil.ICON_TOIJ, 22));
-
-        final IcyMenu mnLoops = new IcyMenu("Loop / Batch...", GoogleMaterialDesignIcons.LOOP);
+        final IcyMenu mnLoops = new IcyMenu("Loop / Batch...", SVGIcon.LAPS);
         //mnLoops.setIcon(new IcyIcon(ResourceUtil.ICON_RELOAD, 22));
 
-        final IcyMenu mnTools = new IcyMenu("Tools...", GoogleMaterialDesignIcons.SETTINGS);
+        final IcyMenu mnTools = new IcyMenu("Tools...", SVGIcon.SETTINGS);
         //mnTools.setIcon(new IcyIcon(ResourceUtil.ICON_TOOLS, 22));
 
-        final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, true, false, false);
+        final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, false, false);
 
-        if (plugins.size() == 0) {
-            final IcyMenuItem item = new IcyMenuItem("The plug-in list has been updated.\nPlease close and re-open the Protocols editor.");
+        if (plugins.isEmpty()) {
+            final JMenuItem item = new JMenuItem("The plug-in list has been updated.\nPlease close and re-open the Protocols editor.");
             item.setFont(item.getFont().deriveFont(Font.ITALIC));
             menuContainer.add(item);
             return;
@@ -343,7 +340,7 @@ public class BlocksFinder {
                         addBlock(workFlowPane, blockClass.getDeclaredConstructor().newInstance(), location);
                     }
                     catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e1) {
-                        e1.printStackTrace();
+                        IcyLogger.error(BlocksFinder.class, e1, e1.getLocalizedMessage());
                     }
                 });
 
@@ -361,7 +358,7 @@ public class BlocksFinder {
                             addBlock(workFlowPane, blockClass.getDeclaredConstructor().newInstance(), location);
                         }
                         catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e1) {
-                            e1.printStackTrace();
+                            IcyLogger.error(BlocksFinder.class, e1, e1.getLocalizedMessage());
                         }
                     });
                     mnLoops.add(item);
@@ -381,9 +378,6 @@ public class BlocksFinder {
                 else if (ROIBlock.class.isAssignableFrom(blockClass)) {
                     mnROI.add(menuItem);
                 }
-                else if (IJBlock.class.isAssignableFrom(blockClass)) {
-                    mnImageJ.add(menuItem);
-                }
                 else if (ToolsBlock.class.isAssignableFrom(blockClass)) {
                     if (blockClass == ReLoop.class)
                         continue; // TODO
@@ -400,7 +394,7 @@ public class BlocksFinder {
                     final ArrayList<BlockAnnotations> blocks = BlockAnnotations.findBlockMethods(clazz);
 
                     for (final BlockAnnotations annotatedMethod : blocks) {
-                        final IcyMenuItem item2 = new IcyMenuItem(clazz.getSimpleName() + "." + annotatedMethod.getName());
+                        final JMenuItem item2 = new JMenuItem(clazz.getSimpleName() + "." + annotatedMethod.getName());
                         item2.setToolTipText(annotatedMethod.getDescription());
                         item2.addActionListener(e -> addBlock(workFlowPane, annotatedMethod.createBlock(), location));
                         mnBlocks.add(item2);
@@ -418,7 +412,6 @@ public class BlocksFinder {
         splitLongMenus(mnSeq, 15);
         splitLongMenus(mnROI, 15);
         splitLongMenus(mnIO, 15);
-        splitLongMenus(mnImageJ, 15);
         splitLongMenus(mnLoops, 15);
         splitLongMenus(mnTools, 15);
 
@@ -428,19 +421,18 @@ public class BlocksFinder {
         menuContainer.add(mnSeq);
         menuContainer.add(mnROI);
         menuContainer.add(mnIO);
-        menuContainer.add(mnImageJ);
         menuContainer.add(mnLoops);
         menuContainer.add(mnTools);
 
         // and add the Display block last
 
-        final IcyMenuItem mnDisp = new IcyMenuItem("Display", GoogleMaterialDesignIcons.VISIBILITY);
+        final IcyMenuItem mnDisp = new IcyMenuItem("Display", SVGIcon.VISIBILITY);
         mnDisp.addActionListener(arg0 -> {
             try {
                 addBlock(workFlowPane, Display.class.getDeclaredConstructor().newInstance(), location);
             }
             catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e1) {
-                e1.printStackTrace();
+                IcyLogger.error(BlocksFinder.class, e1, e1.getLocalizedMessage());
             }
         });
         //mnDisp.setIcon(new IcyIcon(ImageUtil.scaleQuality(ResourceUtil.getAlphaIconAsImage("eye_open.png"), 22, 22)));
@@ -535,7 +527,7 @@ public class BlocksFinder {
                     workFlowPane.embedWorkFlow(plugin.getPluginClass().asSubclass(WorkFlow.class));
                 }
                 catch (final Exception e) {
-                    e.printStackTrace();
+                    IcyLogger.error(BlocksFinder.class, e, e.getLocalizedMessage());
                 }
             });
             menuContainer.add(menuItem);
@@ -566,17 +558,17 @@ public class BlocksFinder {
 
             JMenu currentMenu = menu;
 
-            while (components.size() > 0) {
+            while (!components.isEmpty()) {
                 final int n = Math.min(components.size(), maxItemsPerMenu - 1);
 
                 for (int i = 0; i < n; i++)
-                    currentMenu.add(components.remove(0));
+                    currentMenu.add(components.removeFirst());
 
-                if (components.size() > 0)
+                if (!components.isEmpty())
                     currentMenu = (JMenu) currentMenu.add(new JMenu("More..."));
             }
 
-            if (components.size() > 0)
+            if (!components.isEmpty())
                 throw new RuntimeException("Error while splitting menus: " + components.size() + " are remaining.");
         }
 
@@ -631,5 +623,4 @@ public class BlocksFinder {
 
         return output.toString();
     }
-
 }
diff --git a/src/main/java/plugins/adufour/blocks/util/BlocksML.java b/src/main/java/plugins/adufour/blocks/util/BlocksML.java
index 58a5e504bb49e435b209cfacf109bfd2d7247b31..11aeec236059c00c2ff27a71cd30e1115ec621b1 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksML.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksML.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,16 +18,15 @@
 
 package plugins.adufour.blocks.util;
 
-import icy.gui.frame.progress.AnnounceFrame;
-import icy.main.Icy;
-import icy.network.NetworkUtil;
-import icy.plugin.*;
-import icy.plugin.interface_.PluginBundled;
-import icy.system.IcyExceptionHandler;
-import icy.system.IcyHandledException;
-import icy.system.thread.ThreadUtil;
-import icy.util.ClassUtil;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.common.reflect.ClassUtil;
+import org.bioimageanalysis.icy.extension.plugin.*;
+import org.bioimageanalysis.icy.extension.plugin.interface_.PluginBundled;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.network.NetworkUtil;
+import org.bioimageanalysis.icy.system.IcyExceptionHandler;
+import org.bioimageanalysis.icy.system.IcyHandledException;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentType;
 import org.w3c.dom.Element;
@@ -231,9 +230,7 @@ public class BlocksML {
             if ((block instanceof InputBlock) || (block instanceof OutputBlock))
                 XMLUtil.setAttributeValue(blockNode, "CommandLineID", blockData.getCommandLineID());
 
-            if (blockData.isWorkFlow() && block instanceof WorkFlow) {
-                final WorkFlow innerWorkFlow = (WorkFlow) block;
-
+            if (blockData.isWorkFlow() && block instanceof final WorkFlow innerWorkFlow) {
                 saveWorkFlow_V4(innerWorkFlow, blockNode);
 
                 final Element varRoot = XMLUtil.addElement(blockNode, "variables");
@@ -243,7 +240,7 @@ public class BlocksML {
                 for (final Var<?> var : blockData.inputVars) {
                     final BlockDescriptor owner = innerWorkFlow.getInputOwner(var);
                     if (owner == null) {
-                        System.err.println("Warning: could not find owner for input variable: \"" + var + "\", skipping");
+                        IcyLogger.warn(BlocksML.class, "Could not find owner for input variable: \"" + var + "\", skipping.");
                         continue;
                     }
                     final Element varNode = XMLUtil.addElement(inputVarRoot, "variable");
@@ -258,8 +255,7 @@ public class BlocksML {
                 for (final Var<?> var : blockData.outputVars) {
                     final BlockDescriptor owner = innerWorkFlow.getOutputOwner(var);
                     if (owner == null) {
-                        System.err.println(
-                                "Warning: could not find owner for output variable: \"" + var + "\", skipping");
+                        IcyLogger.warn(BlocksML.class, "Could not find owner for output variable: \"" + var + "\", skipping.");
                         continue;
                     }
                     final Element varNode = XMLUtil.addElement(outputVarRoot, "variable");
@@ -366,11 +362,11 @@ public class BlocksML {
 
             // we are live!
             final String message = "[Protocols] Installing required plugins...";
-            System.out.println(message);
-            AnnounceFrame announcement = null;
+            IcyLogger.info(BlocksML.class, message);
+            //AnnounceFrame announcement = null;
 
-            if (!Icy.getMainInterface().isHeadLess())
-                announcement = new AnnounceFrame(message);
+            /*if (!Icy.getMainInterface().isHeadLess())
+                announcement = new AnnounceFrame(message);*/
 
             final Set<PluginDescriptor> descriptors = new HashSet<>(missingPlugins.size());
 
@@ -379,7 +375,7 @@ public class BlocksML {
                 if (pDesc == null) {
                     // sadly, I believe the plugin loader could be reloaded at anytime...
                     // double check that for every plugin, just to be safe
-                    if (PluginLoader.getPlugins(Block.class, true, false, false).isEmpty())
+                    if (PluginLoader.getPlugins(Block.class, false, false).isEmpty())
                         throw new BlocksReloadedException();
 
                     throw new BlocksException("Couldn't find plugin " + ClassUtil.getSimpleClassName(className) + " online", true);
@@ -393,9 +389,9 @@ public class BlocksML {
             PluginInstaller.waitInstall();
             PluginLoader.waitWhileLoading();
 
-            System.out.println("[Protocols] Plugins installed successfully.");
-            if (announcement != null)
-                announcement.close();
+            IcyLogger.info(BlocksML.class, "[Protocols] Plugins installed successfully.");
+            /*if (announcement != null)
+                announcement.close();*/
 
             // reload the whole mother!
             throw new BlocksReloadedException();
@@ -839,7 +835,7 @@ public class BlocksML {
      * @throws BlocksException If an error occurs while loading the workflow.
      */
     public synchronized void loadWorkFlow_V4(final Element workFlowRoot, final WorkFlow workFlow) throws BlocksException {
-        boolean hasWarnings = false;
+        //boolean hasWarnings = false;
 
         // Prepare a list of blocks to collapse after loading
         final ArrayList<BlockDescriptor> blocksToCollapse = new ArrayList<>();
@@ -914,7 +910,7 @@ public class BlocksML {
                         final Var<?> var = blockDescriptor.inputVars.get(uid);
 
                         if (var == null) {
-                            System.err.println(new NoSuchVariableException(blockDescriptor, uid).getMessage());
+                            IcyLogger.error(BlocksML.class, new NoSuchVariableException(blockDescriptor, uid), "Error while loading protocol.");
                             continue;
                         }
 
@@ -928,11 +924,11 @@ public class BlocksML {
                                 blockDescriptor.inputVars.setVisible(var, visible);
                             }
                             catch (final NoSuchVariableException e) {
-                                if (!hasWarnings) {
+                                /*if (!hasWarnings) {
                                     System.err.println("Error(s) while loading protocol:");
                                     hasWarnings = true;
-                                }
-                                System.err.println(new NoSuchVariableException(blockDescriptor, uid).getMessage());
+                                }*/
+                                IcyLogger.error(BlocksML.class, new NoSuchVariableException(blockDescriptor, uid), "Error while loading protocol.");
                             }
                         }
                     }
@@ -953,11 +949,11 @@ public class BlocksML {
                             blockDescriptor.outputVars.setVisible(var, visible);
                         }
                         catch (final NoSuchVariableException e) {
-                            if (!hasWarnings) {
+                            /*if (!hasWarnings) {
                                 System.err.println("Error(s) while loading protocol:");
                                 hasWarnings = true;
-                            }
-                            System.err.println(new NoSuchVariableException(blockDescriptor, uid).getMessage());
+                            }*/
+                            IcyLogger.error(BlocksML.class, new NoSuchVariableException(blockDescriptor, uid), "Error while loading protocol.");
                             // throw new NoSuchVariableException(blockInfo, uid);
                         }
                     }
@@ -982,11 +978,11 @@ public class BlocksML {
                                 blockDescriptor.inputVars.addRuntimeVariable(uid, (VarMutable) var);
                             }
                             else {
-                                if (!hasWarnings) {
+                                /*if (!hasWarnings) {
                                     System.err.println("Error(s) while loading protocol:");
                                     hasWarnings = true;
-                                }
-                                System.err.println(new NoSuchVariableException(blockDescriptor, uid).getMessage());
+                                }*/
+                                IcyLogger.error(BlocksML.class, new NoSuchVariableException(blockDescriptor, uid), "Error while loading protocol.");
                                 continue;
                                 // throw new NoSuchVariableException(blockInfo, uid);
                             }
@@ -1032,8 +1028,7 @@ public class BlocksML {
                             message += "Reason: " + e.getClass().getName() + " (" + e.getMessage() + ")";
                             throw new BlocksException(message, true);
                         }
-                        blockDescriptor.inputVars.setVisible(var,
-                                XMLUtil.getAttributeBooleanValue(varNode, "visible", false));
+                        blockDescriptor.inputVars.setVisible(var, XMLUtil.getAttributeBooleanValue(varNode, "visible", false));
                     }
                 }
 
@@ -1054,18 +1049,17 @@ public class BlocksML {
                                 blockDescriptor.outputVars.addRuntimeVariable(uid, (VarMutable) var);
                             }
                             else {
-                                if (!hasWarnings) {
+                                /*if (!hasWarnings) {
                                     System.err.println("Error(s) while loading protocol:");
                                     hasWarnings = true;
-                                }
-                                System.err.println(new NoSuchVariableException(blockDescriptor, uid).getMessage());
+                                }*/
+                                IcyLogger.error(BlocksML.class, new NoSuchVariableException(blockDescriptor, uid), "Error while loading protocol.");
                                 continue;
                                 // throw new NoSuchVariableException(blockInfo, uid);
                             }
                         }
 
-                        blockDescriptor.outputVars.setVisible(var,
-                                XMLUtil.getAttributeBooleanValue(varNode, "visible", false));
+                        blockDescriptor.outputVars.setVisible(var, XMLUtil.getAttributeBooleanValue(varNode, "visible", false));
 
                         if (var instanceof MutableType)
                             try {
@@ -1073,8 +1067,7 @@ public class BlocksML {
                                 if (type != null) {
                                     if (var instanceof VarMutable) {
                                         final Class<?> mutableType = getPrimitiveType(type);
-                                        ((MutableType) var)
-                                                .setType(mutableType != null ? mutableType : Class.forName(type));
+                                        ((MutableType) var).setType(mutableType != null ? mutableType : Class.forName(type));
                                     }
                                     else if (var instanceof VarMutableArray) {
                                         ((MutableType) var).setType(Class.forName("[L" + type + ";"));
@@ -1082,8 +1075,7 @@ public class BlocksML {
                                 }
                             }
                             catch (final ClassNotFoundException e) {
-                                String message = "Unable to read output variable \"" + var.getName() + "\" in block \""
-                                        + blockDescriptor.getDefinedName() + "\".\n";
+                                String message = "Unable to read output variable \"" + var.getName() + "\" in block \"" + blockDescriptor.getDefinedName() + "\".\n";
                                 message += "Reason: " + e.getClass().getName() + " (" + e.getMessage() + ")";
                                 throw new BlocksException(message, true);
                             }
@@ -1125,8 +1117,7 @@ public class BlocksML {
                 srcVar = srcBlock.inputVars.get(srcVarID);
 
             if (srcVar == null) {
-                System.err.println("Cannot create a link from variable " + srcVarID + " (from block " + srcBlock
-                        + "). It may have been removed or renamed.");
+                IcyLogger.warn(BlocksML.class, "Cannot create a link from variable " + srcVarID + " (from block " + srcBlock + "). It may have been removed or renamed.");
                 continue;
             }
 
@@ -1155,8 +1146,7 @@ public class BlocksML {
             final Var<Object> dstVar = dstBlock.inputVars.get(dstVarID);
 
             if (dstVar == null) {
-                System.err.println("Cannot link to variable " + dstVarID + " (from block " + dstBlock
-                        + "). It may have been removed or renamed.");
+                IcyLogger.warn(BlocksML.class, "Cannot link to variable " + dstVarID + " (from block " + dstBlock + "). It may have been removed or renamed.");
                 continue;
             }
 
@@ -1167,12 +1157,12 @@ public class BlocksML {
         for (final BlockDescriptor block : blocksToCollapse)
             block.setCollapsed(true);
 
-        if (hasWarnings)
-            System.err.println("--");
+        /*if (hasWarnings)
+            System.err.println("--");*/
     }
 
     public synchronized void loadWorkFlow_V5(final Element workFlowRoot, final WorkFlow workFlow, final WorkFlow parentFlow) throws BlocksException {
-        boolean noWarnings = true;
+        //boolean noWarnings = true;
 
         final Element blocksRoot = XMLUtil.getElement(workFlowRoot, "blocks");
 
@@ -1180,7 +1170,8 @@ public class BlocksML {
 
         for (final Element blockNode : blocksNode) {
             final BlockDescriptor blockDesc = new BlockDescriptor();
-            noWarnings &= blockDesc.loadFromXML(blockNode);
+            /*noWarnings &= */
+            blockDesc.loadFromXML(blockNode);
             workFlow.addBlock(blockDesc);
         }
 
@@ -1191,8 +1182,8 @@ public class BlocksML {
             link.loadFromXML(linkNode);
         }
 
-        if (!noWarnings)
-            System.err.println("--");
+        /*if (!noWarnings)
+            System.err.println("--");*/
     }
 
     /**
diff --git a/src/main/java/plugins/adufour/blocks/util/BlocksReloadedException.java b/src/main/java/plugins/adufour/blocks/util/BlocksReloadedException.java
index dff6cbbb48985ee79605e5c214c9031327a35087..6f7e6cf96dd36be7e747ce38713273f3cc198c59 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksReloadedException.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksReloadedException.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/adufour/blocks/util/LinkCutException.java b/src/main/java/plugins/adufour/blocks/util/LinkCutException.java
index a28ad893f84130d6ff28a8ab28737f631167ccbf..66d0d57cf49c8c38cd30ded9cbd5df8b7e5b8166 100644
--- a/src/main/java/plugins/adufour/blocks/util/LinkCutException.java
+++ b/src/main/java/plugins/adufour/blocks/util/LinkCutException.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/adufour/blocks/util/LoopException.java b/src/main/java/plugins/adufour/blocks/util/LoopException.java
index ec7141ffa27ca1837ed6fc3be7d858f08c3f6288..a0392d34cc3454788230e81301bfe3e298fcdaa2 100644
--- a/src/main/java/plugins/adufour/blocks/util/LoopException.java
+++ b/src/main/java/plugins/adufour/blocks/util/LoopException.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/adufour/blocks/util/MenuItemListener.java b/src/main/java/plugins/adufour/blocks/util/MenuItemListener.java
index 6e513cc600d1c5d62804fb3682510a08e854fd8c..54076d50d35a64317569cf0c2d85f868e561a5e0 100644
--- a/src/main/java/plugins/adufour/blocks/util/MenuItemListener.java
+++ b/src/main/java/plugins/adufour/blocks/util/MenuItemListener.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,7 +18,7 @@
 
 package plugins.adufour.blocks.util;
 
-import icy.plugin.PluginDescriptor;
+import org.bioimageanalysis.icy.extension.plugin.PluginDescriptor;
 
 public interface MenuItemListener {
     void displayDoc(PluginDescriptor d);
diff --git a/src/main/java/plugins/adufour/blocks/util/NoSuchBlockException.java b/src/main/java/plugins/adufour/blocks/util/NoSuchBlockException.java
index 61fb9214a510a9e4fc8ec8a37bfb825fea846caa..fb43b5b192dfc2a3e32c388aa5967b0f26abe80e 100644
--- a/src/main/java/plugins/adufour/blocks/util/NoSuchBlockException.java
+++ b/src/main/java/plugins/adufour/blocks/util/NoSuchBlockException.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/adufour/blocks/util/NoSuchLinkException.java b/src/main/java/plugins/adufour/blocks/util/NoSuchLinkException.java
index 03fe3021d5b53a70d1a5b792b7113fe58d4a5975..e415cbadf4c664ad578e99962bd9a6c2f974fdb0 100644
--- a/src/main/java/plugins/adufour/blocks/util/NoSuchLinkException.java
+++ b/src/main/java/plugins/adufour/blocks/util/NoSuchLinkException.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/adufour/blocks/util/NoSuchVariableException.java b/src/main/java/plugins/adufour/blocks/util/NoSuchVariableException.java
index 30b214c14e62eb0f744d63156b426c5794e8a91b..f708850983f020bbb7ef5aedd7ffec7a2aa24be2 100644
--- a/src/main/java/plugins/adufour/blocks/util/NoSuchVariableException.java
+++ b/src/main/java/plugins/adufour/blocks/util/NoSuchVariableException.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/adufour/blocks/util/ScopeException.java b/src/main/java/plugins/adufour/blocks/util/ScopeException.java
index 53a42971723866a1075637b8261a9f5f5a2ed506..529b9adf46f75e13a50042f771523d494054220a 100644
--- a/src/main/java/plugins/adufour/blocks/util/ScopeException.java
+++ b/src/main/java/plugins/adufour/blocks/util/ScopeException.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/adufour/blocks/util/StopException.java b/src/main/java/plugins/adufour/blocks/util/StopException.java
index 733e8fee37e9f74275dd95297cf63906fc2da0e5..1812c1f5350e135f3efd335edd2f471e9cfb7af0 100644
--- a/src/main/java/plugins/adufour/blocks/util/StopException.java
+++ b/src/main/java/plugins/adufour/blocks/util/StopException.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/adufour/blocks/util/VarList.java b/src/main/java/plugins/adufour/blocks/util/VarList.java
index 8907e7ae8bff54c0942d2b9e67b7ce803c9ba0fb..c89665c89f662c4bea1aaf4b234b3e4a0bc6b134 100644
--- a/src/main/java/plugins/adufour/blocks/util/VarList.java
+++ b/src/main/java/plugins/adufour/blocks/util/VarList.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/adufour/blocks/util/VarListListener.java b/src/main/java/plugins/adufour/blocks/util/VarListListener.java
index 6338905045a2aa718edc98c1cb6591f4c468abb1..735df5f6c0460b51ec24f676c103e0698dbaf9fb 100644
--- a/src/main/java/plugins/adufour/blocks/util/VarListListener.java
+++ b/src/main/java/plugins/adufour/blocks/util/VarListListener.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/adufour/blocks/util/VarVisibilityListener.java b/src/main/java/plugins/adufour/blocks/util/VarVisibilityListener.java
index 3fedb9d1a00f2908ec0cf1bbfe9a51f2437341ea..04b8357a12fd32c61da1118af430aa78e448b708 100644
--- a/src/main/java/plugins/adufour/blocks/util/VarVisibilityListener.java
+++ b/src/main/java/plugins/adufour/blocks/util/VarVisibilityListener.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/adufour/blocks/util/WorkFlowListener.java b/src/main/java/plugins/adufour/blocks/util/WorkFlowListener.java
index 5de1a9bc7776f3d8c35e7582d0f70c2b8c995566..8a54e281134661017d2d2b1b9ffffa688b6c467a 100644
--- a/src/main/java/plugins/adufour/blocks/util/WorkFlowListener.java
+++ b/src/main/java/plugins/adufour/blocks/util/WorkFlowListener.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/adufour/protocols/ProtocolImporter.java b/src/main/java/plugins/adufour/protocols/ProtocolImporter.java
index f1e0150a9a0ca10ae5c2f4823291a77eb5ff3964..583571378c531cc4b897311e68c8a7a63bbc7377 100644
--- a/src/main/java/plugins/adufour/protocols/ProtocolImporter.java
+++ b/src/main/java/plugins/adufour/protocols/ProtocolImporter.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,10 +18,12 @@
 
 package plugins.adufour.protocols;
 
-import icy.file.FileImporter;
-import icy.gui.frame.progress.FileFrame;
-import icy.plugin.abstract_.Plugin;
-import icy.system.thread.ThreadUtil;
+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.bioimageanalysis.icy.gui.frame.progress.FileFrame;
+import org.bioimageanalysis.icy.io.FileImporter;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 
 import javax.swing.filechooser.FileFilter;
 import java.io.File;
@@ -32,6 +34,7 @@ import java.util.List;
  *
  * @author Alexandre Dufour
  */
+@IcyPluginName("Protocol Importer")
 public class ProtocolImporter extends Plugin implements FileImporter {
     @Override
     public boolean acceptFile(final String path) {
diff --git a/src/main/java/plugins/adufour/protocols/Protocols.java b/src/main/java/plugins/adufour/protocols/Protocols.java
index 726b9023ffec13368c6303ada06a27cc8e16964e..a765bf08981048d08de3cbf3c49547d89b20ddb9 100644
--- a/src/main/java/plugins/adufour/protocols/Protocols.java
+++ b/src/main/java/plugins/adufour/protocols/Protocols.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,15 +18,18 @@
 
 package plugins.adufour.protocols;
 
-import icy.common.Version;
-import icy.file.FileUtil;
-import icy.main.Icy;
-import icy.plugin.PluginLoader;
-import icy.plugin.abstract_.PluginActionable;
-import icy.preferences.PluginsPreferences;
-import icy.preferences.XMLPreferences;
-import icy.system.thread.ThreadUtil;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.common.Version;
+import org.bioimageanalysis.icy.extension.plugin.PluginLoader;
+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.io.FileUtil;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.bioimageanalysis.icy.system.preferences.PluginsPreferences;
+import org.bioimageanalysis.icy.system.preferences.XMLPreferences;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -53,7 +56,11 @@ import java.util.Map;
 /**
  * Protocols plugin
  */
+@IcyPluginName("Protocols")
+@IcyPluginIcon(path = "/protocols.svg")
 public class Protocols extends PluginActionable {
+    public static final Version VERSION = new Version(4, 0, 0);
+
     // "command" on Mac, "ctrl" on others
     public static final int MENU_SHORTCUT_KEY;
 
@@ -67,8 +74,7 @@ public class Protocols extends PluginActionable {
 
     private static boolean reloading = false;
 
-    public static final String downloadedProtocolFolder = FileUtil.getApplicationDirectory() + File.separator
-            + "protocols";
+    public static final String downloadedProtocolFolder = FileUtil.getApplicationDirectory() + File.separator + "protocols";
 
     private static final XMLPreferences preferences = PluginsPreferences.getPreferences().node(Protocols.class.getName());
 
@@ -109,8 +115,7 @@ public class Protocols extends PluginActionable {
      */
     public void reload(final Document reloadingXML, final String reloadingPath) {
         // 0) avoid silly situations...
-        if (mainFrame == null)
-            return;
+        if (mainFrame == null) return;
 
         reloading = true;
 
@@ -137,19 +142,16 @@ public class Protocols extends PluginActionable {
                 final XMLPreferences node = preferences.node("Protocol #" + counter++);
                 node.putBoolean("dirty", protocol.isDirty());
                 node.put("xml", xmlProtocol);
-                if (attachedFile != null)
-                    node.put("fileName", attachedFile.getAbsolutePath());
+                if (attachedFile != null) node.put("fileName", attachedFile.getAbsolutePath());
             }
             catch (final TransformerException e) {
-                System.err.println("Warning: couldn't store protocol " + protocol.getName() + ":");
-                e.printStackTrace();
-                System.err.println("---");
+                IcyLogger.warn(Protocols.class, e, "Couldn't store protocol " + protocol.getName() + ".");
             }
         }
 
         // 2) close the current Protocols instance
 
-        close();
+        closeProtocols();
 
         ThreadUtil.invokeLater(() -> {
             // 3) launch a new instance of the Protocols plug-in
@@ -157,7 +159,7 @@ public class Protocols extends PluginActionable {
                 ((PluginActionable) PluginLoader.getPluginClass(Protocols.class.getName()).getDeclaredConstructor().newInstance()).run();
             }
             catch (final Exception e) {
-                e.printStackTrace();
+                IcyLogger.error(Protocols.class, e, e.getLocalizedMessage());
             }
         });
     }
@@ -197,8 +199,7 @@ public class Protocols extends PluginActionable {
                 final Document xml = XMLUtil.loadDocument(protocolPath);
 
                 // Discard invalid files
-                if (xml != null)
-                    panel.setFile(new File(protocolPath));
+                if (xml != null) panel.setFile(new File(protocolPath));
 
                 mainFrame.addProtocolPane(panel);
 
@@ -211,7 +212,7 @@ public class Protocols extends PluginActionable {
                         return;
                     }
                     catch (final BlocksException e2) {
-                        e2.printStackTrace();
+                        IcyLogger.error(Protocols.class, e2, e2.getLocalizedMessage());
                     }
                 }
             }
@@ -220,16 +221,14 @@ public class Protocols extends PluginActionable {
                 final ArrayList<XMLPreferences> protocols = preferences.getChildren();
 
                 // no protocol info in XML preference
-                if (protocols.size() == 0)
-                    mainFrame.addProtocolPane(new ProtocolPanel(mainFrame));
+                if (protocols.isEmpty()) mainFrame.addProtocolPane(new ProtocolPanel(mainFrame));
                 else {
                     final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
 
                     for (final XMLPreferences node : preferences.getChildren()) {
                         final ProtocolPanel panel = new ProtocolPanel(mainFrame);
                         final String fileName = node.get("fileName", null);
-                        if (fileName != null)
-                            panel.setFile(new File(fileName));
+                        if (fileName != null) panel.setFile(new File(fileName));
                         mainFrame.addProtocolPane(panel);
 
                         final Document xml = builder.parse(new InputSource(new StringReader(node.get("xml", null))));
@@ -245,14 +244,14 @@ public class Protocols extends PluginActionable {
                             return;
                         }
                         catch (final BlocksException e2) {
-                            e2.printStackTrace();
+                            IcyLogger.error(Protocols.class, e2, e2.getLocalizedMessage());
                         }
                     }
                 }
             }
         }
         catch (final ParserConfigurationException | SAXException | IOException e) {
-            e.printStackTrace();
+            IcyLogger.error(Protocols.class, e, e.getLocalizedMessage());
         }
 
         mainFrame.addToDesktopPane();
@@ -270,8 +269,7 @@ public class Protocols extends PluginActionable {
         for (final String clarg : clargs) {
             // checking sanity
             if (!clarg.contains("=")) {
-                if (verify)
-                    throw new IllegalArgumentException("Invalid command line argument: " + clarg);
+                if (verify) throw new IllegalArgumentException("Invalid command line argument: " + clarg);
 
                 // next arg
                 continue;
@@ -279,8 +277,7 @@ public class Protocols extends PluginActionable {
 
             final String[] keyValuePair = clarg.split("=");
             if (keyValuePair.length != 2) {
-                if (verify)
-                    throw new IllegalArgumentException("Invalid command line argument: " + clarg);
+                if (verify) throw new IllegalArgumentException("Invalid command line argument: " + clarg);
 
                 // next arg
                 continue;
@@ -290,16 +287,14 @@ public class Protocols extends PluginActionable {
             final String value = keyValuePair[1];
 
             if (key.isEmpty()) {
-                if (verify)
-                    throw new IllegalArgumentException("Invalid command line argument (no key): " + clarg);
+                if (verify) throw new IllegalArgumentException("Invalid command line argument (no key): " + clarg);
 
                 // next arg
                 continue;
             }
 
             if (value.isEmpty()) {
-                if (verify)
-                    throw new IllegalArgumentException("Invalid command line argument (no value): " + clarg);
+                if (verify) throw new IllegalArgumentException("Invalid command line argument (no value): " + clarg);
 
                 // next arg
                 continue;
@@ -309,13 +304,11 @@ public class Protocols extends PluginActionable {
                 result = value;
                 ok = true;
             }
-            else
-                commandLineArguments.put(key, value);
+            else commandLineArguments.put(key, value);
         }
 
         // we correctly parsed arguments? --> clear it so no other plugin can reparse them
-        if (ok)
-            Icy.clearCommandLinePluginArgs();
+        if (ok) Icy.clearCommandLinePluginArgs();
 
         return result;
     }
@@ -326,37 +319,28 @@ public class Protocols extends PluginActionable {
         final Document xml = XMLUtil.loadDocument(protocolFile);
 
         // Discard invalid files
-        if (xml == null)
-            throw new IllegalArgumentException(protocolFile + " is not a valid protocol file");
+        if (xml == null) throw new IllegalArgumentException(protocolFile + " is not a valid protocol file");
 
-        System.out.println("Loading workflow...");
+        IcyLogger.info(Protocols.class, "Loading workflow...");
         final WorkFlow workFlow = new WorkFlow(true);
         BlocksML.getInstance().loadWorkFlow(xml, workFlow);
 
         workFlow.run();
     }
 
+    @SuppressWarnings("resource")
     public static void loadWorkFlow(final File file) {
-        if (mainFrame == null)
-            new Protocols().run();
+        if (mainFrame == null) new Protocols().run();
 
         mainFrame.loadWorkFlow(file);
     }
 
-    public static void close() {
-        if (mainFrame != null && mainFrame.isVisible())
-            mainFrame.close();
+    public static void closeProtocols() {
+        if (mainFrame != null && mainFrame.isVisible()) mainFrame.close();
         mainFrame = null;
     }
 
     public static void dispatchEvent(final KeyEvent key) {
-        if (mainFrame != null)
-            mainFrame.getContentPane().dispatchEvent(key);
+        if (mainFrame != null) mainFrame.getContentPane().dispatchEvent(key);
     }
-
-    public String getFriendlyVersion() {
-        final Version v = getDescriptor().getVersion();
-        return "Blocks engine v." + v.getMajor() + "." + v.getMinor();
-    }
-
 }
diff --git a/src/main/java/plugins/adufour/protocols/gui/BlockSearchPanel.java b/src/main/java/plugins/adufour/protocols/gui/BlockSearchPanel.java
index 2e6cb807fef4057cbae8cc13791450b432420fd4..c119dd788bc346b36ee333e3f939a823d6f6cf02 100644
--- a/src/main/java/plugins/adufour/protocols/gui/BlockSearchPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/BlockSearchPanel.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,13 @@
 
 package plugins.adufour.protocols.gui;
 
-import icy.gui.component.IcyTextFieldHint;
-import icy.gui.frame.progress.AnnounceFrame;
-import icy.network.NetworkUtil;
-import icy.plugin.PluginDescriptor;
-import icy.plugin.abstract_.Plugin;
-import icy.util.StringUtil;
-import jiconfont.icons.google_material_design_icons.GoogleMaterialDesignIcons;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.extension.plugin.PluginDescriptor;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.gui.component.field.IcyTextFieldHint;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIcon;
+import org.bioimageanalysis.icy.gui.frame.progress.AnnounceFrame;
+import org.bioimageanalysis.icy.network.NetworkUtil;
 import plugins.adufour.blocks.util.BlocksFinder;
 import plugins.adufour.blocks.util.BlocksFinder.DND_MenuItem;
 import plugins.adufour.blocks.util.MenuItemListener;
@@ -62,7 +62,7 @@ public class BlockSearchPanel extends JPanel implements MenuItemListener {
     private final JScrollPane blockInfoDisplay;
 
     public BlockSearchPanel() {
-        searchField = new IcyTextFieldHint(GoogleMaterialDesignIcons.SEARCH, DEFAULT_SEARCH_TEXT);
+        searchField = new IcyTextFieldHint(SVGIcon.SEARCH, DEFAULT_SEARCH_TEXT);
         final Box searchBar = Box.createHorizontalBox();
 
         finder = new BlocksFinder();
@@ -175,7 +175,7 @@ public class BlockSearchPanel extends JPanel implements MenuItemListener {
 
         String name = d.getName();
         final StringBuilder description = new StringBuilder("<h3>Public description:</h3>");
-        String author = d.getAuthor();
+        final String author = d.getAuthor();
 
         // if (_class.isAnnotationPresent(BlockSearchAnnotation.class))
         // {
diff --git a/src/main/java/plugins/adufour/protocols/gui/MainFrame.java b/src/main/java/plugins/adufour/protocols/gui/MainFrame.java
index a863ffbadfc123a23265efa9c7679a29a75c271d..5949d1a19f318c83ea449cc1d0cddf3cd93f71e8 100644
--- a/src/main/java/plugins/adufour/protocols/gui/MainFrame.java
+++ b/src/main/java/plugins/adufour/protocols/gui/MainFrame.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,27 +18,27 @@
 
 package plugins.adufour.protocols.gui;
 
-import icy.common.listener.AcceptListener;
-import icy.file.Loader;
-import icy.gui.component.CloseableTabbedPane;
-import icy.gui.component.CloseableTabbedPane.CloseableTabbedPaneListener;
-import icy.gui.component.button.IcyButton;
-import icy.gui.component.button.IcyToggleButton;
-import icy.gui.frame.IcyFrame;
-import icy.gui.frame.IcyFrameEvent;
-import icy.gui.frame.IcyFrameListener;
-import icy.gui.frame.progress.AnnounceFrame;
-import icy.main.Icy;
-import icy.plugin.PluginDescriptor;
-import icy.plugin.PluginInstaller;
-import icy.plugin.PluginLoader;
-import icy.system.FileDrop;
-import icy.system.FileDrop.FileDropListener;
-import icy.system.IcyExceptionHandler;
-import icy.system.IcyHandledException;
-import icy.system.thread.ThreadUtil;
-import icy.util.XMLUtil;
-import jiconfont.icons.google_material_design_icons.GoogleMaterialDesignIcons;
+import org.bioimageanalysis.icy.Icy;
+import org.bioimageanalysis.icy.common.listener.AcceptListener;
+import org.bioimageanalysis.icy.extension.plugin.PluginDescriptor;
+import org.bioimageanalysis.icy.extension.plugin.PluginInstaller;
+import org.bioimageanalysis.icy.extension.plugin.PluginLoader;
+import org.bioimageanalysis.icy.gui.component.button.IcyButton;
+import org.bioimageanalysis.icy.gui.component.button.IcyToggleButton;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIcon;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIconPack;
+import org.bioimageanalysis.icy.gui.component.tabbedpane.CloseableTabbedPane;
+import org.bioimageanalysis.icy.gui.frame.IcyFrame;
+import org.bioimageanalysis.icy.gui.frame.IcyFrameEvent;
+import org.bioimageanalysis.icy.gui.frame.IcyFrameListener;
+import org.bioimageanalysis.icy.gui.frame.progress.AnnounceFrame;
+import org.bioimageanalysis.icy.io.Loader;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.system.FileDrop;
+import org.bioimageanalysis.icy.system.IcyExceptionHandler;
+import org.bioimageanalysis.icy.system.IcyHandledException;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import org.w3c.dom.Document;
 import plugins.adufour.blocks.lang.Block;
 import plugins.adufour.blocks.lang.BlockDescriptor;
@@ -69,18 +69,18 @@ import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
 
-public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListener, CloseableTabbedPaneListener, AcceptListener, ChangeListener, BlockListener, FileDropListener {
+public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListener, CloseableTabbedPane.CloseableTabbedPaneListener, AcceptListener, ChangeListener, BlockListener, FileDrop.FileDropListener {
     private static final String UNTITLED = "untitled";
 
     private final JToolBar toolBar;
 
-    private final IcyButton bNew = new IcyButton("New", GoogleMaterialDesignIcons.NOTE_ADD);
-    private final IcyButton bLoad = new IcyButton("Load", GoogleMaterialDesignIcons.FOLDER_OPEN);
-    private final IcyButton bSave = new IcyButton("Save", GoogleMaterialDesignIcons.SAVE);
-    private final IcyButton bSaveAs = new IcyButton("Save as", GoogleMaterialDesignIcons.FILE_DOWNLOAD);
-    private final IcyButton bEmbed = new IcyButton("Embed", GoogleMaterialDesignIcons.OPEN_IN_NEW);
-    private final IcyToggleButton bRun = new IcyToggleButton("Run", GoogleMaterialDesignIcons.PLAY_ARROW, GoogleMaterialDesignIcons.STOP);
-    private final IcyButton bClean = new IcyButton("Reset", GoogleMaterialDesignIcons.RESTORE);
+    private final IcyButton bNew = new IcyButton("New", SVGIcon.NOTE_ADD);
+    private final IcyButton bLoad = new IcyButton("Load", SVGIcon.FOLDER_OPEN);
+    private final IcyButton bSave = new IcyButton("Save", SVGIcon.SAVE);
+    private final IcyButton bSaveAs = new IcyButton("Save as", SVGIcon.SAVE_AS);
+    private final IcyButton bEmbed = new IcyButton("Embed", SVGIcon.OPEN_IN_NEW);
+    private final IcyToggleButton bRun = new IcyToggleButton("Run", new SVGIconPack(SVGIcon.PLAY_CIRCLE, SVGIcon.STOP_CIRCLE));
+    private final IcyButton bClean = new IcyButton("Reset", SVGIcon.DEVICE_RESET);
 
     private final CloseableTabbedPane closeableTabbedPane = new CloseableTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
 
@@ -103,7 +103,8 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
     private boolean isFrameClosing = false;
 
     public MainFrame(final Protocols pluginInstance) {
-        super("Protocols editor (" + pluginInstance.getFriendlyVersion() + ")", true, true, true, true, true);
+        //super("Protocols editor (" + pluginInstance.getFriendlyVersion() + ")", true, true, true, true, true);
+        super("Protocols editor", true, true, true, true, true);
 
         this.pluginInstance = pluginInstance;
 
@@ -193,6 +194,12 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
             }
         });
 
+        final JToolBar statusBar = new JToolBar(JToolBar.HORIZONTAL);
+        statusBar.setFloatable(false);
+        statusBar.add(new JLabel("Engine v" + Protocols.VERSION.toShortString()));
+
+        getContentPane().add(statusBar, BorderLayout.SOUTH);
+
         Icy.getMainInterface().addCanExitListener(this);
 
         pack();
@@ -245,7 +252,7 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
             @SuppressWarnings("rawtypes") final Link clone = linkClone(wf, l);
 
             if (clone == null) {
-                System.err.println("Warning: cannot copy a link to an exposed variable");
+                IcyLogger.warn(MainFrame.class, "Cannot copy a link to an exposed variable.");
                 continue;
             }
 
@@ -549,9 +556,9 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
                 PluginInstaller.waitInstall();
                 PluginLoader.waitWhileLoading();
 
-                final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, true, false, false);
+                final ArrayList<PluginDescriptor> plugins = PluginLoader.getPlugins(Block.class, false, false);
 
-                if (plugins.size() == 0)
+                if (plugins.isEmpty())
                     throw new BlocksReloadedException();
 
                 panel.loadWorkFlow(xml, false);
@@ -580,7 +587,7 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
                                 message += "\n\n" + BlocksML.getInstance().toString(xml);
                             }
                             catch (final TransformerFactoryConfigurationError | TransformerException e2) {
-                                e2.printStackTrace();
+                                IcyLogger.error(MainFrame.class, e2, e2.getLocalizedMessage());
                             }
 
                             //$FALL-THROUGH$ Send the report anyway
@@ -694,7 +701,7 @@ public class MainFrame extends IcyFrame implements IcyFrameListener, ActionListe
 
         Icy.getMainInterface().removeCanExitListener(this);
 
-        Protocols.close();
+        Protocols.closeProtocols();
 
         return true;
     }
diff --git a/src/main/java/plugins/adufour/protocols/gui/ProtocolPanel.java b/src/main/java/plugins/adufour/protocols/gui/ProtocolPanel.java
index 9509ea2e8f0208a431d29df36e4928f579892c3a..87e0757207088f7aaaa126f6421ba7e6817e8093 100644
--- a/src/main/java/plugins/adufour/protocols/gui/ProtocolPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/ProtocolPanel.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
@@ -19,13 +19,13 @@
 package plugins.adufour.protocols.gui;
 
 import com.ochafik.io.JTextAreaOutputStream;
-import icy.file.FileUtil;
-import icy.file.Saver;
-import icy.gui.component.button.IcyToggleButton;
-import icy.image.IcyBufferedImage;
-import icy.image.IcyBufferedImageUtil;
-import icy.system.IcyHandledException;
-import icy.system.thread.ThreadUtil;
+import org.bioimageanalysis.icy.gui.component.button.IcyToggleButton;
+import org.bioimageanalysis.icy.io.FileUtil;
+import org.bioimageanalysis.icy.io.Saver;
+import org.bioimageanalysis.icy.model.image.IcyBufferedImage;
+import org.bioimageanalysis.icy.model.image.IcyBufferedImageUtil;
+import org.bioimageanalysis.icy.system.IcyHandledException;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import org.w3c.dom.Document;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
diff --git a/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java b/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java
index ffa0beda2422014773dd46ee8513a9bbaaa15030..5c84d9fcae36f805fded7d9c9c3fcc1a3218ebcf 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.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,12 @@
 
 package plugins.adufour.protocols.gui.block;
 
-import icy.gui.component.button.IcyButton;
-import icy.gui.component.menu.IcyMenuItem;
-import icy.gui.util.LookAndFeelUtil;
-import icy.system.thread.ThreadUtil;
-import jiconfont.icons.google_material_design_icons.GoogleMaterialDesignIcons;
-import jiconfont.swing.IconFontSwing;
+import org.bioimageanalysis.icy.gui.LookAndFeelUtil;
+import org.bioimageanalysis.icy.gui.component.button.IcyButton;
+import org.bioimageanalysis.icy.gui.component.icon.IcySVGImageIcon;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIcon;
+import org.bioimageanalysis.icy.gui.component.menu.IcyMenuItem;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
 import plugins.adufour.blocks.lang.WorkFlow;
@@ -45,6 +45,7 @@ import javax.swing.event.MouseInputListener;
 import java.awt.*;
 import java.awt.event.*;
 import java.util.HashMap;
+import java.util.Objects;
 
 public class BlockPanel extends JPanel implements ActionListener, BlockListener {
     private final class BlockMotionManager implements MouseInputListener {
@@ -242,48 +243,45 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
 
     protected static final int ARC_SIZE = 10;
 
-    //@Deprecated
-    //protected static final int ICON_SIZE = 16;
-    protected static final int ICON_SIZE = LookAndFeelUtil.getDefaultIconSizeAsInt();
+    protected static final int ICON_SIZE = LookAndFeelUtil.getDefaultIconSize();
 
+    @SuppressWarnings("resource")
     private static final Image BLOCKS = new Protocols().getDescriptor().getIconAsImage();
     private static final ImageIcon ICON_BLOCKS = new ImageIcon(BLOCKS.getScaledInstance(ICON_SIZE, ICON_SIZE, Image.SCALE_SMOOTH));
 
-    private static final float ICON_SIZE_F = LookAndFeelUtil.getDefaultIconSizeAsFloat();
-
     /**
      * Indicates that the block is dirty (results aren't ready)
      */
-    private static final ImageIcon ICON_DIRTY = new ImageIcon(IconFontSwing.buildImage(GoogleMaterialDesignIcons.WARNING, ICON_SIZE_F, Color.ORANGE.darker()));
+    private static final ImageIcon ICON_DIRTY = new IcySVGImageIcon(SVGIcon.WARNING, Color.ORANGE.darker());
 
     /**
      * Indicates that the block is currently running
      */
-    private static final ImageIcon ICON_RUNNING = new ImageIcon(IconFontSwing.buildImage(GoogleMaterialDesignIcons.FLASH_ON, ICON_SIZE_F, Color.BLUE.brighter()));
+    private static final ImageIcon ICON_RUNNING = new IcySVGImageIcon(SVGIcon.BOLT, Color.BLUE.brighter());
 
     /**
      * Indicates that the block has finished running (the result is ready)
      */
-    private static final ImageIcon ICON_READY = new ImageIcon(IconFontSwing.buildImage(GoogleMaterialDesignIcons.CHECK_CIRCLE, ICON_SIZE_F, Color.GREEN.darker()));
+    private static final ImageIcon ICON_READY = new IcySVGImageIcon(SVGIcon.CHECK_CIRCLE, Color.GREEN.darker());
 
     /**
      * Indicates that the block generated an error
      */
-    private static final ImageIcon ICON_ERROR = new ImageIcon(IconFontSwing.buildImage(GoogleMaterialDesignIcons.ERROR, ICON_SIZE_F, Color.RED.darker()));
+    private static final ImageIcon ICON_ERROR = new IcySVGImageIcon(SVGIcon.ERROR, Color.RED.darker());
 
     protected final JToolBar toolBar;
 
     protected final JPanel jPanelContent = new JPanel(new GridBagLayout());
 
-    protected final IcyButton bMenu = new IcyButton(ICON_BLOCKS);
-    protected final IcyButton bRunUntilHere = new IcyButton(GoogleMaterialDesignIcons.PLAY_ARROW);
-    protected final IcyButton bID = new IcyButton("");
+    protected final JButton bMenu = new JButton(ICON_BLOCKS);
+    protected final IcyButton bRunUntilHere = new IcyButton(SVGIcon.PLAY_CIRCLE);
+    protected final JButton bID = new JButton("");
     protected final JLabel bStatus = new JLabel(ICON_DIRTY);
     protected final JPopupMenu menu = new JPopupMenu();
     protected final JCheckBox menuKeepResults = new JCheckBox("Remember results");
     // protected final JPanel menuCommandLineID = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-    protected final IcyMenuItem menuCollapse = new IcyMenuItem("Collapse", GoogleMaterialDesignIcons.UNFOLD_LESS);
-    protected final IcyMenuItem menuRemove = new IcyMenuItem("Remove block", GoogleMaterialDesignIcons.DELETE);
+    protected final IcyMenuItem menuCollapse = new IcyMenuItem("Collapse", SVGIcon.UNFOLD_LESS);
+    protected final IcyMenuItem menuRemove = new IcyMenuItem("Remove block", SVGIcon.DELETE);
 
     //private final ShadowRenderer renderer = new ShadowRenderer(SHADOW_SIZE, 0.5f, Color.BLACK);
 
@@ -312,7 +310,7 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
 
     //private final JLabel name;
     private final JTextField name;
-    private final IcyButton btnEdit = new IcyButton(GoogleMaterialDesignIcons.EDIT);
+    private final IcyButton btnEdit = new IcyButton(SVGIcon.EDIT);
 
     private boolean selected = false;
 
@@ -447,7 +445,7 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
         graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
         final boolean isDarkMode = LookAndFeelUtil.isDarkMode();
-        final Color bgcRoot = LookAndFeelUtil.getUIDefaults().getColor("RootPane.background");
+        final Color bgcRoot = Objects.requireNonNull(LookAndFeelUtil.getUIDefaults()).getColor("RootPane.background");
 
         if (bgcRoot == null)
             return;
@@ -727,7 +725,7 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
             fieldID.setToolTipText(tooltip);
             menuCLID.add(fieldID);
 
-            final IcyButton bStoreFieldID = new IcyButton(GoogleMaterialDesignIcons.CHECK);
+            final IcyButton bStoreFieldID = new IcyButton(SVGIcon.CHECK);
             bStoreFieldID.setFlat(true);
             //bStoreFieldID.setFocusable(false);
             //bStoreFieldID.setBorderPainted(false);
diff --git a/src/main/java/plugins/adufour/protocols/gui/block/LoopPanel.java b/src/main/java/plugins/adufour/protocols/gui/block/LoopPanel.java
index 56d71a56c7f77025dfaa382b3e03a1376df6a0b9..19bae04dd5a4859334a694efcfb8082ca13b727e 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/LoopPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/LoopPanel.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
@@ -29,7 +29,6 @@ import javax.swing.*;
 import javax.swing.text.JTextComponent;
 import java.awt.*;
 import java.awt.event.ActionEvent;
-import java.awt.geom.Point2D;
 
 public class LoopPanel extends WorkFlowPanel {
     private final Loop loop;
@@ -47,24 +46,25 @@ public class LoopPanel extends WorkFlowPanel {
 
         // create a special panel to receive the loop variables
         innerLoopPanel = new JPanel(new GridBagLayout()) {
-            @Override
+            /*@Override
             public void paintChildren(final Graphics g) {
                 final Graphics2D g2 = (Graphics2D) g;
 
-                final Point2D p1 = gradient.getPoint1();
-                p1.setLocation(p1.getX() + 1, p1.getY() - 30);
-                g2.setPaint(new GradientPaint(p1, gradient.getColor1(), gradient.getPoint2(), gradient.getColor2()));
-                g2.fillRect(5, 0, getWidth() - 11, getHeight());
-                g2.setPaint(null);
-                g2.setColor(Color.gray);
-                g2.drawLine(15, getHeight() - 1, getWidth() - 6, getHeight() - 1);
-                g2.drawLine(getWidth() - 6, 0, getWidth() - 6, getHeight());
+                //final Point2D p1 = gradient.getPoint1();
+                //p1.setLocation(p1.getX() + 1, p1.getY() - 30);
+                //g2.setPaint(new GradientPaint(p1, gradient.getColor1(), gradient.getPoint2(), gradient.getColor2()));
+                //g2.setColor(getBackground());
+                //g2.fillRect(5, 0, getWidth() - 11, getHeight());
+                //g2.setPaint(null);
+                //g2.setColor(getForeground());
+                //g2.drawLine(15, getHeight() - 1, getWidth() - 6, getHeight() - 1);
+                //g2.drawLine(getWidth() - 6, 0, getWidth() - 6, getHeight());
 
                 super.paintChildren(g2);
-            }
+            }*/
         };
 
-        innerLoopPanel.setOpaque(false);
+        innerLoopPanel.setOpaque(true);
         innerLoopPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 2));
 
         menuStopOnFirstError.addActionListener(this);
@@ -100,8 +100,7 @@ public class LoopPanel extends WorkFlowPanel {
         // add other loop variables
         for (final Var<?> loopVariable : loop.getLoopVariables()) {
             // don't re-draw batch elements again...
-            if (blockDesc.getBlock() instanceof Batch) {
-                final Batch batch = (Batch) blockDesc.getBlock();
+            if (blockDesc.getBlock() instanceof final Batch batch) {
                 if (loopVariable == batch.getBatchSource() || loopVariable == batch.getBatchElement())
                     continue;
             }
diff --git a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java
index f041ab19c12c4e9f047948ca05a604945eb13203..5495cdb240295d79710f10fba2cd0adb0ff0d2b3 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.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,11 +18,12 @@
 
 package plugins.adufour.protocols.gui.block;
 
-import icy.file.FileUtil;
-import icy.file.Loader;
-import icy.file.SequenceFileImporter;
-import icy.gui.dialog.ConfirmDialog;
-import icy.system.thread.ThreadUtil;
+import org.bioimageanalysis.icy.gui.dialog.ConfirmDialog;
+import org.bioimageanalysis.icy.io.FileUtil;
+import org.bioimageanalysis.icy.io.Loader;
+import org.bioimageanalysis.icy.io.SequenceFileImporter;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import plugins.adufour.blocks.lang.*;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
 import plugins.adufour.blocks.util.BlocksFinder;
@@ -276,8 +277,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
             final BlockPanel dstBlockPanel = getBlockPanel(link.dstBlock);
 
             if ((srcBlockPanel == null) || (dstBlockPanel == null)) {
-                System.err.println("Warning: cannot recover link between " + link.srcBlock.getDefinedName()
-                        + " and " + link.dstBlock.getDefinedName() + " !");
+                IcyLogger.warn(WorkFlowContainer.class, "Cannot recover link between " + link.srcBlock.getDefinedName() + " and " + link.dstBlock.getDefinedName() + " !");
             }
             else {
                 linkLines.put(link, new RoundedSquareLine(srcBlockPanel, dstBlockPanel, link));
@@ -456,7 +456,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
             for (final Link<?> l : workFlow.getLinkSelection())
                 workFlow.removeLink(l.dstVar);
             while (!workFlow.getBlockSelection().isEmpty()) {
-                final BlockDescriptor tmp = workFlow.getBlockSelection().get(0);
+                final BlockDescriptor tmp = workFlow.getBlockSelection().getFirst();
                 if (tmp.getBlock() instanceof WorkFlow)
                     ((WorkFlow) tmp.getBlock()).newSelection();
                 workFlow.removeBlock(tmp, true);
@@ -481,7 +481,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
      * @return A rectangle representing the bounds of this container's contents
      */
     public Rectangle getContentsBoundingBox() {
-        if (blockPanels.size() == 0)
+        if (blockPanels.isEmpty())
             return new Rectangle(0, 0, getWidth(), getHeight());
 
         Rectangle bounds = null;
@@ -551,8 +551,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
             g2.setColor(Color.gray);
             g2.setFont(g2.getFont().deriveFont(Font.ITALIC));
             final Rectangle2D r = g2.getFontMetrics().getStringBounds(s, g);
-            g2.drawString(s, (float) (getWidth() / 2 - r.getWidth() / 2),
-                    (float) (getHeight() / 2 + r.getHeight() / 2));
+            g2.drawString(s, (float) (getWidth() / 2 - r.getWidth() / 2), (float) (getHeight() / 2 + r.getHeight() / 2));
         }
 
         for (final Line line : linkLines.values()) {
@@ -569,7 +568,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
         final Line line = linkLines.remove(link);
 
         if (line == null)
-            System.err.println("Warning: missing link, cannot be removed properly");
+            IcyLogger.warn(WorkFlowContainer.class, "Missing link, cannot be removed properly.");
         else
             line.dispose();
 
@@ -708,9 +707,8 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
             dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 
             // quick & easy case first
-            if (t.getTransferData(d[0]) instanceof DND_MenuItem) {
+            if (t.getTransferData(d[0]) instanceof final DND_MenuItem menuItem) {
                 // block coming from the search panel
-                final DND_MenuItem menuItem = (DND_MenuItem) t.getTransferData(d[0]);
                 if (menuItemTransferHandler.canImport(this, d))
                     menuItemTransferHandler.importData(this, menuItem, mouseLocation);
             }
@@ -745,7 +743,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
             }
         }
         catch (final UnsupportedFlavorException | IOException e) {
-            e.printStackTrace();
+            IcyLogger.error(WorkFlowContainer.class, e, e.getLocalizedMessage());
         }
         finally {
             dtde.dropComplete(true);
@@ -769,7 +767,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
                         return true;
             }
             catch (final ClassNotFoundException e) {
-                e.printStackTrace();
+                IcyLogger.error(WorkFlowContainer.class, e, e.getLocalizedMessage());
             }
             return false;
         }
@@ -794,7 +792,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
                           | NoSuchMethodException
                           | InvocationTargetException e
             ) {
-                e.printStackTrace();
+                IcyLogger.error(WorkFlowContainer.class, e, e.getLocalizedMessage());
             }
         }
     }
diff --git a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowPanel.java b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowPanel.java
index 3ecdd15c4e0221fb1dfa211ea439950e8e2ba786..bf4388cff2686351cca057b8ab92e793a6d1e929 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowPanel.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,9 @@
 
 package plugins.adufour.protocols.gui.block;
 
-import icy.gui.component.menu.IcyMenuItem;
-import icy.system.thread.ThreadUtil;
-import jiconfont.icons.google_material_design_icons.GoogleMaterialDesignIcons;
+import org.bioimageanalysis.icy.gui.component.icon.SVGIcon;
+import org.bioimageanalysis.icy.gui.component.menu.IcyMenuItem;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.Link;
 import plugins.adufour.blocks.lang.Loop;
@@ -54,7 +54,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener {
 
     final protected Box varBox;
 
-    protected final IcyMenuItem menuRemoveEnclosure = new IcyMenuItem("Remove block but keep contents", GoogleMaterialDesignIcons.CLOSE);
+    protected final IcyMenuItem menuRemoveEnclosure = new IcyMenuItem("Remove block but keep contents", SVGIcon.CLOSE);
 
     public WorkFlowPanel(final WorkFlowContainer wfPane, final BlockDescriptor blockDesc) {
         super(wfPane, blockDesc);
diff --git a/src/main/java/plugins/adufour/protocols/gui/link/CurvedLine.java b/src/main/java/plugins/adufour/protocols/gui/link/CurvedLine.java
index 9e5b0917439b793e67db99f0c72fdbfa99131adb..231c05bde0af54a4f20f844a5320f729bac77cb8 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/CurvedLine.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/CurvedLine.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/adufour/protocols/gui/link/DragDropZone.java b/src/main/java/plugins/adufour/protocols/gui/link/DragDropZone.java
index 295e806812e1399015f47b34b7c9c2599e8f7721..da03be345408cd2e1a3f8e39026eda23c18ab2ea 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/DragDropZone.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/DragDropZone.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,7 +18,7 @@
 
 package plugins.adufour.protocols.gui.link;
 
-import icy.sequence.Sequence;
+import org.bioimageanalysis.icy.model.sequence.Sequence;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.vars.lang.Var;
@@ -97,8 +97,7 @@ public abstract class DragDropZone extends JButton implements VarListener<Boolea
             dataType = variable.getType();
 
         if (dataType != null) {
-            if (variable instanceof VarGenericArray) {
-                final VarGenericArray<?> array = (VarGenericArray<?>) variable;
+            if (variable instanceof final VarGenericArray<?> array) {
                 dataType = array.getInnerType();
             }
             else if (dataType.isArray()) {
diff --git a/src/main/java/plugins/adufour/protocols/gui/link/DragZone.java b/src/main/java/plugins/adufour/protocols/gui/link/DragZone.java
index 1b8947106cb2362915ebaac43c339eb7fd4b8296..0e06dc3f32a6eae0eb3ea58453117f78f0985714 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/DragZone.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/DragZone.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/adufour/protocols/gui/link/DropZone.java b/src/main/java/plugins/adufour/protocols/gui/link/DropZone.java
index 9c6c8eafee088f6ed38ad1d9f350caf421aa1082..334ff5f2030c05da1c6e3a0df227deaea263d864 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/DropZone.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/DropZone.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,7 @@
 
 package plugins.adufour.protocols.gui.link;
 
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.vars.lang.Var;
@@ -116,7 +117,7 @@ class DropZone<T> extends DragDropZone implements ActionListener, DropTargetList
                 errorPopup.setLocation(location.x + 10, location.y + 20);
                 errorPopup.setVisible(true);
 
-                error.printStackTrace();
+                IcyLogger.error(DropZone.class, error, error.getLocalizedMessage());
             }
         }
     }
@@ -134,8 +135,7 @@ class DropZone<T> extends DragDropZone implements ActionListener, DropTargetList
             e.dropComplete(true);
         }
         catch (final Exception e1) {
-            JOptionPane.showMessageDialog(null, e1.getMessage() + "\n(stack trace will be sent to the console)", "Error", JOptionPane.ERROR_MESSAGE);
-            e1.printStackTrace();
+            IcyLogger.error(DropZone.class, e1, "Error while dropping.");
             e.dropComplete(false);
         }
     }
diff --git a/src/main/java/plugins/adufour/protocols/gui/link/Line.java b/src/main/java/plugins/adufour/protocols/gui/link/Line.java
index 971b9aeb32765bbaab4cfb9ee4fe2e05492bbcd6..bc20f2fc217370086a3e460019400a819e11e5a0 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/Line.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/Line.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,7 +18,7 @@
 
 package plugins.adufour.protocols.gui.link;
 
-import icy.system.thread.ThreadUtil;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import plugins.adufour.blocks.lang.Link;
 import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.protocols.gui.block.BlockPanel;
diff --git a/src/main/java/plugins/adufour/protocols/gui/link/ReLoopLine.java b/src/main/java/plugins/adufour/protocols/gui/link/ReLoopLine.java
index 2cbcc923900a04e4ea4eb2b2fccbcb86527c43b1..8c41d85674fb1e8b7234cc41b05384f9f9a659fb 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/ReLoopLine.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/ReLoopLine.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/adufour/protocols/gui/link/RoundedSquareLine.java b/src/main/java/plugins/adufour/protocols/gui/link/RoundedSquareLine.java
index dd72fa7c3ee16334eb404f48e1aa85249ed9533d..df223ee1b2e71e01a201b71d51827b62f38e5c26 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/RoundedSquareLine.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/RoundedSquareLine.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/adufour/protocols/gui/link/TransferableVar.java b/src/main/java/plugins/adufour/protocols/gui/link/TransferableVar.java
index c3d98a6f8260926c3059b9e4d192e427a8fbbbe2..a72ca177639954d42f3df29426bb32cf3431476a 100644
--- a/src/main/java/plugins/adufour/protocols/gui/link/TransferableVar.java
+++ b/src/main/java/plugins/adufour/protocols/gui/link/TransferableVar.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,7 @@
 
 package plugins.adufour.protocols.gui.link;
 
+import org.jetbrains.annotations.NotNull;
 import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.vars.lang.Var;
 
@@ -48,7 +49,7 @@ public class TransferableVar<T> implements Transferable {
     }
 
     @Override
-    public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException {
+    public @NotNull Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException {
         if (!isDataFlavorSupported(flavor)) throw new UnsupportedFlavorException(flavor);
 
         return this;
diff --git a/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProducer.java b/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProducer.java
index 465e43def83ee6a28939ff588fcdffa591cbd09a..2b55ebbaa6b0eef5ea02e14c0a0e4943ee015266 100644
--- a/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProducer.java
+++ b/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProducer.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,15 +18,15 @@
 
 package plugins.adufour.protocols.livebar;
 
-import icy.network.NetworkUtil;
-import icy.search.OnlineSearchResultProducer;
-import icy.search.SearchResult;
-import icy.search.SearchResultConsumer;
-import icy.search.SearchResultProducer;
-import icy.system.SystemUtil;
-import icy.system.thread.ThreadUtil;
-import icy.util.StringUtil;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.common.string.StringUtil;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.network.NetworkUtil;
+import org.bioimageanalysis.icy.network.search.OnlineSearchResultProducer;
+import org.bioimageanalysis.icy.network.search.SearchResult;
+import org.bioimageanalysis.icy.network.search.SearchResultConsumer;
+import org.bioimageanalysis.icy.network.search.SearchResultProducer;
+import org.bioimageanalysis.icy.system.SystemUtil;
+import org.bioimageanalysis.icy.system.thread.ThreadUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import plugins.adufour.protocols.Protocols;
diff --git a/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProvider.java b/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProvider.java
index 3aac2b7dab2911d36b09dd5b70ddf00a01e2d62c..da5890899dc2072e89fa15fb75e9ec40ebb9aca2 100644
--- a/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProvider.java
+++ b/src/main/java/plugins/adufour/protocols/livebar/OnlineProtocolProvider.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,9 @@
 
 package plugins.adufour.protocols.livebar;
 
-import icy.plugin.abstract_.Plugin;
-import icy.plugin.interface_.PluginSearchProvider;
-import icy.search.SearchResultProducer;
+import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
+import org.bioimageanalysis.icy.extension.plugin.interface_.PluginSearchProvider;
+import org.bioimageanalysis.icy.network.search.SearchResultProducer;
 
 public class OnlineProtocolProvider extends Plugin implements PluginSearchProvider {
     @Override
diff --git a/src/main/java/plugins/adufour/protocols/livebar/ProtocolDescriptor.java b/src/main/java/plugins/adufour/protocols/livebar/ProtocolDescriptor.java
index 186c5efe07ffe728f109c83a294c424fc252b1ea..b1b6e34b8826339d13bc7eb6674aee34f4ad783b 100644
--- a/src/main/java/plugins/adufour/protocols/livebar/ProtocolDescriptor.java
+++ b/src/main/java/plugins/adufour/protocols/livebar/ProtocolDescriptor.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,11 +18,12 @@
 
 package plugins.adufour.protocols.livebar;
 
-import icy.file.FileUtil;
-import icy.file.xml.XMLPersistent;
-import icy.network.NetworkUtil;
-import icy.plugin.PluginLoader;
-import icy.util.XMLUtil;
+import org.bioimageanalysis.icy.extension.plugin.PluginLoader;
+import org.bioimageanalysis.icy.io.FileUtil;
+import org.bioimageanalysis.icy.io.xml.XMLPersistent;
+import org.bioimageanalysis.icy.io.xml.XMLUtil;
+import org.bioimageanalysis.icy.network.NetworkUtil;
+import org.bioimageanalysis.icy.system.logging.IcyLogger;
 import org.w3c.dom.Node;
 import plugins.adufour.protocols.Protocols;
 
@@ -83,7 +84,7 @@ public class ProtocolDescriptor implements XMLPersistent {
             return new File(filePath);
         }
         catch (final IOException e) {
-            e.printStackTrace();
+            IcyLogger.error(ProtocolDescriptor.class, e, e.getLocalizedMessage());
             return null;
         }
     }
@@ -112,5 +113,4 @@ public class ProtocolDescriptor implements XMLPersistent {
     public boolean saveToXML(final Node node) {
         return false;
     }
-
 }
diff --git a/src/main/resources/logo/icysoftware_icon-protocols-sdk.png b/src/main/resources/logo/icysoftware_icon-protocols-sdk.png
deleted file mode 100644
index 21eb08f98fbf3e02dd68e1c96e5f2e435a1ecaaa..0000000000000000000000000000000000000000
Binary files a/src/main/resources/logo/icysoftware_icon-protocols-sdk.png and /dev/null differ
diff --git a/src/main/resources/protocols.svg b/src/main/resources/protocols.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3c778a3fc30f6e3af7bcee5c34db01cdf4d7908e
--- /dev/null
+++ b/src/main/resources/protocols.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg height="800px" width="800px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" xml:space="preserve">
+    <polygon style="fill:#A0161F;" points="130.45,365.714 210.989,438.857 256,438.857 278.506,365.714 256,292.571 210.989,292.571"/>
+    <polygon style="fill:#DD0505;" points="4.899,292.571 4.899,438.857 49.91,438.857 130.45,365.714 49.91,292.571 "/>
+    <polygon style="fill:#DD0505;" points="130.45,365.714 4.899,438.857 130.45,512 152.955,438.857 "/>
+    <polygon style="fill:#E36B6C;" points="256,292.571 175.461,219.429 130.45,219.429 4.899,292.571 130.45,365.714 "/>
+    <polygon style="fill:#A0161F;" points="130.45,365.714 130.45,512 256,438.857 "/>
+    <polygon style="fill:#2A93DF;" points="130.45,73.143 130.45,219.429 175.461,219.429 256,146.286 175.461,73.143 "/>
+    <polygon style="fill:#2A93DF;" points="130.45,219.429 256,292.571 278.506,219.429 256,146.286 	"/>
+    <polygon style="fill:#27C005;" points="301.011,292.571 256,292.571 256,438.857 301.011,438.857 381.55,365.714 	"/>
+    <polygon style="fill:#208D00;" points="507.101,292.571 507.101,438.857 462.09,438.857 381.55,365.714 462.09,292.571 "/>
+    <polygon style="fill:#208D00;" points="381.55,365.714 507.101,438.857 381.55,512 359.045,438.857 "/>
+    <polygon style="fill:#7CD465;" points="256,292.571 336.539,219.429 381.55,219.429 507.101,292.571 381.55,365.714 "/>
+    <polygon style="fill:#27C005;" points="381.55,365.714 381.55,512 256,438.857 "/>
+    <polygon style="fill:#2879C2;" points="381.55,219.429 381.55,73.143 336.539,73.143 256,146.286 336.539,219.429 "/>
+    <polygon style="fill:#6FC3FF;" points="381.55,73.143 256,0 130.45,73.143 256,146.286 "/>
+    <polygon style="fill:#2879C2;" points="256,146.286 256,292.571 381.55,219.429 "/>
+</svg>
\ No newline at end of file