From 2c627994b8f398c3c295955b79f5d3552ede4197 Mon Sep 17 00:00:00 2001
From: Thomas <thomas.musset@pasteur.fr>
Date: Thu, 27 Jun 2024 15:44:19 +0200
Subject: [PATCH] updated pom to v4.0.0-a.1, fix classes accordingly to new
 architecture, replace icon with SVG icon, updated .gitignore

---
 .gitignore                                    |  39 +++++--
 pom.xml                                       |  12 +-
 .../plugins/adufour/blocks/lang/Batch.java    |   2 +-
 .../plugins/adufour/blocks/lang/Block.java    |   3 +-
 .../adufour/blocks/lang/BlockDescriptor.java  |  59 +++++-----
 .../adufour/blocks/lang/FileBatch.java        |   8 +-
 .../plugins/adufour/blocks/lang/Link.java     |   9 +-
 .../plugins/adufour/blocks/lang/Loop.java     |  10 +-
 .../adufour/blocks/lang/RangeLoop.java        |   2 +-
 .../blocks/lang/SequenceFileBatch.java        |   4 +-
 .../blocks/lang/SequenceSeriesBatch.java      |  17 ++-
 .../plugins/adufour/blocks/lang/WorkFlow.java |  24 ++--
 .../adufour/blocks/tools/Accumulator.java     |   5 +-
 .../plugins/adufour/blocks/tools/Display.java |   9 +-
 .../plugins/adufour/blocks/tools/Indexer.java |   4 +-
 .../adufour/blocks/tools/Iterator.java        |   4 +-
 .../adufour/blocks/tools/ListSize.java        |   4 +-
 .../plugins/adufour/blocks/tools/ReLoop.java  |   4 +-
 .../adufour/blocks/tools/ToolsBlock.java      |   2 +-
 .../adufour/blocks/tools/ij/CallIJMacro.java  |  44 --------
 .../adufour/blocks/tools/ij/CallIJPlugin.java |  85 --------------
 .../blocks/tools/ij/GetActiveImagePlus.java   |  50 ---------
 .../adufour/blocks/tools/ij/IJBlock.java      |  29 -----
 .../blocks/tools/ij/ImagePlusToSequence.java  |  55 ---------
 .../blocks/tools/ij/SequenceToImagePlus.java  |  55 ---------
 .../blocks/tools/ij/ShowImagePlus.java        |  42 -------
 .../adufour/blocks/tools/input/Boolean.java   |   4 +-
 .../adufour/blocks/tools/input/Decimal.java   |   4 +-
 .../adufour/blocks/tools/input/Decimals.java  |   4 +-
 .../adufour/blocks/tools/input/File.java      |   4 +-
 .../adufour/blocks/tools/input/Files.java     |   4 +-
 .../adufour/blocks/tools/input/Folder.java    |   4 +-
 .../adufour/blocks/tools/input/Folders.java   |   4 +-
 .../blocks/tools/input/InputBlock.java        |   2 +-
 .../adufour/blocks/tools/input/Integer.java   |   4 +-
 .../adufour/blocks/tools/input/Integers.java  |   4 +-
 .../adufour/blocks/tools/input/Sequence.java  |   6 +-
 .../adufour/blocks/tools/input/Sequences.java |   6 +-
 .../adufour/blocks/tools/input/Text.java      |   4 +-
 .../blocks/tools/io/AppendFilePath.java       |   6 +-
 .../adufour/blocks/tools/io/CreateFile.java   |   6 +-
 .../adufour/blocks/tools/io/CreateFolder.java |   6 +-
 .../adufour/blocks/tools/io/FileToPath.java   |   4 +-
 .../blocks/tools/io/FileToSequence.java       |   8 +-
 .../blocks/tools/io/FilesToSequence.java      |   9 +-
 .../blocks/tools/io/GetSequenceFolder.java    |   6 +-
 .../adufour/blocks/tools/io/IOBlock.java      |   3 +-
 .../adufour/blocks/tools/io/PathToFile.java   |   4 +-
 .../blocks/tools/io/SendToSwimmingPool.java   |   8 +-
 .../blocks/tools/io/SequenceToFile.java       |   6 +-
 .../blocks/tools/output/BooleanOutput.java    |   4 +-
 .../blocks/tools/output/DecimalOutput.java    |   4 +-
 .../blocks/tools/output/DecimalsOutput.java   |   4 +-
 .../blocks/tools/output/FileOutput.java       |   4 +-
 .../blocks/tools/output/FilesOutput.java      |   4 +-
 .../blocks/tools/output/FolderOutput.java     |   4 +-
 .../blocks/tools/output/FoldersOutput.java    |   4 +-
 .../blocks/tools/output/IntegerOutput.java    |   4 +-
 .../blocks/tools/output/IntegersOutput.java   |   4 +-
 .../blocks/tools/output/OutputBlock.java      |   2 +-
 .../blocks/tools/output/SequenceOutput.java   |   6 +-
 .../blocks/tools/output/SequencesOutput.java  |   6 +-
 .../blocks/tools/output/TextOutput.java       |   4 +-
 .../blocks/tools/roi/CropSequenceToROI.java   |  18 +--
 .../adufour/blocks/tools/roi/DilateROI.java   |  21 ++--
 .../adufour/blocks/tools/roi/ErodeROI.java    |  21 ++--
 .../blocks/tools/roi/GetROIFromSequence.java  |   8 +-
 .../adufour/blocks/tools/roi/MergeROI.java    |  12 +-
 .../adufour/blocks/tools/roi/MorphROI.java    |   6 +-
 .../adufour/blocks/tools/roi/ROIBlock.java    |   2 +-
 .../adufour/blocks/tools/roi/SubtractROI.java |   6 +-
 .../blocks/tools/roi/TranslateROI.java        |  12 +-
 .../blocks/tools/sequence/SequenceBlock.java  |   3 +-
 .../tools/sequence/SequenceScreenshot.java    |  12 +-
 .../blocks/tools/sequence/ShowSequence.java   |   6 +-
 .../adufour/blocks/tools/text/AppendText.java |   8 +-
 .../adufour/blocks/util/BlockAnnotations.java |  13 ++-
 .../adufour/blocks/util/BlockListener.java    |   2 +-
 .../adufour/blocks/util/BlocksException.java  |   2 +-
 .../adufour/blocks/util/BlocksFinder.java     |  83 ++++++--------
 .../plugins/adufour/blocks/util/BlocksML.java | 105 ++++++++----------
 .../blocks/util/BlocksReloadedException.java  |   2 +-
 .../adufour/blocks/util/LinkCutException.java |   2 +-
 .../adufour/blocks/util/LoopException.java    |   2 +-
 .../adufour/blocks/util/MenuItemListener.java |   4 +-
 .../blocks/util/NoSuchBlockException.java     |   2 +-
 .../blocks/util/NoSuchLinkException.java      |   2 +-
 .../blocks/util/NoSuchVariableException.java  |   2 +-
 .../adufour/blocks/util/ScopeException.java   |   2 +-
 .../adufour/blocks/util/StopException.java    |   2 +-
 .../plugins/adufour/blocks/util/VarList.java  |   2 +-
 .../adufour/blocks/util/VarListListener.java  |   2 +-
 .../blocks/util/VarVisibilityListener.java    |   2 +-
 .../adufour/blocks/util/WorkFlowListener.java |   2 +-
 .../adufour/protocols/ProtocolImporter.java   |  13 ++-
 .../plugins/adufour/protocols/Protocols.java  | 100 +++++++----------
 .../protocols/gui/BlockSearchPanel.java       |  20 ++--
 .../adufour/protocols/gui/MainFrame.java      |  79 +++++++------
 .../adufour/protocols/gui/ProtocolPanel.java  |  16 +--
 .../protocols/gui/block/BlockPanel.java       |  46 ++++----
 .../protocols/gui/block/LoopPanel.java        |  29 +++--
 .../gui/block/WorkFlowContainer.java          |  34 +++---
 .../protocols/gui/block/WorkFlowPanel.java    |  10 +-
 .../protocols/gui/link/CurvedLine.java        |   2 +-
 .../protocols/gui/link/DragDropZone.java      |   7 +-
 .../adufour/protocols/gui/link/DragZone.java  |   2 +-
 .../adufour/protocols/gui/link/DropZone.java  |   8 +-
 .../adufour/protocols/gui/link/Line.java      |   4 +-
 .../protocols/gui/link/ReLoopLine.java        |   2 +-
 .../protocols/gui/link/RoundedSquareLine.java |   2 +-
 .../protocols/gui/link/TransferableVar.java   |   5 +-
 .../livebar/OnlineProtocolProducer.java       |  20 ++--
 .../livebar/OnlineProtocolProvider.java       |   8 +-
 .../protocols/livebar/ProtocolDescriptor.java |  16 +--
 .../logo/icysoftware_icon-protocols-sdk.png   | Bin 6683 -> 0 bytes
 src/main/resources/protocols.svg              |  18 +++
 116 files changed, 615 insertions(+), 949 deletions(-)
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/CallIJMacro.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/CallIJPlugin.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/GetActiveImagePlus.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/IJBlock.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/ImagePlusToSequence.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/SequenceToImagePlus.java
 delete mode 100644 src/main/java/plugins/adufour/blocks/tools/ij/ShowImagePlus.java
 delete mode 100644 src/main/resources/logo/icysoftware_icon-protocols-sdk.png
 create mode 100644 src/main/resources/protocols.svg

