commit 584f7954c08fb87d096ea5c03d5f8752e4153c53
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri May 17 00:34:25 2019 +0100

    - adjust SizeChangeEffects
    - implement first two UnscrambleEffects

diff --git a/src/main/java/org/distorted/effect/AppearEffect.java b/src/main/java/org/distorted/effect/AppearEffect.java
deleted file mode 100644
index a095306b..00000000
--- a/src/main/java/org/distorted/effect/AppearEffect.java
+++ /dev/null
@@ -1,210 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-import org.distorted.magic.RubikCube;
-
-import java.lang.reflect.Method;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class AppearEffect implements EffectListener
-  {
-  public enum Type
-    {
-    NONE          (AppearEffectNone.class        ),
-    TRANSPARENCY  (AppearEffectTransparency.class),
-    MOVE          (AppearEffectMove.class        ),
-    ROUND         (AppearEffectRound.class       ),
-    SCALE         (AppearEffectScale.class       ),
-    ;
-
-    private final Class<? extends AppearEffect> effectClass;
-
-    Type(Class<? extends AppearEffect> effectClass)
-      {
-      this.effectClass = effectClass;
-      }
-    }
-
-  public static final int NUM_EFFECTS = Type.values().length;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i] = type;
-      i++;
-      }
-    }
-
-  private final int FAKE_EFFECT_ID = -1;
-
-  private EffectListener mListener;
-  private RubikCube mCube;
-  private int mCubeEffectNumber, mNodeEffectNumber, mEffectFinished, mEffectReturned;
-
-  DistortedScreen mScreen;
-  Effect[] mCubeEffects;
-  int[] mCubeEffectPosition;
-  Effect[] mNodeEffects;
-  int[] mNodeEffectPosition;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  AppearEffect()
-    {
-    mEffectReturned = 0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract int createEffects(int duration);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static Type getType(int ordinal)
-    {
-    return types[ordinal];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      long id = mCubeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned();
-        mCube.remove(id);
-        break;
-        }
-      }
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      long id = mNodeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned();
-        mCube.getEffects().abortById(id);
-        break;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectReturned()
-    {
-    mEffectReturned++;
-
-    if( mEffectReturned == mEffectFinished )
-      {
-      mListener.effectFinished(FAKE_EFFECT_ID);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
-    {
-    mScreen   = screen;
-    mCube     = cube;
-    mListener = listener;
-
-    mEffectFinished = createEffects(duration);
-
-    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
-    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
-
-    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
-      {
-      throw new RuntimeException("Cube and Node Effects both not created!");
-      }
-
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
-      mCubeEffects[i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mCube.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
-      mNodeEffects[i].notifyWhenFinished(this);
-      }
-
-    mScreen.attach(mCube);
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static AppearEffect create(Type type) throws InstantiationException, IllegalAccessException
-    {
-    return type.effectClass.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void enableEffects()
-    {
-    Method method=null;
-
-    for(Type type: Type.values())
-      {
-      Class<? extends AppearEffect> cls = type.effectClass;
-
-      try
-        {
-        method = cls.getMethod("enable");
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("AppearEffect", "exception getting method: "+ex.getMessage());
-        }
-
-      try
-        {
-        method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("AppearEffect", "exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/AppearEffectMove.java b/src/main/java/org/distorted/effect/AppearEffectMove.java
deleted file mode 100644
index 06e00be3..00000000
--- a/src/main/java/org/distorted/effect/AppearEffectMove.java
+++ /dev/null
@@ -1,58 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class AppearEffectMove extends AppearEffect
-  {
-  public int createEffects(int duration)
-    {
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int xmove = w/2 + (w<h?w:h)/2;
-
-    mNodeEffectPosition = new int[] {1};
-    mNodeEffects        = new Effect[mNodeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D(-xmove,0,0));
-    d0.add(new Static3D(     0,0,0));
-    mNodeEffects[0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/AppearEffectNone.java b/src/main/java/org/distorted/effect/AppearEffectNone.java
deleted file mode 100644
index a3e93988..00000000
--- a/src/main/java/org/distorted/effect/AppearEffectNone.java
+++ /dev/null
@@ -1,51 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class AppearEffectNone extends AppearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// enable all effects used in this Appear (here: none).  Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/AppearEffectRound.java b/src/main/java/org/distorted/effect/AppearEffectRound.java
deleted file mode 100644
index 00bf0289..00000000
--- a/src/main/java/org/distorted/effect/AppearEffectRound.java
+++ /dev/null
@@ -1,67 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class AppearEffectRound extends AppearEffect
-  {
-  public int createEffects(int duration)
-    {
-    float X = TEXTURE_SIZE/3;
-
-    mCubeEffectPosition = new int[] {6,7};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
-    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
-    mCubeEffects[0] = new MatrixEffectScale(d0);
-
-    Dynamic3D d1 = new Dynamic3D(duration, 0.5f);
-    d1.setMode(Dynamic.MODE_PATH);
-    d1.add(new Static3D( 0, 0, 0));
-    d1.add(new Static3D(-X, 0, 0));
-    d1.add(new Static3D( 0, 0, 0));
-    mCubeEffects[1] = new MatrixEffectMove(d1);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/AppearEffectScale.java b/src/main/java/org/distorted/effect/AppearEffectScale.java
deleted file mode 100644
index 40add6bd..00000000
--- a/src/main/java/org/distorted/effect/AppearEffectScale.java
+++ /dev/null
@@ -1,54 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class AppearEffectScale extends AppearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {6};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    mCubeEffects[0] = new MatrixEffectScale(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/AppearEffectTransparency.java b/src/main/java/org/distorted/effect/AppearEffectTransparency.java
deleted file mode 100644
index 680c0886..00000000
--- a/src/main/java/org/distorted/effect/AppearEffectTransparency.java
+++ /dev/null
@@ -1,78 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.FragmentEffectAlpha;
-import org.distorted.library.effect.VertexEffectWave;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic5D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static5D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class AppearEffectTransparency extends AppearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
-    d0.add(new Static1D(0.0f));
-    d0.add(new Static1D(1.0f));
-    mCubeEffects[0] = new FragmentEffectAlpha(d0);
-
-    mNodeEffectPosition = new int[] {-1};
-    mNodeEffects        = new Effect[mNodeEffectPosition.length];
-
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int min = w<h ? w:h;
-
-    float init_amplitude = min/15.0f;
-    float end_amplitude  = 0.0f;
-    float length         = min/15.0f;
-    float init_phase     = 0.0f;
-    float end_phase      = 360.0f;
-    float alpha          = 30.0f;
-    float beta           = 90.0f;
-
-    Dynamic5D d1 = new Dynamic5D(duration, 0.5f);
-    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
-    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
-    Static3D center = new Static3D(min*0.5f,min*0.5f,0);
-    mNodeEffects[0] = new VertexEffectWave(d1, center, null);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-    FragmentEffectAlpha.enable();
-    VertexEffectWave.enable();
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/DisappearEffect.java b/src/main/java/org/distorted/effect/DisappearEffect.java
deleted file mode 100644
index a5339901..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffect.java
+++ /dev/null
@@ -1,213 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-import org.distorted.magic.RubikCube;
-
-import java.lang.reflect.Method;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class DisappearEffect implements EffectListener
-  {
-  public enum Type
-    {
-    NONE          (DisappearEffectNone.class       ),
-    TRANSPARENCY  (DisappearEffectTransparency.class),
-    MOVE          (DisappearEffectMove.class        ),
-    ROUND         (DisappearEffectRound.class       ),
-    SCALE         (DisappearEffectScale.class       ),
-    ;
-
-    private final Class<? extends DisappearEffect> effectClass;
-
-    Type(Class<? extends DisappearEffect> effectClass)
-      {
-      this.effectClass = effectClass;
-      }
-    }
-
-  public static final int NUM_EFFECTS = Type.values().length;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i] = type;
-      i++;
-      }
-    }
-
-  private final int FAKE_EFFECT_ID = -2;
-
-  private EffectListener mListener;
-  private RubikCube mCube;
-  private int mCubeEffectNumber, mNodeEffectNumber, mEffectFinished, mEffectReturned;
-
-  DistortedScreen mScreen;
-  Effect[] mCubeEffects;
-  int[] mCubeEffectPosition;
-  Effect[] mNodeEffects;
-  int[] mNodeEffectPosition;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  DisappearEffect()
-    {
-    mEffectReturned = 0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract int createEffects(int duration);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static Type getType(int ordinal)
-    {
-    return types[ordinal];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      long id = mCubeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned();
-        mCube.remove(id);
-        break;
-        }
-      }
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      long id = mNodeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned();
-        mCube.getEffects().abortById(id);
-        break;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectReturned()
-    {
-    mEffectReturned++;
-
-    if( mEffectReturned == mEffectFinished )
-      {
-      mListener.effectFinished(FAKE_EFFECT_ID);
-      }
-
-    if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
-      {
-      mScreen.detach(mCube);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
-    {
-    mScreen   = screen;
-    mCube     = cube;
-    mListener = listener;
-
-    mEffectFinished = createEffects(duration);
-
-    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
-    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
-
-    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
-      {
-      throw new RuntimeException("Cube and Node Effects both not created!");
-      }
-
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
-      mCubeEffects[i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mCube.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
-      mNodeEffects[i].notifyWhenFinished(this);
-      }
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static DisappearEffect create(Type type) throws InstantiationException, IllegalAccessException
-    {
-    return type.effectClass.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void enableEffects()
-    {
-    Method method=null;
-
-    for(Type type: Type.values())
-      {
-      Class<? extends DisappearEffect> cls = type.effectClass;
-
-      try
-        {
-        method = cls.getMethod("enable");
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("DisappearEffect", "exception getting method: "+ex.getMessage());
-        }
-
-      try
-        {
-        method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("DisappearEffect", "exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/DisappearEffectMove.java b/src/main/java/org/distorted/effect/DisappearEffectMove.java
deleted file mode 100644
index 6f97b879..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffectMove.java
+++ /dev/null
@@ -1,58 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class DisappearEffectMove extends DisappearEffect
-  {
-  public int createEffects(int duration)
-    {
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int xmove = w/2 + (w<h?w:h)/2;
-
-    mNodeEffectPosition = new int[] {1};
-    mNodeEffects        = new Effect[mNodeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D(    0,0,0));
-    d0.add(new Static3D(xmove,0,0));
-    mNodeEffects[0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/DisappearEffectNone.java b/src/main/java/org/distorted/effect/DisappearEffectNone.java
deleted file mode 100644
index 49a4b42a..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffectNone.java
+++ /dev/null
@@ -1,51 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class DisappearEffectNone extends DisappearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-    mCubeEffects[0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// enable all effects used in this Appear (here: none).  Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/DisappearEffectRound.java b/src/main/java/org/distorted/effect/DisappearEffectRound.java
deleted file mode 100644
index bf391f75..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffectRound.java
+++ /dev/null
@@ -1,67 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class DisappearEffectRound extends DisappearEffect
-  {
-  public int createEffects(int duration)
-    {
-    float X = TEXTURE_SIZE/3;
-
-    mCubeEffectPosition = new int[] {6,7};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
-    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
-    mCubeEffects[0] = new MatrixEffectScale(d0);
-
-    Dynamic3D d1 = new Dynamic3D(duration, 0.5f);
-    d1.setMode(Dynamic.MODE_PATH);
-    d1.add(new Static3D( 0, 0, 0));
-    d1.add(new Static3D(+X, 0, 0));
-    d1.add(new Static3D( 0, 0, 0));
-    mCubeEffects[1] = new MatrixEffectMove(d1);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/DisappearEffectScale.java b/src/main/java/org/distorted/effect/DisappearEffectScale.java
deleted file mode 100644
index 6b6bc3e8..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffectScale.java
+++ /dev/null
@@ -1,54 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class DisappearEffectScale extends DisappearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {6};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    mCubeEffects[0] = new MatrixEffectScale(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effect/DisappearEffectTransparency.java b/src/main/java/org/distorted/effect/DisappearEffectTransparency.java
deleted file mode 100644
index 6ccd85dc..00000000
--- a/src/main/java/org/distorted/effect/DisappearEffectTransparency.java
+++ /dev/null
@@ -1,78 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted 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 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.effect;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.FragmentEffectAlpha;
-import org.distorted.library.effect.VertexEffectWave;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic5D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static5D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class DisappearEffectTransparency extends DisappearEffect
-  {
-  public int createEffects(int duration)
-    {
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
-    d0.add(new Static1D(1.0f));
-    d0.add(new Static1D(0.0f));
-    mCubeEffects[0] = new FragmentEffectAlpha(d0);
-
-    mNodeEffectPosition = new int[] {-1};
-    mNodeEffects        = new Effect[mNodeEffectPosition.length];
-
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int min = w<h ? w:h;
-
-    float init_amplitude = 0.0f;
-    float end_amplitude  = min/15.0f;
-    float length         = min/15.0f;
-    float init_phase     = 360.0f;
-    float end_phase      = 0.0f;
-    float alpha          = 30.0f;
-    float beta           = 90.0f;
-
-    Dynamic5D d1 = new Dynamic5D(duration, 0.5f);
-    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
-    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
-    Static3D center = new Static3D(min*0.5f,min*0.5f,0);
-    mNodeEffects[0] = new VertexEffectWave(d1, center, null);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Appear. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-    FragmentEffectAlpha.enable();
-    VertexEffectWave.enable();
-    }
-  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffect.java b/src/main/java/org/distorted/effect/SizeChangeEffect.java
new file mode 100644
index 00000000..e071c915
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffect.java
@@ -0,0 +1,245 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedScreen;
+import org.distorted.library.message.EffectListener;
+import org.distorted.magic.RubikCube;
+
+import java.lang.reflect.Method;
+
+public abstract class SizeChangeEffect implements EffectListener
+{
+  public enum Type
+    {
+    NONE         (SizeChangeEffectAppearNone.class        , SizeChangeEffectDisappearNone.class        ),
+    TRANSPARENCY (SizeChangeEffectAppearTransparency.class, SizeChangeEffectDisappearTransparency.class),
+    MOVE         (SizeChangeEffectAppearMove.class        , SizeChangeEffectDisappearMove.class        ),
+    ROUND        (SizeChangeEffectAppearRound.class       , SizeChangeEffectDisappearRound.class       ),
+    SCALE        (SizeChangeEffectAppearScale.class       , SizeChangeEffectDisappearScale.class       ),
+    ;
+
+    final Class<? extends SizeChangeEffectAppear   > appear;
+    final Class<? extends SizeChangeEffectDisappear> disappear;
+
+    Type(Class<? extends SizeChangeEffectAppear> appear, Class<? extends SizeChangeEffectDisappear> disappear )
+      {
+      this.appear    = appear;
+      this.disappear = disappear;
+      }
+    }
+
+  private static int NUM_EFFECTS = Type.values().length;
+  private static final Type[] types;
+
+  static
+    {
+    int i=0;
+    types = new Type[NUM_EFFECTS];
+
+    for(Type type: Type.values())
+      {
+      types[i++] = type;
+      }
+    }
+
+  private EffectListener mListener;
+  private int mCubeEffectNumber, mNodeEffectNumber, mEffectFinished, mEffectReturned;
+  private int mFakeEffectID;
+
+  RubikCube mCube;
+  DistortedScreen mScreen;
+  Effect[] mCubeEffects;
+  int[] mCubeEffectPosition;
+  Effect[] mNodeEffects;
+  int[] mNodeEffectPosition;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  SizeChangeEffect(int id)
+    {
+    mEffectReturned = 0;
+    mFakeEffectID   = id;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static Type getType(int index)
+    {
+    return types[index];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String[] getNames()
+    {
+    String[] names = new String[NUM_EFFECTS];
+
+    for( int i=0; i<NUM_EFFECTS; i++)
+      {
+      names[i] = types[i].name();
+      }
+
+    return names;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  abstract int createEffects(int duration);
+  abstract void effectsEnd();
+  abstract void startEnd();
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void effectFinished(final long effectID)
+    {
+    for(int i=0; i<mCubeEffectNumber; i++)
+      {
+      long id = mCubeEffects[i].getID();
+
+      if( effectID == id )
+        {
+        mEffectReturned++;
+
+        if( mEffectReturned == mEffectFinished )
+          {
+          mListener.effectFinished(mFakeEffectID);
+          }
+
+        if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
+          {
+          effectsEnd();
+          }
+
+        mCube.remove(id);
+        break;
+        }
+      }
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      long id = mNodeEffects[i].getID();
+
+      if( effectID == id )
+        {
+        mEffectReturned++;
+
+        if( mEffectReturned == mEffectFinished )
+          {
+          mListener.effectFinished(mFakeEffectID);
+          }
+
+        if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
+          {
+          effectsEnd();
+          }
+
+        mCube.getEffects().abortById(id);
+        break;
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
+    {
+    mScreen   = screen;
+    mCube     = cube;
+    mListener = listener;
+
+    mEffectFinished = createEffects(duration);
+
+    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
+    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
+
+    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
+      {
+      throw new RuntimeException("Cube and Node Effects both not created!");
+      }
+
+    for(int i=0; i<mCubeEffectNumber; i++)
+      {
+      mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
+      mCubeEffects[i].notifyWhenFinished(this);
+      }
+
+    DistortedEffects nodeEffects = mCube.getEffects();
+
+    for(int i=0; i<mNodeEffectNumber; i++)
+      {
+      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
+      mNodeEffects[i].notifyWhenFinished(this);
+      }
+
+    startEnd();
+
+    return mFakeEffectID;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void enableEffects()
+    {
+    Method method=null;
+
+    for(Type type: Type.values())
+      {
+      try
+        {
+        method = type.appear.getMethod("enable");
+        }
+      catch(NoSuchMethodException ex)
+        {
+        android.util.Log.e("SizeChangeEffect", "exception getting method: "+ex.getMessage());
+        }
+
+      try
+        {
+        method.invoke(null);
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("SizeChangeEffect", "exception invoking method: "+ex.getMessage());
+        }
+
+      try
+        {
+        method = type.disappear.getMethod("enable");
+        }
+      catch(NoSuchMethodException ex)
+        {
+        android.util.Log.e("SizeChangeEffect", "exception getting method: "+ex.getMessage());
+        }
+
+      try
+        {
+        method.invoke(null);
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("SizeChangeEffect", "exception invoking method: "+ex.getMessage());
+        }
+      }
+    }
+}
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppear.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppear.java
new file mode 100644
index 00000000..2a797ba1
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppear.java
@@ -0,0 +1,51 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public abstract class SizeChangeEffectAppear extends SizeChangeEffect
+  {
+  SizeChangeEffectAppear()
+    {
+    super(-1);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static SizeChangeEffectAppear create(Type type) throws InstantiationException, IllegalAccessException
+    {
+    return type.appear.newInstance();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void effectsEnd()
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void startEnd()
+    {
+    mScreen.attach(mCube);
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppearMove.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppearMove.java
new file mode 100644
index 00000000..bbb9cc33
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppearMove.java
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectAppearMove extends SizeChangeEffectAppear
+  {
+  public int createEffects(int duration)
+    {
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int xmove = w/2 + (w<h?w:h)/2;
+
+    mNodeEffectPosition = new int[] {1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(-xmove,0,0));
+    d0.add(new Static3D(     0,0,0));
+    mNodeEffects[0] = new MatrixEffectMove(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppearNone.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppearNone.java
new file mode 100644
index 00000000..a0a4c9f4
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppearNone.java
@@ -0,0 +1,51 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectAppearNone extends SizeChangeEffectAppear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {-1};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(1,0.5f);
+    d0.add(new Static3D(0,0,0));
+    mCubeEffects[0] = new MatrixEffectMove(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// enable all effects used in this Appear (here: none).  Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppearRound.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppearRound.java
new file mode 100644
index 00000000..74733514
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppearRound.java
@@ -0,0 +1,67 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.type.Dynamic;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectAppearRound extends SizeChangeEffectAppear
+  {
+  public int createEffects(int duration)
+    {
+    float X = TEXTURE_SIZE/3;
+
+    mCubeEffectPosition = new int[] {6,7};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
+    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
+
+    Dynamic3D d1 = new Dynamic3D(duration, 0.5f);
+    d1.setMode(Dynamic.MODE_PATH);
+    d1.add(new Static3D( 0, 0, 0));
+    d1.add(new Static3D(-X, 0, 0));
+    d1.add(new Static3D( 0, 0, 0));
+    mCubeEffects[1] = new MatrixEffectMove(d1);
+
+    return 2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppearScale.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppearScale.java
new file mode 100644
index 00000000..315235bf
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppearScale.java
@@ -0,0 +1,54 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectAppearScale extends SizeChangeEffectAppear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {6};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
+    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectAppearTransparency.java b/src/main/java/org/distorted/effect/SizeChangeEffectAppearTransparency.java
new file mode 100644
index 00000000..7084ea2a
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectAppearTransparency.java
@@ -0,0 +1,78 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.FragmentEffectAlpha;
+import org.distorted.library.effect.VertexEffectWave;
+import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.type.Dynamic5D;
+import org.distorted.library.type.Static1D;
+import org.distorted.library.type.Static3D;
+import org.distorted.library.type.Static5D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectAppearTransparency extends SizeChangeEffectAppear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {-1};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
+    d0.add(new Static1D(0.0f));
+    d0.add(new Static1D(1.0f));
+    mCubeEffects[0] = new FragmentEffectAlpha(d0);
+
+    mNodeEffectPosition = new int[] {-1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
+
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int min = w<h ? w:h;
+
+    float init_amplitude = min/15.0f;
+    float end_amplitude  = 0.0f;
+    float length         = min/15.0f;
+    float init_phase     = 0.0f;
+    float end_phase      = 360.0f;
+    float alpha          = 30.0f;
+    float beta           = 90.0f;
+
+    Dynamic5D d1 = new Dynamic5D(duration, 0.5f);
+    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
+    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
+    Static3D center = new Static3D(min*0.5f,min*0.5f,0);
+    mNodeEffects[0] = new VertexEffectWave(d1, center, null);
+
+    return 2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+    FragmentEffectAlpha.enable();
+    VertexEffectWave.enable();
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappear.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappear.java
new file mode 100644
index 00000000..99f8c2d7
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappear.java
@@ -0,0 +1,51 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public abstract class SizeChangeEffectDisappear extends SizeChangeEffect
+  {
+  SizeChangeEffectDisappear()
+    {
+    super(-2);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static SizeChangeEffectDisappear create(Type type) throws InstantiationException, IllegalAccessException
+    {
+    return type.disappear.newInstance();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void effectsEnd()
+    {
+    mScreen.detach(mCube);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void startEnd()
+    {
+
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappearMove.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearMove.java
new file mode 100644
index 00000000..7b42c0b2
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearMove.java
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectDisappearMove extends SizeChangeEffectDisappear
+  {
+  public int createEffects(int duration)
+    {
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int xmove = w/2 + (w<h?w:h)/2;
+
+    mNodeEffectPosition = new int[] {1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(    0,0,0));
+    d0.add(new Static3D(xmove,0,0));
+    mNodeEffects[0] = new MatrixEffectMove(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappearNone.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearNone.java
new file mode 100644
index 00000000..b4056a97
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearNone.java
@@ -0,0 +1,51 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectDisappearNone extends SizeChangeEffectDisappear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {-1};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(1,0.5f);
+    d0.add(new Static3D(0,0,0));
+    mCubeEffects[0] = new MatrixEffectMove(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// enable all effects used in this Appear (here: none).  Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappearRound.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearRound.java
new file mode 100644
index 00000000..67ab1fd1
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearRound.java
@@ -0,0 +1,67 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.type.Dynamic;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+import static org.distorted.magic.RubikRenderer.TEXTURE_SIZE;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectDisappearRound extends SizeChangeEffectDisappear
+  {
+  public int createEffects(int duration)
+    {
+    float X = TEXTURE_SIZE/3;
+
+    mCubeEffectPosition = new int[] {6,7};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
+    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
+
+    Dynamic3D d1 = new Dynamic3D(duration, 0.5f);
+    d1.setMode(Dynamic.MODE_PATH);
+    d1.add(new Static3D( 0, 0, 0));
+    d1.add(new Static3D(+X, 0, 0));
+    d1.add(new Static3D( 0, 0, 0));
+    mCubeEffects[1] = new MatrixEffectMove(d1);
+
+    return 2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappearScale.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearScale.java
new file mode 100644
index 00000000..1e6a740b
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearScale.java
@@ -0,0 +1,54 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectDisappearScale extends SizeChangeEffectDisappear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {6};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
+    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
+    mCubeEffects[0] = new MatrixEffectScale(d0);
+
+    return 1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+// Matrix Effects do not have to be enabled.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+
+    }
+  }
+
diff --git a/src/main/java/org/distorted/effect/SizeChangeEffectDisappearTransparency.java b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearTransparency.java
new file mode 100644
index 00000000..a844559c
--- /dev/null
+++ b/src/main/java/org/distorted/effect/SizeChangeEffectDisappearTransparency.java
@@ -0,0 +1,78 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted 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 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted 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 Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.effect;
+
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.FragmentEffectAlpha;
+import org.distorted.library.effect.VertexEffectWave;
+import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.type.Dynamic5D;
+import org.distorted.library.type.Static1D;
+import org.distorted.library.type.Static3D;
+import org.distorted.library.type.Static5D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SizeChangeEffectDisappearTransparency extends SizeChangeEffectDisappear
+  {
+  public int createEffects(int duration)
+    {
+    mCubeEffectPosition = new int[] {-1};
+    mCubeEffects        = new Effect[mCubeEffectPosition.length];
+
+    Dynamic1D d0 = new Dynamic1D(duration, 0.5f);
+    d0.add(new Static1D(1.0f));
+    d0.add(new Static1D(0.0f));
+    mCubeEffects[0] = new FragmentEffectAlpha(d0);
+
+    mNodeEffectPosition = new int[] {-1};
+    mNodeEffects        = new Effect[mNodeEffectPosition.length];
+
+    int w = mScreen.getWidth();
+    int h = mScreen.getHeight();
+    int min = w<h ? w:h;
+
+    float init_amplitude = 0.0f;
+    float end_amplitude  = min/15.0f;
+    float length         = min/15.0f;
+    float init_phase     = 360.0f;
+    float end_phase      = 0.0f;
+    float alpha          = 30.0f;
+    float beta           = 90.0f;
+
+    Dynamic5D d1 = new Dynamic5D(duration, 0.5f);
+    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
+    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
+    Static3D center = new Static3D(min*0.5f,min*0.5f,0);
+    mNodeEffects[0] = new VertexEffectWave(d1, center, null);
+
+    return 2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Appear. Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
+    FragmentEffectAlpha.enable();
+    VertexEffectWave.enable();
+    }
+  }
diff --git a/src/main/java/org/distorted/effect/UnscrambleEffect.java b/src/main/java/org/distorted/effect/UnscrambleEffect.java
index 87e57a73..bd5052e0 100644
--- a/src/main/java/org/distorted/effect/UnscrambleEffect.java
+++ b/src/main/java/org/distorted/effect/UnscrambleEffect.java
@@ -19,56 +19,251 @@
 
 package org.distorted.effect;
 
-import java.lang.reflect.Method;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class UnscrambleEffect
+import org.distorted.library.effect.Effect;
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedScreen;
+import org.distorted.library.message.EffectListener;
+import org.distorted.magic.RubikCube;
+
+import java.lang.reflect.Method;
+
+public abstract class UnscrambleEffect implements EffectListener
 {
   public enum Type
     {
-    NONE  (UnscrambleEffectNone.class ),
-    SPIN  (UnscrambleEffectSpin.class ),
+    NONE   (UnscrambleEffectNone.class),
+    SPIN   (UnscrambleEffectSpin.class),
     ;
 
-    private final Class<? extends UnscrambleEffect> effectClass;
+    final Class<? extends UnscrambleEffect> effect;
 
-    Type(Class<? extends UnscrambleEffect> effectClass)
+    Type(Class<? extends UnscrambleEffect> effect)
       {
-      this.effectClass = effectClass;
+      this.effect = effect;
       }
     }
 
-  public static final int NUM_EFFECTS = Type.values().length;
+  private static int NUM_EFFECTS = Type.values().length;
   private static final Type[] types;
 
   static
     {
     int i=0;
-
     types = new Type[NUM_EFFECTS];
 
     for(Type type: Type.values())
       {
-      types[i] = type;
-      i++;
+      types[i++] = type;
       }
     }
 
+  private EffectListener mListener;
+  private int mCubeEffectNumberBefore, mCubeEffectNumberAfter, mNodeEffectNumberBefore, mNodeEffectNumberAfter, mEffectReturned;
+  private int mFakeEffectID;
+  private boolean mPhaseBefore;
+
+  RubikCube mCube;
+  DistortedScreen mScreen;
+  Effect[] mCubeEffectsBefore, mCubeEffectsAfter;
+  int[] mCubeEffectPositionBefore, mCubeEffectPositionAfter;
+  Effect[] mNodeEffectsBefore, mNodeEffectsAfter;
+  int[] mNodeEffectPositionBefore, mNodeEffectPositionAfter;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  UnscrambleEffect()
+    {
+    mFakeEffectID = -3;
+    mPhaseBefore  = true;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static UnscrambleEffect.Type getType(int ordinal)
+  public static Type getType(int ordinal)
     {
     return types[ordinal];
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String[] getNames()
+    {
+    String[] names = new String[NUM_EFFECTS];
+
+    for( int i=0; i<NUM_EFFECTS; i++)
+      {
+      names[i] = types[i].name();
+      }
+
+    return names;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static UnscrambleEffect create(Type type) throws InstantiationException, IllegalAccessException
     {
-    return type.effectClass.newInstance();
+    return type.effect.newInstance();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  abstract void createEffects(int duration);
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void effectFinished(final long effectID)
+    {
+    if( mPhaseBefore ) effectFinishedBefore(effectID);
+    else               effectFinishedAfter (effectID);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void effectFinishedBefore(final long effectID)
+    {
+    for(int i=0; i<mCubeEffectNumberBefore; i++)
+      {
+      long id = mCubeEffectsBefore[i].getID();
+
+      if( effectID == id )
+        {
+        if( ++mEffectReturned == mCubeEffectNumberBefore+mNodeEffectNumberBefore )
+          {
+          mEffectReturned = 0;
+          mPhaseBefore    = false;
+          mCube.unscramble();
+          assignEffectsAfter();
+          }
+
+        mCube.remove(id);
+        break;
+        }
+      }
+    for(int i=0; i<mNodeEffectNumberBefore; i++)
+      {
+      long id = mNodeEffectsBefore[i].getID();
+
+      if( effectID == id )
+        {
+        if( ++mEffectReturned == mCubeEffectNumberBefore+mNodeEffectNumberBefore )
+          {
+          mEffectReturned = 0;
+          mPhaseBefore    = false;
+          mCube.unscramble();
+          assignEffectsAfter();
+          }
+
+        mCube.getEffects().abortById(id);
+        break;
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void effectFinishedAfter(final long effectID)
+    {
+    for(int i=0; i<mCubeEffectNumberAfter; i++)
+      {
+      long id = mCubeEffectsAfter[i].getID();
+
+      if( effectID == id )
+        {
+        if( ++mEffectReturned == mCubeEffectNumberAfter+mNodeEffectNumberAfter )
+          {
+          mListener.effectFinished(mFakeEffectID);
+          }
+
+        mCube.remove(id);
+        break;
+        }
+      }
+    for(int i=0; i<mNodeEffectNumberAfter; i++)
+      {
+      long id = mNodeEffectsAfter[i].getID();
+
+      if( effectID == id )
+        {
+        if( ++mEffectReturned == mCubeEffectNumberAfter+mNodeEffectNumberAfter )
+          {
+          mListener.effectFinished(mFakeEffectID);
+          }
+
+        mCube.getEffects().abortById(id);
+        break;
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
+    {
+    mScreen   = screen;
+    mCube     = cube;
+    mListener = listener;
+
+    createEffects(duration);
+    assignEffectsBefore();
+
+    return mFakeEffectID;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void assignEffectsBefore()
+    {
+    mCubeEffectNumberBefore = ( mCubeEffectsBefore!=null ) ? mCubeEffectsBefore.length : 0;
+    mNodeEffectNumberBefore = ( mNodeEffectsBefore!=null ) ? mNodeEffectsBefore.length : 0;
+
+    if( mCubeEffectNumberBefore==0 && mNodeEffectNumberBefore==0 )
+      {
+      throw new RuntimeException("Cube and Node Effects ('Before' phase) both not created!");
+      }
+
+    for(int i=0; i<mCubeEffectNumberBefore; i++)
+      {
+      mCube.apply(mCubeEffectsBefore[i],mCubeEffectPositionBefore[i]);
+      mCubeEffectsBefore[i].notifyWhenFinished(this);
+      }
+
+    DistortedEffects nodeEffects = mCube.getEffects();
+
+    for(int i=0; i<mNodeEffectNumberBefore; i++)
+      {
+      nodeEffects.apply(mNodeEffectsBefore[i],mNodeEffectPositionBefore[i]);
+      mNodeEffectsBefore[i].notifyWhenFinished(this);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void assignEffectsAfter()
+    {
+    mCubeEffectNumberAfter = ( mCubeEffectsAfter!=null ) ? mCubeEffectsAfter.length : 0;
+    mNodeEffectNumberAfter = ( mNodeEffectsAfter!=null ) ? mNodeEffectsAfter.length : 0;
+
+    if( mCubeEffectNumberAfter==0 && mNodeEffectNumberAfter==0 )
+      {
+      throw new RuntimeException("Cube and Node Effects ('After' phase) both not created!");
+      }
+
+    for(int i=0; i<mCubeEffectNumberAfter; i++)
+      {
+      mCube.apply(mCubeEffectsAfter[i],mCubeEffectPositionAfter[i]);
+      mCubeEffectsAfter[i].notifyWhenFinished(this);
+      }
+
+    DistortedEffects nodeEffects = mCube.getEffects();
+
+    for(int i=0; i<mNodeEffectNumberAfter; i++)
+      {
+      nodeEffects.apply(mNodeEffectsAfter[i],mNodeEffectPositionAfter[i]);
+      mNodeEffectsAfter[i].notifyWhenFinished(this);
+      }
+    }
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void enableEffects()
@@ -77,11 +272,9 @@ public class UnscrambleEffect
 
     for(Type type: Type.values())
       {
-      Class<? extends UnscrambleEffect> cls = type.effectClass;
-
       try
         {
-        method = cls.getMethod("enable");
+        method = type.effect.getMethod("enable");
         }
       catch(NoSuchMethodException ex)
         {
diff --git a/src/main/java/org/distorted/effect/UnscrambleEffectNone.java b/src/main/java/org/distorted/effect/UnscrambleEffectNone.java
index 54057a03..8d6463c8 100644
--- a/src/main/java/org/distorted/effect/UnscrambleEffectNone.java
+++ b/src/main/java/org/distorted/effect/UnscrambleEffectNone.java
@@ -21,7 +21,33 @@ package org.distorted.effect;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectMove;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
 public class UnscrambleEffectNone extends UnscrambleEffect
   {
+  public void createEffects(int duration)
+    {
+    Dynamic3D d0 = new Dynamic3D(1,0.5f);
+    d0.add(new Static3D(0,0,0));
+
+    mCubeEffectPositionBefore = new int[] {-1};
+    mCubeEffectsBefore        = new Effect[mCubeEffectPositionBefore.length];
+    mCubeEffectsBefore[0]     = new MatrixEffectMove(d0);
+
+    mCubeEffectPositionAfter  = new int[] {-1};
+    mCubeEffectsAfter         = new Effect[mCubeEffectPositionAfter.length];
+    mCubeEffectsAfter[0]      = new MatrixEffectMove(d0);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Effect. Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
 
+    }
   }
diff --git a/src/main/java/org/distorted/effect/UnscrambleEffectSpin.java b/src/main/java/org/distorted/effect/UnscrambleEffectSpin.java
index 6cc4137d..54f69fbf 100644
--- a/src/main/java/org/distorted/effect/UnscrambleEffectSpin.java
+++ b/src/main/java/org/distorted/effect/UnscrambleEffectSpin.java
@@ -21,7 +21,38 @@ package org.distorted.effect;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
+import org.distorted.library.effect.Effect;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.type.Dynamic3D;
+import org.distorted.library.type.Static3D;
+
 public class UnscrambleEffectSpin extends UnscrambleEffect
   {
+  public void createEffects(int duration)
+    {
+    mCubeEffectPositionBefore = new int[] {6};
+    mCubeEffectsBefore        = new Effect[mCubeEffectPositionBefore.length];
+
+    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
+    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
+    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
+    mCubeEffectsBefore[0] = new MatrixEffectScale(d0);
+
+    mCubeEffectPositionAfter = new int[] {6};
+    mCubeEffectsAfter        = new Effect[mCubeEffectPositionAfter.length];
+
+    Dynamic3D d1 = new Dynamic3D(duration, 0.5f);
+    d1.add(new Static3D(0.01f, 0.01f, 0.01f));
+    d1.add(new Static3D(1.00f, 1.00f, 1.00f));
+    mCubeEffectsAfter[0] = new MatrixEffectScale(d1);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Enable all effects used in this Effect. Called by reflection from the parent class.
+
+  @SuppressWarnings("unused")
+  static void enable()
+    {
 
+    }
   }
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 93845c23..e85b6722 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -30,8 +30,8 @@ import android.support.v7.app.AppCompatActivity;
 import android.view.View;
 
 import org.distorted.component.HorizontalNumberPicker;
-import org.distorted.effect.AppearEffect;
-import org.distorted.effect.DisappearEffect;
+import org.distorted.effect.SizeChangeEffectAppear;
+import org.distorted.effect.SizeChangeEffectDisappear;
 import org.distorted.effect.UnscrambleEffect;
 import org.distorted.library.main.DistortedLibrary;
 
@@ -43,11 +43,9 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
     private static final int SMALLEST_SIZE = 2;
     private static final int[] button_ids  = {R.id.rubikSize2, R.id.rubikSize3, R.id.rubikSize4};
 
-    public static final int DEFAULT_APPEAR_POS     = 20;
-    public static final int DEFAULT_DISAPPEAR_POS  = 20;
+    public static final int DEFAULT_SIZECHANGE_POS = 20;
     public static final int DEFAULT_UNSCRAMBLE_POS = 20;
-    public static final int DEFAULT_APPEAR_TYPE    = 1;
-    public static final int DEFAULT_DISAPPEAR_TYPE = 1;
+    public static final int DEFAULT_SIZECHANGE_TYPE= 1;
     public static final int DEFAULT_UNSCRAMBLE_TYPE= 1;
 
     public static final int MIN_SCRAMBLE =  1;
@@ -55,8 +53,8 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
 
     private static int mSize = DEFAULT_SIZE;
 
-    private int mAppearPos, mDisappearPos, mUnscramblePos;
-    private int mAppearType, mDisappearType, mUnscrambleType;
+    private int mSizeChangePos, mUnscramblePos;
+    private int mSizeChangeType, mUnscrambleType;
 
     private HorizontalNumberPicker mPicker;
 
@@ -122,11 +120,9 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
       {
       Bundle args = new Bundle();
 
-      args.putInt("appearPos"     , mAppearPos     );
-      args.putInt("disappearPos"  , mDisappearPos  );
+      args.putInt("sizechangePos" , mSizeChangePos );
       args.putInt("unscramblePos" , mUnscramblePos );
-      args.putInt("appearType"    , mAppearType    );
-      args.putInt("disappearType" , mDisappearType );
+      args.putInt("sizechangeType", mSizeChangeType);
       args.putInt("unscrambleType", mUnscrambleType);
 
       RubikSettings settings = new RubikSettings();
@@ -154,21 +150,19 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void Solve(View v)
+    public void Unscramble(View v)
       {
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.getRenderer().solveCube();
+      view.getRenderer().unscrambleCube();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void onComplete(int aP, int dP, int uP, int aT, int dT, int uT )
+    public void onComplete(int sP, int uP, int sT, int uT )
       {
-      mAppearPos     = aP;
-      mDisappearPos  = dP;
+      mSizeChangePos = sP;
       mUnscramblePos = uP;
-      mAppearType    = aT;
-      mDisappearType = dT;
+      mSizeChangeType= sT;
       mUnscrambleType= uT;
 
       applyPreferences();
@@ -224,13 +218,11 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
      SharedPreferences.Editor editor = preferences.edit();
 
-     editor.putInt("appearPos"     , mAppearPos     );
-     editor.putInt("disappearPos"  , mDisappearPos  );
+     editor.putInt("sizechangePos" , mSizeChangePos );
      editor.putInt("unscramblePos" , mUnscramblePos );
-     editor.putInt("appearType"    , mAppearType    );
-     editor.putInt("disappearType" , mDisappearType );
+     editor.putInt("sizechangeType", mSizeChangeType);
      editor.putInt("unscrambleType", mUnscrambleType);
-     editor.putInt("scramble"     , mPicker.getValue() );
+     editor.putInt("scramble"      , mPicker.getValue() );
 
      editor.apply();
      }
@@ -241,11 +233,9 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
      {
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
 
-     mAppearPos     = preferences.getInt("appearPos"     , DEFAULT_APPEAR_POS     );
-     mDisappearPos  = preferences.getInt("disappearPos"  , DEFAULT_DISAPPEAR_POS  );
+     mSizeChangePos = preferences.getInt("sizechangePos" , DEFAULT_SIZECHANGE_POS );
      mUnscramblePos = preferences.getInt("unscramblePos" , DEFAULT_UNSCRAMBLE_POS );
-     mAppearType    = preferences.getInt("appearType"    , DEFAULT_APPEAR_TYPE    );
-     mDisappearType = preferences.getInt("disappearType" , DEFAULT_DISAPPEAR_TYPE );
+     mSizeChangeType= preferences.getInt("sizechangeType", DEFAULT_SIZECHANGE_TYPE);
      mUnscrambleType= preferences.getInt("unscrambleType", DEFAULT_UNSCRAMBLE_TYPE);
      int scramble   = preferences.getInt("scramble"      , MIN_SCRAMBLE           );
 
@@ -259,11 +249,9 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
      RubikRenderer renderer = view.getRenderer();
 
-     renderer.setAppearDuration(translateDuration(mAppearPos)+1);
-     renderer.setDisappearDuration(translateDuration(mDisappearPos) +1);
-     renderer.setUnscrambleDuration(translateDuration(mUnscramblePos) +1);
-     renderer.setAppearType(AppearEffect.getType(mAppearType));
-     renderer.setDisappearType(DisappearEffect.getType(mDisappearType));
+     renderer.setSizeChangeDuration(translateDuration(mSizeChangePos)+1);
+     renderer.setUnscrambleDuration(translateDuration(mUnscramblePos)+1);
+     renderer.setSizeChangeType(SizeChangeEffectAppear.getType(mSizeChangeType));
      renderer.setUnscrambleType(UnscrambleEffect.getType(mUnscrambleType));
      }
 
diff --git a/src/main/java/org/distorted/magic/RubikCube.java b/src/main/java/org/distorted/magic/RubikCube.java
index 821ba483..8d3ebd10 100644
--- a/src/main/java/org/distorted/magic/RubikCube.java
+++ b/src/main/java/org/distorted/magic/RubikCube.java
@@ -210,6 +210,20 @@ public class RubikCube extends DistortedNode
             }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void unscramble()
+      {
+      for(int x=0; x<mSize; x++)
+        for(int y=0; y<mSize; y++)
+          for(int z=0; z<mSize; z++)
+            if( x==0 || x==mSize-1 || y==0 || y==mSize-1 || z==0 || z==mSize-1 )
+              {
+              mQuatScramble[x][y][z].set(0,0,0,1);
+              mCurrentPosition[x][y][z].set(x,y,z);
+              }
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public int getNumEffects(EffectType type)
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index 00d6f249..79bbb6a3 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -21,8 +21,9 @@ package org.distorted.magic;
 
 import android.opengl.GLSurfaceView;
 
-import org.distorted.effect.AppearEffect;
-import org.distorted.effect.DisappearEffect;
+import org.distorted.effect.SizeChangeEffect;
+import org.distorted.effect.SizeChangeEffectAppear;
+import org.distorted.effect.SizeChangeEffectDisappear;
 import org.distorted.effect.UnscrambleEffect;
 import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.DistortedEffects;
@@ -50,16 +51,15 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
     private Static4D mTempCurrent, mTempAccumulated;
     private float mCubeSizeInScreenSpace;
     private int mNextCubeSize;
-    private long mRotationFinishedID, mDisappearEffectID, mAppearEffectID;
-    private boolean mFinishRotation, mRemoveRotation, mFinishDragCurrent, mFinishDragAccumulated;
+    private long mRotationFinishedID, mDisappearEffectID, mAppearEffectID, mUnscrambleEffectID;
+    private boolean mFinishRotation, mRemoveRotation, mFinishDragCurrent, mFinishDragAccumulated, mSolveCube;
     private boolean mCanRotate, mCanDrag;
     private RubikCube mOldCube, mNewCube;
     private int mScreenWidth, mScreenHeight;
     private MeshFlat mMesh;
-    private AppearEffect.Type mAppearType;
-    private DisappearEffect.Type mDisappearType;
+    private SizeChangeEffect.Type mSizeChangeType;
     private UnscrambleEffect.Type mUnscrambleType;
-    private int mAppearDuration, mDisappearDuration, mUnscrambleDuration;
+    private int mSizeChangeDuration, mUnscrambleDuration;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -83,14 +83,15 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
       mRemoveRotation        = false;
       mFinishDragCurrent     = false;
       mFinishDragAccumulated = false;
+      mSolveCube             = false;
 
       mCanRotate = true;
       mCanDrag   = true;
 
-      mAppearType        = AppearEffect.Type.SCALE;
-      mDisappearType     = DisappearEffect.Type.SCALE;
-      mAppearDuration    = 1000;
-      mDisappearDuration = 1000;
+      mSizeChangeType    = SizeChangeEffect.Type.TRANSPARENCY;
+      mUnscrambleType    = UnscrambleEffect.Type.SPIN;
+      mSizeChangeDuration= 1000;
+      mUnscrambleDuration= 1000;
 
       mMesh= new MeshFlat(20,20);
       mNextCubeSize =RubikActivity.getSize();
@@ -142,6 +143,14 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
         if( mOldCube!=null ) disappearCube();
         else                    appearCube();
         }
+
+      if( mSolveCube )
+        {
+        mSolveCube = false;
+        mCanDrag   = false;
+        mCanRotate = false;
+        unscrambleCubeNow();
+        }
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -171,9 +180,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
       VertexEffectSink.enable();
-      AppearEffect.enableEffects();
-      DisappearEffect.enableEffects();
-      UnscrambleEffect.enableEffects();
+      SizeChangeEffect.enableEffects();
 
       try
         {
@@ -202,6 +209,11 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
        mCanRotate = true;
        mCanDrag   = true;
        }
+     else if( effectID == mUnscrambleEffectID    )
+       {
+       mCanRotate = true;
+       mCanDrag   = true;
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -210,12 +222,12 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
      {
      try
        {
-       DisappearEffect effect = DisappearEffect.create(mDisappearType);
-       mDisappearEffectID = effect.start(mDisappearDuration,mScreen,mOldCube,this);
+       SizeChangeEffectDisappear effect = SizeChangeEffectDisappear.create(mSizeChangeType);
+       mDisappearEffectID = effect.start(mSizeChangeDuration,mScreen,mOldCube,this);
        }
      catch(Exception ex)
        {
-       android.util.Log.e("Renderer", "failed to create DisappearEffect, exception: "+ex.getMessage());
+       android.util.Log.e("Renderer", "failed to create SizeChangeEffectDisappear, exception: "+ex.getMessage());
        }
      }
 
@@ -225,12 +237,12 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
      {
      try
        {
-       AppearEffect effect = AppearEffect.create(mAppearType);
-       mAppearEffectID = effect.start(mAppearDuration,mScreen,mNewCube,this);
+       SizeChangeEffectAppear effect = SizeChangeEffectAppear.create(mSizeChangeType);
+       mAppearEffectID = effect.start(mSizeChangeDuration,mScreen,mNewCube,this);
        }
      catch(Exception ex)
        {
-       android.util.Log.e("Renderer", "failed to create AppearEffect, exception: "+ex.getMessage());
+       android.util.Log.e("Renderer", "failed to create SizeChangeEffectAppear, exception: "+ex.getMessage());
 
        mScreen.attach(mNewCube); //
        mCanRotate = true;        // just appear the cube
@@ -256,16 +268,9 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setAppearDuration(int duration)
-     {
-     mAppearDuration = duration;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   void setDisappearDuration(int duration)
+   void setSizeChangeDuration(int duration)
      {
-     mDisappearDuration = duration;
+     mSizeChangeDuration = duration;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -277,16 +282,9 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void setAppearType(AppearEffect.Type type)
-     {
-     mAppearType = type;
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   void setDisappearType(DisappearEffect.Type type)
+   void setSizeChangeType(SizeChangeEffectAppear.Type type)
      {
-     mDisappearType = type;
+     mSizeChangeType = type;
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -349,9 +347,28 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   void solveCube()
+   void unscrambleCube()
+     {
+     mSolveCube = true;
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void unscrambleCubeNow()
      {
-     android.util.Log.e("renderer","solving cube");
+     try
+       {
+       UnscrambleEffect effect = UnscrambleEffect.create(mUnscrambleType);
+       mUnscrambleEffectID = effect.start(mUnscrambleDuration,mScreen,mNewCube,this);
+       }
+     catch(Exception ex)
+       {
+       android.util.Log.e("Renderer", "failed to create UnscrambleEffect, exception: "+ex.getMessage());
+
+       mNewCube.unscramble();    //
+       mCanRotate = true;        // just unscramble the cube
+       mCanDrag   = true;        //
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikSettings.java b/src/main/java/org/distorted/magic/RubikSettings.java
index 10bdf7b6..10372d7a 100644
--- a/src/main/java/org/distorted/magic/RubikSettings.java
+++ b/src/main/java/org/distorted/magic/RubikSettings.java
@@ -36,8 +36,7 @@ import android.widget.SeekBar;
 import android.widget.Spinner;
 import android.widget.TextView;
 
-import org.distorted.effect.AppearEffect;
-import org.distorted.effect.DisappearEffect;
+import org.distorted.effect.SizeChangeEffect;
 import org.distorted.effect.UnscrambleEffect;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -46,15 +45,13 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
   {
   public interface OnCompleteListener
     {
-    void onComplete(int aP, int dP, int uP, int aT, int dT, int uT);
+    void onComplete(int sP, int uP, int sT, int uT);
     }
 
   private OnCompleteListener mListener;
-
-  private int mAppearPos, mDisappearPos, mUnscramblePos;
-  private int mAppearType, mDisappearType, mUnscrambleType;
-
-  private TextView mAppearDuration, mDisappearDuration, mUnscrambleDuration;
+  private int mSizeChangePos, mUnscramblePos;
+  private int mSizeChangeType, mUnscrambleType;
+  private TextView mSizeChangeDuration, mUnscrambleDuration;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -84,20 +81,16 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
 
     try
       {
-      mAppearPos     = args.getInt("appearPos");
-      mDisappearPos  = args.getInt("disappearPos");
+      mSizeChangePos = args.getInt("sizechangePos");
       mUnscramblePos = args.getInt("unscramblePos");
-      mAppearType    = args.getInt("appearType");
-      mDisappearType = args.getInt("disappearType");
+      mSizeChangeType= args.getInt("sizechangeType");
       mUnscrambleType= args.getInt("unscrambleType");
       }
     catch(NullPointerException ex)
       {
-      mAppearPos     = RubikActivity.DEFAULT_APPEAR_POS;
-      mDisappearPos  = RubikActivity.DEFAULT_DISAPPEAR_POS;
+      mSizeChangePos = RubikActivity.DEFAULT_SIZECHANGE_POS;
       mUnscramblePos = RubikActivity.DEFAULT_UNSCRAMBLE_POS;
-      mAppearType    = RubikActivity.DEFAULT_APPEAR_TYPE;
-      mDisappearType = RubikActivity.DEFAULT_DISAPPEAR_TYPE;
+      mSizeChangeType= RubikActivity.DEFAULT_SIZECHANGE_TYPE;
       mUnscrambleType= RubikActivity.DEFAULT_UNSCRAMBLE_TYPE;
       }
     }
@@ -125,64 +118,39 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
     final View view = inflater.inflate(R.layout.settings, null);
     builder.setView(view);
 
-    mAppearDuration    = view.findViewById(R.id.appearDurationText);
-    mDisappearDuration = view.findViewById(R.id.disappearDurationText);
+    mSizeChangeDuration= view.findViewById(R.id.sizechangeDurationText);
     mUnscrambleDuration = view.findViewById(R.id.unscrambleDurationText);
 
-    Spinner appearTypeSpinner  = view.findViewById(R.id.appearType);
+    Spinner sizechangeTypeSpinner  = view.findViewById(R.id.sizechangeType);
 
-    if( appearTypeSpinner!=null )
+    if( sizechangeTypeSpinner!=null )
       {
-      appearTypeSpinner.setOnItemSelectedListener(this);
-      String[] appear = getAppearEffectNames();
+      sizechangeTypeSpinner.setOnItemSelectedListener(this);
+      String[] appear = SizeChangeEffect.getNames();
       ArrayAdapter<String> adapterType = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, appear);
       adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-      appearTypeSpinner.setAdapter(adapterType);
+      sizechangeTypeSpinner.setAdapter(adapterType);
 
-      if(mAppearType>=0 && mAppearType<appear.length)
+      if(mSizeChangeType>=0 && mSizeChangeType<appear.length)
         {
-        appearTypeSpinner.setSelection(mAppearType);
+        sizechangeTypeSpinner.setSelection(mSizeChangeType);
         }
       }
     else
       {
-      android.util.Log.e("dialog", "APPEAR TYPE SPINNER NULL!!");
+      android.util.Log.e("dialog", "SIZE CHANGE TYPE SPINNER NULL!!");
       }
 
-    SeekBar appearBar = view.findViewById(R.id.appearDuration);
-    appearBar.setOnSeekBarChangeListener(this);
-    appearBar.setProgress(mAppearPos);
-
-    Spinner disappearTypeSpinner  = view.findViewById(R.id.disappearType);
-
-    if( disappearTypeSpinner!=null )
-      {
-      disappearTypeSpinner.setOnItemSelectedListener(this);
-      String[] disappear = getDisappearEffectNames();
-      ArrayAdapter<String> adapterType = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, disappear);
-      adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-      disappearTypeSpinner.setAdapter(adapterType);
-
-      if(mDisappearType>=0 && mDisappearType<disappear.length)
-        {
-        disappearTypeSpinner.setSelection(mDisappearType);
-        }
-      }
-    else
-      {
-      android.util.Log.e("dialog", "DISAPPEAR TYPE SPINNER NULL!!");
-      }
-
-    SeekBar disappearBar = view.findViewById(R.id.disappearDuration);
-    disappearBar.setOnSeekBarChangeListener(this);
-    disappearBar.setProgress(mDisappearPos);
+    SeekBar sizechangeBar = view.findViewById(R.id.sizechangeDuration);
+    sizechangeBar.setOnSeekBarChangeListener(this);
+    sizechangeBar.setProgress(mSizeChangePos);
 
     Spinner unscrambleTypeSpinner  = view.findViewById(R.id.unscrambleType);
 
     if( unscrambleTypeSpinner!=null )
       {
       unscrambleTypeSpinner.setOnItemSelectedListener(this);
-      String[] unscramble = getUnscrambleEffectNames();
+      String[] unscramble = UnscrambleEffect.getNames();
       ArrayAdapter<String> adapterType = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, unscramble);
       adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
       unscrambleTypeSpinner.setAdapter(adapterType);
@@ -204,59 +172,11 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
     return builder.create();
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    private String[] getAppearEffectNames()
-      {
-      int length = AppearEffect.NUM_EFFECTS;
-      AppearEffect.Type[] types = AppearEffect.Type.values();
-      String[] names = new String[length];
-
-      for( int i=0; i<length; i++)
-        {
-        names[i] = types[i].name();
-        }
-
-      return names;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    private String[] getDisappearEffectNames()
-      {
-      int length = DisappearEffect.NUM_EFFECTS;
-      DisappearEffect.Type[] types = DisappearEffect.Type.values();
-      String[] names = new String[length];
-
-      for( int i=0; i<length; i++)
-        {
-        names[i] = types[i].name();
-        }
-
-      return names;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    private String[] getUnscrambleEffectNames()
-      {
-      int length = UnscrambleEffect.NUM_EFFECTS;
-      UnscrambleEffect.Type[] types = UnscrambleEffect.Type.values();
-      String[] names = new String[length];
-
-      for( int i=0; i<length; i++)
-        {
-        names[i] = types[i].name();
-        }
-
-      return names;
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     private void saveOptions()
       {
-      mListener.onComplete(mAppearPos, mDisappearPos, mUnscramblePos, mAppearType, mDisappearType, mUnscrambleType);
+      mListener.onComplete(mSizeChangePos, mUnscramblePos, mSizeChangeType, mUnscrambleType);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -265,8 +185,7 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
       {
       switch(parent.getId())
         {
-        case R.id.appearType    : mAppearType    = pos; break;
-        case R.id.disappearType : mDisappearType = pos; break;
+        case R.id.sizechangeType: mSizeChangeType= pos; break;
         case R.id.unscrambleType: mUnscrambleType= pos; break;
         }
       }
@@ -277,13 +196,9 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
       {
       switch (bar.getId())
         {
-        case R.id.appearDuration    : mAppearPos   = progress;
-                                      int appear_ms= RubikActivity.translateDuration(mAppearPos);
-                                      mAppearDuration.setText(getString(R.string.ms_placeholder,appear_ms));
-                                      break;
-        case R.id.disappearDuration : mDisappearPos= progress;
-                                      int disappear_ms= RubikActivity.translateDuration(mDisappearPos);
-                                      mDisappearDuration.setText(getString(R.string.ms_placeholder,disappear_ms));
+        case R.id.sizechangeDuration: mSizeChangePos= progress;
+                                      int sizechange_ms= RubikActivity.translateDuration(mSizeChangePos);
+                                      mSizeChangeDuration.setText(getString(R.string.ms_placeholder,sizechange_ms));
                                       break;
         case R.id.unscrambleDuration: mUnscramblePos= progress;
                                       int unscramble_ms= RubikActivity.translateDuration(mUnscramblePos);
diff --git a/src/main/res/layout/main.xml b/src/main/res/layout/main.xml
index 2e74e049..3e575952 100644
--- a/src/main/res/layout/main.xml
+++ b/src/main/res/layout/main.xml
@@ -83,7 +83,7 @@
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:layout_weight="0.5"
-            android:onClick="Solve"
+            android:onClick="Unscramble"
             android:paddingLeft="5dp"
             android:paddingRight="5dp"
             android:text="@string/solve" />
diff --git a/src/main/res/layout/settings.xml b/src/main/res/layout/settings.xml
index d57e73f4..9e1fb2b3 100644
--- a/src/main/res/layout/settings.xml
+++ b/src/main/res/layout/settings.xml
@@ -11,90 +11,7 @@
         android:paddingStart="15dp"
         android:paddingEnd="15dp"
         android:gravity="start|center"
-        android:text="@string/disappear_effect"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:layout_weight="0.5"
-        android:gravity="center|fill_horizontal"
-        android:layout_marginLeft="10dp"
-        android:layout_marginRight="10dp"
-        android:background="@color/grey"
-        android:orientation="vertical">
-
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="36dp"
-            android:gravity="center|fill_horizontal"
-            android:orientation="horizontal">
-
-            <TextView
-                android:layout_weight="0.2"
-                android:layout_width="0dp"
-                android:layout_height="fill_parent"
-                android:paddingStart="5dp"
-                android:paddingEnd="5dp"
-                android:gravity="start|center"
-                android:text="@string/duration"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-            <TextView
-                android:id="@+id/disappearDurationText"
-                android:layout_weight="0.2"
-                android:layout_width="0dp"
-                android:layout_height="fill_parent"
-                android:paddingStart="5dp"
-                android:paddingEnd="5dp"
-                android:gravity="end|center"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-            <SeekBar
-                android:id="@+id/disappearDuration"
-                android:layout_weight="0.6"
-                android:layout_width="0dp"
-                android:layout_height="fill_parent"
-                android:paddingLeft="10dp"
-                android:paddingRight="10dp" />
-
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="36dp"
-            android:gravity="center|fill_horizontal"
-            android:orientation="horizontal">
-
-            <TextView
-                android:layout_weight="0.4"
-                android:layout_width="0dp"
-                android:layout_height="fill_parent"
-                android:paddingStart="5dp"
-                android:paddingEnd="5dp"
-                android:gravity="start|center"
-                android:text="@string/type"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-            <Spinner
-                android:id="@+id/disappearType"
-                android:layout_weight="0.6"
-                android:layout_width="0dp"
-                android:layout_height="fill_parent"
-                android:textAlignment="center"
-                android:paddingLeft="10dp"
-                android:paddingRight="10dp" />
-
-        </LinearLayout>
-    </LinearLayout>
-
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="48dp"
-        android:paddingStart="15dp"
-        android:paddingEnd="15dp"
-        android:gravity="start|center"
-        android:text="@string/appear_effect"
+        android:text="@string/sizechange_effect"
         android:textAppearance="?android:attr/textAppearanceMedium" />
 
     <LinearLayout
@@ -125,7 +42,7 @@
                 android:textAppearance="?android:attr/textAppearanceSmall" />
 
             <TextView
-                android:id="@+id/appearDurationText"
+                android:id="@+id/sizechangeDurationText"
                 android:layout_weight="0.2"
                 android:layout_width="0dp"
                 android:layout_height="fill_parent"
@@ -135,7 +52,7 @@
                 android:textAppearance="?android:attr/textAppearanceSmall" />
 
             <SeekBar
-                android:id="@+id/appearDuration"
+                android:id="@+id/sizechangeDuration"
                 android:layout_weight="0.6"
                 android:layout_width="0dp"
                 android:layout_height="fill_parent"
@@ -161,7 +78,7 @@
                 android:textAppearance="?android:attr/textAppearanceSmall" />
 
             <Spinner
-                android:id="@+id/appearType"
+                android:id="@+id/sizechangeType"
                 android:layout_weight="0.6"
                 android:layout_width="0dp"
                 android:layout_height="fill_parent"
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index a5b1674f..4b9b7fda 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -8,8 +8,7 @@
     <string name="about">About</string>
     <string name="save">SAVE</string>
     <string name="ok">OK</string>
-    <string name="appear_effect">New Cube Appear Effect:</string>
-    <string name="disappear_effect">Old Cube Disappear Effect:</string>
+    <string name="sizechange_effect">Cube Size Change Effect:</string>
     <string name="unscramble_effect">Cube Unscramble Effect:</string>
     <string name="duration">Duration:</string>
     <string name="type">Type:</string>
