diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3d47f986c41db29ec6dc0d5036bf760b3a1cf366
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.idea/
+target/
+.settings/
+*.iml
+.project
+.classpath
\ No newline at end of file
diff --git a/StackRotation.jar b/StackRotation.jar
new file mode 100644
index 0000000000000000000000000000000000000000..a18d426e7d854c66773851fa79c5c553782d1ead
Binary files /dev/null and b/StackRotation.jar differ
diff --git a/export.jardesc b/export.jardesc
new file mode 100644
index 0000000000000000000000000000000000000000..7f140a23fb28e5f402edc80ac0380620c06e9cd3
--- /dev/null
+++ b/export.jardesc
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
+<jardesc>
+    <jar path="Stack Rotation/StackRotation.jar"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/Stack Rotation/export.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <manifest generateManifest="true" manifestLocation="/Icy-Updater/META-INF/MANIFEST.MF" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=Stack Rotation/src"/>
+    </selectedElements>
+</jardesc>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f96c1eccb92e0022eaffc4c304264442d750334
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- Inherited Icy Parent POM -->
+    <parent>
+        <groupId>org.bioimageanalysis.icy</groupId>
+        <artifactId>parent-pom-plugin</artifactId>
+        <version>1.0.3</version>
+    </parent>
+
+    <!-- Project Information -->
+    <artifactId>stack-rotation</artifactId>
+    <version>1.2.1</version>
+
+    <packaging>jar</packaging>
+
+    <name>Stack Rotation</name>
+    <description>Rotate the 3D stack from Front view to Right view or from Front view to Top view. </description>
+    <url></url>
+    <inceptionYear>2020</inceptionYear>
+
+    <organization>
+        <name>Institut Pasteur</name>
+        <url>https://pasteur.fr</url>
+    </organization>
+
+    <licenses>
+        <license>
+            <name>GNU GPLv3</name>
+            <url>https://www.gnu.org/licenses/gpl-3.0.en.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <id>sdallongeville</id>
+            <name>Stéphane Dallongeville</name>
+            <url>https://research.pasteur.fr/fr/member/stephane-dallongeville/</url>
+            <roles>
+                <role>founder</role>
+                <role>lead</role>
+                <role>architect</role>
+                <role>developer</role>
+                <role>debugger</role>
+                <role>tester</role>
+                <role>maintainer</role>
+                <role>support</role>
+            </roles>
+        </developer>
+    </developers>
+
+    <!-- Project properties -->
+    <properties>
+
+    </properties>
+
+    <!-- Project build configuration -->
+    <build>
+
+    </build>
+
+    <!-- List of project's dependencies -->
+    <dependencies>
+        <!-- The core of Icy -->
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>icy-kernel</artifactId>
+        </dependency>
+
+        <!-- The EzPlug library, simplifies writing UI for Icy plugins. -->
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>ezplug</artifactId>
+        </dependency>
+    </dependencies>
+
+    <!-- Icy Maven repository (to find parent POM) -->
+    <repositories>
+        <repository>
+            <id>icy</id>
+            <name>Icy's Nexus</name>
+            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+        </repository>
+    </repositories>
+</project>
\ No newline at end of file
diff --git a/src/main/java/plugins/spop/rotation3D/StackRotation.class b/src/main/java/plugins/spop/rotation3D/StackRotation.class
new file mode 100644
index 0000000000000000000000000000000000000000..68074344ee33ae06c785a18f06198858479a547b
Binary files /dev/null and b/src/main/java/plugins/spop/rotation3D/StackRotation.class differ
diff --git a/src/main/java/plugins/spop/rotation3D/StackRotation.java b/src/main/java/plugins/spop/rotation3D/StackRotation.java
new file mode 100644
index 0000000000000000000000000000000000000000..95aa8064365f2fa21d3ccddc415653465b824ab8
--- /dev/null
+++ b/src/main/java/plugins/spop/rotation3D/StackRotation.java
@@ -0,0 +1,168 @@
+package plugins.spop.rotation3D;
+
+import icy.image.IcyBufferedImage;
+import icy.sequence.Sequence;
+import icy.type.collection.array.Array1DUtil;
+import icy.util.OMEUtil;
+import plugins.adufour.blocks.lang.Block;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.ezplug.EzPlug;
+import plugins.adufour.ezplug.EzVarSequence;
+import plugins.adufour.ezplug.EzVarText;
+
+public class StackRotation extends EzPlug implements Block
+{
+    
+    EzVarSequence input  = new EzVarSequence("Input");
+    EzVarText     type   = new EzVarText("Type", new String[] { "FrontToRight", "FrontToTop" }, false);
+    // VarSequence output = new VarSequence("Output", false);
+    
+    EzVarSequence output = new EzVarSequence("Output");
+    
+    @Override
+    public void initialize()
+    {
+        // TODO Auto-generated method stub
+        super.addEzComponent(input);
+        super.addEzComponent(type);
+        // super.addOutput(output);
+        super.setTimeDisplay(true);
+        
+    }
+    
+    @Override
+    public void execute()
+    {
+        
+        Sequence sequence = input.getValue(true);
+        Sequence seq_out = new Sequence(OMEUtil.createOMEXMLMetadata(sequence.getOMEXMLMetadata()));
+        if (type.getValue().equalsIgnoreCase("FrontToRight"))
+        {
+            seq_out = FrontToRight(sequence);
+            seq_out.setName("FrontToRight");
+        }
+        if (type.getValue().equalsIgnoreCase("FrontToTop"))
+        {
+            seq_out = FrontToTop(sequence);
+            seq_out.setName("FrontToTop");
+            
+        }
+        
+        if (getUI() != null) addSequence(seq_out);
+        output.setValue(seq_out);
+        
+    }
+    
+    public static Sequence FrontToRight(Sequence sequence)
+    {
+        
+        int z = 0;
+        
+        Sequence seq = new Sequence();
+        
+        int dim_x = sequence.getSizeX();
+        int dim_y = sequence.getSizeY();
+        int dim_z = sequence.getSizeZ();
+        int dim_t = sequence.getSizeT();
+        int dim_c = sequence.getSizeC();
+        double[][] tab = new double[dim_z][dim_x * dim_y];
+        double[][][] tab_r = new double[dim_c][dim_x][dim_y * dim_z];
+        
+        for (int t = 0; t < dim_t; t++)
+        {
+            for (int c = 0; c < dim_c; c++)
+            {
+                for (z = 0; z < dim_z; z++)
+                {
+                    tab[z] = Array1DUtil.arrayToDoubleArray(sequence.getDataXY(t, z, c), false);
+                }
+                for (z = 0; z < dim_z; z++)
+                    for (int y = 0; y < dim_y; y++)
+                        for (int x = 0; x < dim_x; x++)
+                        {
+                            tab_r[c][x][y * dim_z + z] = tab[z][y * dim_x + x];
+                        }
+            }
+            
+            for (z = 0; z < dim_x; z++)
+            {
+                IcyBufferedImage Icy = new IcyBufferedImage(dim_z, dim_y, dim_c, sequence.getDataType());
+                for (int c = 0; c < dim_c; c++)
+                    Icy.setDataXY(c, tab_r[c][z]);
+                seq.setImage(t, z, Icy);
+            }
+        }
+        
+        System.gc();
+        return seq;
+        
+    }
+    
+    public static Sequence FrontToTop(Sequence sequence)
+    {
+        
+        int z = 0;
+        
+        Sequence seq = new Sequence();
+        
+        int dim_x = sequence.getSizeX();
+        int dim_y = sequence.getSizeY();
+        int dim_z = sequence.getSizeZ();
+        int dim_t = sequence.getSizeT();
+        int dim_c = sequence.getSizeC();
+        double[][] tab = new double[dim_z][dim_x * dim_y];
+        double[][][] tab_r = new double[dim_c][dim_y][dim_x * dim_z];
+        
+        for (int t = 0; t < dim_t; t++)
+        {
+            for (int c = 0; c < dim_c; c++)
+            {
+                for (z = 0; z < dim_z; z++)
+                {
+                    tab[z] = Array1DUtil.arrayToDoubleArray(sequence.getDataXY(t, z, c), false);
+                }
+                for (z = 0; z < dim_z; z++)
+                    for (int y = 0; y < dim_y; y++)
+                        for (int x = 0; x < dim_x; x++)
+                        {
+                            tab_r[c][y][z * dim_x + x] = tab[z][y * dim_x + x];
+                        }
+            }
+            
+            for (z = 0; z < dim_y; z++)
+            {
+                IcyBufferedImage Icy = new IcyBufferedImage(dim_x, dim_z, dim_c, sequence.getDataType());
+                for (int c = 0; c < dim_c; c++)
+                    Icy.setDataXY(c, tab_r[c][z]);
+                seq.setImage(t, z, Icy);
+            }
+        }
+        
+        System.gc();
+        
+        return seq;
+        
+    }
+    
+    public void clean()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        // TODO Auto-generated method stub
+        inputMap.add(input.getVariable());
+        inputMap.add(type.getVariable());
+        
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+        // TODO Auto-generated method stub
+        outputMap.add(output.getVariable());
+        
+    }
+    
+}