diff --git a/.gitignore b/.gitignore
index 1a26a75..9d5e2ad 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 a1bb3d3..75212a4 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 b0b88c0..b0e01a2 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 933bc58..7a2b6b5 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 2ed032f..c8c4521 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 cdf415b..356ecf8 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 0c8373d..1ed8952 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 fdbcbe2..c471648 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 363cd46..254b7a1 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 a35621a..707f59a 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 df3eb2b..e0bb3d7 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 47b04f3..b7be8a6 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 90b6336..6755e81 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 6fec431..4bc82e1 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 1f07fba..228218e 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 24aa0b3..9ea12b0 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 1c32e4c..b49101b 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 74af8ef..7af37b5 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 e1888ff..631d1ee 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 25c4dc3..0000000
--- 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 d98232c..0000000
--- 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 72b82b3..0000000
--- 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 9cac90e..0000000
--- 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 91af54a..0000000
--- 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 cb8c97f..0000000
--- 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 fe3314a..0000000
--- 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 13dbfd7..1ad2592 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 3ccdbb6..f0912ef 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 0a724d1..6139ba1 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 5c4140f..400058f 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 43dc147..4d0760e 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 5a96c27..ec80e2e 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 0a390ef..8b49e0b 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 e8ba5a3..7599fa0 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 9fc5b59..53b76fb 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 fb97208..994fc22 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 9e9f9fa..95ae602 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 6395bfe..5ea4524 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 7d74e34..075d276 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 c55616a..9e3eef5 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 f0ccb87..abc30a2 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 d3f5394..5644d83 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 c12a94e..e8bc94c 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 5c08e27..126b868 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 831aa2b..0aa810e 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 0c22f94..32be0ce 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 d9c51cd..41d4a31 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 255d258..a5f6754 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 bbb265f..da2968f 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 b204e52..4208f3c 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 8aacf28..09f12b8 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 73869f3..f85d478 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 063e9a0..c3955ef 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 abb7aea..b891cca 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 078f130..f2f85fa 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 7aba8f6..c20fdf2 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 34da2c1..15231bd 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 7373642..2dfad0c 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 63d5456..c1d24a4 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 ee2ff64..f84acb3 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 7ffa75b..986420b 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 a9e18ab..e4b2b3e 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 773df19..75e6cec 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 06dc8e5..48139e7 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 fe94702..9c87507 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 53fdc2a..bdfc66f 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 c2d502a..477ec74 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 640940b..5bd2159 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 b1dc9df..18c5e53 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 5c7ccfe..a08140b 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 ac46a4a..8beca1b 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 9d5a1bf..5695299 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 81b2fa1..1ce61fd 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 e04cb02..3f2cee6 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 756c6e5..27aa8e5 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 cb77da2..01a6c81 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 9c0ae85..264f2db 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 7baf435..e542459 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 9d99199..ed58ea8 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 d66aa96..9db8e16 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 58a5e50..11aeec2 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 dff6cbb..6f7e6cf 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 a28ad89..66d0d57 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 ec7141f..a0392d3 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 6e513cc..54076d5 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 61fb921..fb43b5b 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 03fe302..e415cba 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 30b214c..f708850 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 53a4297..529b9ad 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 733e8fe..1812c1f 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 8907e7a..c89665c 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 6338905..735df5f 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 3fedb9d..04b8357 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 5de1a9b..8a54e28 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 f1e0150..5835713 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 726b902..a765bf0 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 2e6cb80..c119dd7 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 a863ffb..5949d1a 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 9509ea2..87e0757 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 ffa0bed..5c84d9f 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 56d71a5..19bae04 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 f041ab1..5495cdb 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 3ecdd15..bf4388c 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 9e5b091..231c05b 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 295e806..da03be3 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 1b89471..0e06dc3 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 9c6c8ea..334ff5f 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 971b9ae..bc20f2f 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 2cbcc92..8c41d85 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 dd72fa7..df223ee 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 c3d98a6..a72ca17 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 465e43d..2b55ebb 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 3aac2b7..da58908 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 186c5ef..b1b6e34 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
GIT binary patch
literal 0
HcmV?d00001

literal 6683
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

diff --git a/src/main/resources/protocols.svg b/src/main/resources/protocols.svg
new file mode 100644
index 0000000..3c778a3
--- /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
-- 
GitLab