commit a4d59c0bd70c9085f31a09372f2f48ff11745f34
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jan 4 23:07:42 2019 +0000

    Massive: make the coordinate system agree with that of OpenGL (i.e. invert the Y axis).

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
index ce0e8c6..2181475 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
@@ -37,8 +37,8 @@ public class AroundTheWorldActivity extends Activity
       super.onCreate(savedState);
       setContentView(R.layout.aroundtheworldlayout);
 
-      AroundTheWorldSurfaceView       view = (AroundTheWorldSurfaceView)       this.findViewById(R.id.aroundTheWorldSurfaceView);
-      AroundTheWorldSurfaceViewPicker pick = (AroundTheWorldSurfaceViewPicker) this.findViewById(R.id.aroundTheWorldSurfaceViewPicker);
+      AroundTheWorldSurfaceView       view = findViewById(R.id.aroundTheWorldSurfaceView);
+      AroundTheWorldSurfaceViewPicker pick = findViewById(R.id.aroundTheWorldSurfaceViewPicker);
       AroundTheWorldEffectsManager    mana = view.getManager();
       AroundTheWorldRendererPicker    renp = pick.getRenderer();
 
@@ -56,7 +56,7 @@ public class AroundTheWorldActivity extends Activity
     @Override
     protected void onPause() 
       {
-      AroundTheWorldSurfaceView view = (AroundTheWorldSurfaceView) this.findViewById(R.id.aroundTheWorldSurfaceView);
+      AroundTheWorldSurfaceView view = findViewById(R.id.aroundTheWorldSurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -69,7 +69,7 @@ public class AroundTheWorldActivity extends Activity
       {
       super.onResume();
 
-      AroundTheWorldSurfaceView view = (AroundTheWorldSurfaceView) this.findViewById(R.id.aroundTheWorldSurfaceView);
+      AroundTheWorldSurfaceView view = findViewById(R.id.aroundTheWorldSurfaceView);
       view.onResume();
       }
  
@@ -89,7 +89,7 @@ public class AroundTheWorldActivity extends Activity
       {
       super.onSaveInstanceState(savedInstanceState);
 
-      AroundTheWorldSurfaceViewPicker pick = (AroundTheWorldSurfaceViewPicker) this.findViewById(R.id.aroundTheWorldSurfaceViewPicker);
+      AroundTheWorldSurfaceViewPicker pick = findViewById(R.id.aroundTheWorldSurfaceViewPicker);
 
       savedInstanceState.putFloat("x", pick.getx() );
       savedInstanceState.putFloat("y", pick.gety() );
@@ -102,7 +102,7 @@ public class AroundTheWorldActivity extends Activity
       {
       super.onRestoreInstanceState(savedInstanceState);
 
-      AroundTheWorldSurfaceViewPicker pick = (AroundTheWorldSurfaceViewPicker) this.findViewById(R.id.aroundTheWorldSurfaceViewPicker);
+      AroundTheWorldSurfaceViewPicker pick = findViewById(R.id.aroundTheWorldSurfaceViewPicker);
 
       float x = savedInstanceState.getFloat("x");
       float y = savedInstanceState.getFloat("y");
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
index e183b1b..7e357e2 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldEffectsManager.java
@@ -151,7 +151,7 @@ class AroundTheWorldEffectsManager
     // WHITENESS
     // Vertex Effects
     wLipsRegion = new Static4D(0,0,0,100);
-    wLipsCenter = new Static3D(300,500,0);
+    wLipsCenter = new Static3D(300,100,0);
     wLipsFactor = new Static1D(0.7f);
     wLipsDyn    = new Dynamic1D();
     wLipsDyn.add(wLipsFactor);
@@ -159,26 +159,26 @@ class AroundTheWorldEffectsManager
     // ASIANNESS
     // Vertex Effects
     aLipsNoseRegion    = new Static4D(0,0,0,267);
-    aLipsNoseCenter    = new Static3D(300,560,0);
+    aLipsNoseCenter    = new Static3D(300, 40,0);
     aLipsNoseDyn       = new Dynamic3D();
     aLipsNoseFactor    = new Static3D(0,0,0);
     aLipsNoseDyn.add(aLipsNoseFactor);
 
     aNoseBroaderRegion = new Static4D(0,0,0,130);
-    aNoseBroaderCenter = new Static3D(300,307,0);
+    aNoseBroaderCenter = new Static3D(300,293,0);
     aNoseBroaderDyn    = new Dynamic2D();
     aNoseBroaderFactor = new Static2D(0,90);
     aNoseBroaderDyn.add(aNoseBroaderFactor);
 
     aNostrilsRegion    = new Static4D(0,0,0,60);
-    aNostrilsCenter    = new Static3D(300,336,0);
+    aNostrilsCenter    = new Static3D(300,264,0);
     aNostrilsDyn       = new Dynamic3D();
     aNostrilsFactor    = new Static3D(0,0,0);
     aNostrilsDyn.add(aNostrilsFactor);
 
     aEyesRegion        = new Static4D(0,0,0,83);
-    aLEyeCenter        = new Static3D(176,230,0);
-    aREyeCenter        = new Static3D(420,230,0);
+    aLEyeCenter        = new Static3D(176,370,0);
+    aREyeCenter        = new Static3D(420,370,0);
     aLEyeDyn           = new Dynamic1D();
     aREyeDyn           = new Dynamic1D();
     aLEyeFactor        = new Static1D(0);
@@ -187,7 +187,7 @@ class AroundTheWorldEffectsManager
     aREyeDyn.add(aREyeFactor);
 
     aEyebrowsRegion    = new Static4D(0,0,0,142);
-    aEyebrowsCenter    = new Static3D(300,100,0);
+    aEyebrowsCenter    = new Static3D(300,500,0);
     aEyebrowsDyn       = new Dynamic3D();
     aEyebrowsFactor    = new Static3D(0,0,0);
     aEyebrowsDyn.add(aEyebrowsFactor);
@@ -195,9 +195,9 @@ class AroundTheWorldEffectsManager
     // Fragment Effects
     aSkinColorCenter   = new Static3D(300,300,0);
     aSkinColorRegion   = new Static3D(600,600,600);
-    aLEyeColorCenter   = new Static3D(172,230,0);
+    aLEyeColorCenter   = new Static3D(172,370,0);
     aLEyeColorRegion   = new Static3D(29,25,25);
-    aREyeColorCenter   = new Static3D(423,230,0);
+    aREyeColorCenter   = new Static3D(423,370,0);
     aREyeColorRegion   = new Static3D(29,25,25);
 
     aChromaSkin        = new Static3D(0.5f, 0.5f, 0.5f);
@@ -219,25 +219,25 @@ class AroundTheWorldEffectsManager
     bFaceDyn.add(bFaceFactor);
 
     bTipLowerRegion    = new Static4D(0,0,0,41);
-    bTipLowerCenter    = new Static3D(300,393,0);
+    bTipLowerCenter    = new Static3D(300,207,0);
     bTipLowerFactor    = new Static3D(0,0,0);
     bTipLowerDyn       = new Dynamic3D();
     bTipLowerDyn.add(bTipLowerFactor);
 
     bWholeNoseRegion   = new Static4D(0,0,0,130);
-    bWholeNoseCenter   = new Static3D(300,357,0);
+    bWholeNoseCenter   = new Static3D(300,243,0);
     bWholeNoseFactor   = new Static2D(1.0f,90.0f);
     bWholeNoseDyn      = new Dynamic2D();
     bWholeNoseDyn.add(bWholeNoseFactor);
 
     bNoseBroaderRegion = new Static4D(0,0,0,95);
-    bNoseBroaderCenter = new Static3D(300,408,0);
+    bNoseBroaderCenter = new Static3D(300,192,0);
     bNoseBroaderFactor = new Static2D(1.0f,90.0f);
     bNoseBroaderDyn    = new Dynamic2D();
     bNoseBroaderDyn.add(bNoseBroaderFactor);
 
-    bLipsRegion        = new Static4D(0,96,0,118);
-    bLipsCenter        = new Static3D(300,458,0);
+    bLipsRegion        = new Static4D(0,-96,0,118);
+    bLipsCenter        = new Static3D(300,142,0);
     bLipsFactor        = new Static2D(1.0f,0.0f);
     bLipsDyn           = new Dynamic2D();
     bLipsDyn.add(bLipsFactor);
@@ -245,13 +245,13 @@ class AroundTheWorldEffectsManager
     // Fragment Effects
     bSkinColorCenter     = new Static3D(300,300,0);
     bSkinColorRegion     = new Static3D(600,600,600);
-    bLEyeColorCenter     = new Static3D(158,241,0);
+    bLEyeColorCenter     = new Static3D(158,359,0);
     bLEyeColorRegion     = new Static3D(55,24,50);
-    bREyeColorCenter     = new Static3D(436,241,0);
+    bREyeColorCenter     = new Static3D(436,359,0);
     bREyeColorRegion     = new Static3D(55,24,50);
-    bLPupilColorCenter   = new Static3D(166,230,0);
+    bLPupilColorCenter   = new Static3D(166,370,0);
     bLPupilColorRegion   = new Static3D(28,23,25);
-    bRPupilColorCenter   = new Static3D(431,230,0);
+    bRPupilColorCenter   = new Static3D(431,370,0);
     bRPupilColorRegion   = new Static3D(28,23,25);
 
     bChromaSkin        = new Static3D(0.4f, 0.25f, 0.25f);
@@ -323,19 +323,19 @@ class AroundTheWorldEffectsManager
     wLipsFactor.set(1.0f-0.3f*mWhiteness);
 
     // ASIANNESS
-    aLipsNoseFactor.set2(-23.0f*mAsianness);
+    aLipsNoseFactor.set2(23.0f*mAsianness);
     aNoseBroaderFactor.set1(1.0f+0.85f*mAsianness);
-    aNostrilsFactor.set2(-12.0f*mAsianness);
+    aNostrilsFactor.set2(12.0f*mAsianness);
     aLEyeFactor.set(+10.0f*mAsianness);
     aREyeFactor.set(-10.0f*mAsianness);
-    aEyebrowsFactor.set2(-40.0f*mAsianness);
+    aEyebrowsFactor.set2(40.0f*mAsianness);
 
     aChromaSkinFactor.set(0.2f*mAsianness);
     aChromaEyesFactor.set(0.7f*mAsianness);
 
     // BLACKNESS
     bFaceFactor.set1(1.0f + 0.1f*mBlackness);
-    bTipLowerFactor.set2(23.0f*mBlackness);
+    bTipLowerFactor.set2(-23.0f*mBlackness);
     bWholeNoseFactor.set1(1.0f+0.5f*mBlackness);
     bNoseBroaderFactor.set1(1.0f+0.38f*mBlackness);
     bLipsFactor.set1(1.0f+1.0f*mBlackness);
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
index 7a72aa9..298716e 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
@@ -97,8 +97,8 @@ class AroundTheWorldSurfaceViewPicker extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-
-    @Override public boolean onTouchEvent(MotionEvent event)
+    @Override
+    public boolean onTouchEvent(MotionEvent event)
       {
       int x = (int)event.getX();
       int y = (int)event.getY();
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 1e22270..3554fd0 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -61,29 +61,29 @@ class BeanRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
      
-      Static3D pointLeft  = new Static3D( 98, 183, 0);
-      Static3D pointRight = new Static3D(233, 140, 0);
-      Static4D regionLeft = new Static4D( -3,-33, 0,47);
-      Static4D regionRight= new Static4D(-14,-33, 0,47);
+      Static3D pointLeft  = new Static3D( 98, 297, 0);
+      Static3D pointRight = new Static3D(233, 340, 0);
+      Static4D regionLeft = new Static4D( -3, 33, 0, 47);
+      Static4D regionRight= new Static4D(-14, 33, 0, 47);
       Dynamic3D dynLeft   = new Dynamic3D(2000,0.0f);
       Dynamic3D dynRight  = new Dynamic3D(2000,0.0f);
 
-      Static3D p1 = new Static3D(  0,  0, 0);
-      Static3D p2 = new Static3D(-15,-30, 0);
+      Static3D vect1 = new Static3D(  0,  0, 0);
+      Static3D vect2 = new Static3D(-15, 30, 0);
 
-      dynLeft.add(p1);
-      dynLeft.add(p1);
-      dynLeft.add(p1);
-      dynLeft.add(p1);
-      dynLeft.add(p2);
-      dynLeft.add(p2);
+      dynLeft.add(vect1);
+      dynLeft.add(vect1);
+      dynLeft.add(vect1);
+      dynLeft.add(vect1);
+      dynLeft.add(vect2);
+      dynLeft.add(vect2);
       
-      dynRight.add(p1);
-      dynRight.add(p2);
-      dynRight.add(p2);
-      dynRight.add(p1);
-      dynRight.add(p1);
-      dynRight.add(p1);
+      dynRight.add(vect1);
+      dynRight.add(vect2);
+      dynRight.add(vect2);
+      dynRight.add(vect1);
+      dynRight.add(vect1);
+      dynRight.add(vect1);
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
@@ -91,7 +91,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
       mEffects = new DistortedEffects();
       mEffects.apply( new VertexEffectDistort(dynLeft , pointLeft , regionLeft) );
       mEffects.apply( new VertexEffectDistort(dynRight, pointRight, regionRight));
-      mEffects.apply( new MatrixEffectMove(mMove) );
+      mEffects.apply( new MatrixEffectMove (mMove ) );
       mEffects.apply( new MatrixEffectScale(mScale) );
 
       mScreen = new DistortedScreen();
@@ -152,6 +152,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
      if( mTexture==null ) mTexture = new DistortedTexture(mObjWidth,mObjHeight);
      mTexture.setTexture(bitmap);
      if( mMesh==null ) mMesh = new MeshFlat(25,25*mObjHeight/mObjWidth);
+
      mScreen.detachAll();
      mScreen.attach(mTexture,mEffects,mMesh);
 
diff --git a/src/main/java/org/distorted/examples/blur/BlurActivity.java b/src/main/java/org/distorted/examples/blur/BlurActivity.java
index b1b389b..78671b4 100644
--- a/src/main/java/org/distorted/examples/blur/BlurActivity.java
+++ b/src/main/java/org/distorted/examples/blur/BlurActivity.java
@@ -42,8 +42,8 @@ public class BlurActivity extends Activity  implements OnSeekBarChangeListener
       {
       super.onCreate(icicle);
       setContentView(R.layout.blurlayout);
-      textBlur = (TextView)findViewById(R.id.blurText);
-      SeekBar bar = (SeekBar)findViewById(R.id.blurSeek);
+      textBlur = findViewById(R.id.blurText);
+      SeekBar bar = findViewById(R.id.blurSeek);
       bar.setOnSeekBarChangeListener(this);
       bar.setProgress(50);
       }
@@ -53,7 +53,7 @@ public class BlurActivity extends Activity  implements OnSeekBarChangeListener
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.blurSurfaceView);
+      GLSurfaceView view = findViewById(R.id.blurSurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -65,7 +65,7 @@ public class BlurActivity extends Activity  implements OnSeekBarChangeListener
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.blurSurfaceView);
+      GLSurfaceView view = findViewById(R.id.blurSurfaceView);
       view.onResume();
       }
  
@@ -82,7 +82,7 @@ public class BlurActivity extends Activity  implements OnSeekBarChangeListener
     
     public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) 
       {
-      BlurSurfaceView view = (BlurSurfaceView) this.findViewById(R.id.blurSurfaceView);
+      BlurSurfaceView view = findViewById(R.id.blurSurfaceView);
 
       switch (bar.getId()) 
         {
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 37a238e..26e90c2 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -40,7 +40,6 @@ import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -75,9 +74,9 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
       moveDyn.add(mMove);
       moveDyn.add(new Static3D(0,0,0));
 
-      Static3D chromaCenter= new Static3D( 530, 200, 0   );
+      Static3D chromaCenter= new Static3D( 530, 300, 0   );
       Static3D chromaRegion= new Static3D( 100, 100, 100 );
-      Static3D alphaCenter = new Static3D( 230, 200, 0   );
+      Static3D alphaCenter = new Static3D( 230, 300, 0   );
       Static3D alphaRegion = new Static3D( 100, 100, 100 );
 
       Dynamic1D chromaDyn = new Dynamic1D(3000,0.0f);
@@ -156,7 +155,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
         }
       catch(Exception ex)
         {
-        android.util.Log.e("Renderer", ex.getMessage() );
+        android.util.Log.e("CatAndDog", ex.getMessage() );
         }
       }
 }
diff --git a/src/main/java/org/distorted/examples/check/CheckActivity.java b/src/main/java/org/distorted/examples/check/CheckActivity.java
index 21fe15e..b38d362 100644
--- a/src/main/java/org/distorted/examples/check/CheckActivity.java
+++ b/src/main/java/org/distorted/examples/check/CheckActivity.java
@@ -44,8 +44,8 @@ public class CheckActivity extends Activity
       super.onCreate(icicle);
       setContentView(R.layout.check1layout);
        
-      mVPicker = (NumberPicker)findViewById(R.id.check1NumberPickerVertex);
-      mFPicker = (NumberPicker)findViewById(R.id.check1NumberPickerFragment);
+      mVPicker = findViewById(R.id.check1NumberPickerVertex);
+      mFPicker = findViewById(R.id.check1NumberPickerFragment);
       
       mVPicker.setMaxValue(1000);
       mVPicker.setMinValue(   0);
@@ -76,7 +76,7 @@ public class CheckActivity extends Activity
     @Override
     protected void onPause() 
       {
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.checkSurfaceView);
+      GLSurfaceView mView = findViewById(R.id.checkSurfaceView);
       if( mView!=null ) mView.onPause();
 
       Distorted.onPause();
@@ -90,7 +90,7 @@ public class CheckActivity extends Activity
       {
       super.onResume();
       
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.checkSurfaceView);
+      GLSurfaceView mView = findViewById(R.id.checkSurfaceView);
       if( mView!=null ) mView.onResume();    
       }
  
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 1b1de10..488be22 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -143,21 +143,16 @@ class CheckRenderer implements GLSurfaceView.Renderer
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-      { 
-      if( (float)mObjHeight/mObjWidth > (float)height/width )
-        {
-        int w = (height*mObjWidth)/mObjHeight;
-        float factor = (float)height/mObjHeight;
-        mMove.set((width-w)/2,0,0);
-        mScale.set(factor,factor,factor);
-        }
-      else
-        {
-        int h = (width*mObjHeight)/mObjWidth;
-        float factor = (float)width/mObjWidth;
-        mMove.set(0,(height-h)/2,0);
-        mScale.set(factor,factor,factor);
-        }
+      {
+      final float SCALE = 0.9f;
+
+      float xW = (float)width /mObjWidth;
+      float xH = (float)height/mObjHeight;
+
+      float factor = xW>xH ? SCALE*xH : SCALE*xW;
+
+      mMove.set( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0);
+      mScale.set(factor,factor,factor);
 
       mScreen.resize(width,height);
       }
@@ -196,7 +191,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
       mSwirl1.set (          0, mObjHeight/2, 0);
       mSwirl2.set (mObjWidth  , mObjHeight/2, 0);
       mDeform1.set(          0,         0   , 0);
-      mDeform2.set(          0,-mObjHeight  , 0);
+      mDeform2.set(          0, mObjHeight  , 0);
       mCenter.set (mObjWidth/2,         0   , 0);
 
       try
diff --git a/src/main/java/org/distorted/examples/deform/DeformActivity.java b/src/main/java/org/distorted/examples/deform/DeformActivity.java
index 60c00be..0463dc8 100644
--- a/src/main/java/org/distorted/examples/deform/DeformActivity.java
+++ b/src/main/java/org/distorted/examples/deform/DeformActivity.java
@@ -47,15 +47,15 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       super.onCreate(savedState);
       setContentView(R.layout.deformlayout);
 
-      textR = (TextView)findViewById(R.id.deformTextRadius);
+      textR = findViewById(R.id.deformTextRadius);
 
-      SeekBar barR = (SeekBar)findViewById(R.id.deformSeekRadius);
+      SeekBar barR = findViewById(R.id.deformSeekRadius);
       barR.setOnSeekBarChangeListener(this);
 
       if( savedState==null )
         {
         barR.setProgress(50);
-        RadioButton effect = (RadioButton)findViewById(R.id.deformDistortButton);
+        RadioButton effect = findViewById(R.id.deformDistortButton);
         effect.setChecked(true);
         Distort(null);
         }
@@ -66,7 +66,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
     @Override
     protected void onPause() 
       {
-      DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
+      DeformSurfaceView view = findViewById(R.id.deformSurfaceView);
 
       Distorted.onPause();
       view.onPause();
@@ -80,7 +80,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       {
       super.onResume();
       
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.deformSurfaceView);
+      GLSurfaceView view = findViewById(R.id.deformSurfaceView);
       view.onResume();
       }
  
@@ -97,7 +97,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
     
     public void Distort(View v)
       {
-      DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
+      DeformSurfaceView view = findViewById(R.id.deformSurfaceView);
       view.getRenderer().setMode(EffectName.DISTORT);
       mCurrEffect = EffectName.DISTORT;
       }     
@@ -106,7 +106,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
 
     public void Deform(View v)
       {
-      DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
+      DeformSurfaceView view = findViewById(R.id.deformSurfaceView);
       view.getRenderer().setMode(EffectName.DEFORM);
       mCurrEffect = EffectName.DEFORM;
       }       
@@ -115,7 +115,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
 
     public void Shear(View v)
       {
-      DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
+      DeformSurfaceView view = findViewById(R.id.deformSurfaceView);
       view.getRenderer().setMode(EffectName.SHEAR);
       mCurrEffect = EffectName.SHEAR;
       }       
@@ -149,7 +149,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       {
       switch (bar.getId()) 
         {
-        case R.id.deformSeekRadius: DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
+        case R.id.deformSeekRadius: DeformSurfaceView view = findViewById(R.id.deformSurfaceView);
                                     view.getRenderer().setRegionRadius(progress);
                                     textR.setText(getString(R.string.radius_placeholder,(progress<100 ? (""+progress): "Infinity") ));
                                     break;
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 65e5843..3b8d167 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -81,9 +81,9 @@ class DeformRenderer implements GLSurfaceView.Renderer
       mView = view;
 
       stretchEffects = new DistortedEffects();
-      mRegion = new Static4D(0,0,0,0);
-      mMove   = new Static3D(0,0,0);
-      mTouchPoint= new Static3D(0,0,0);
+      mRegion     = new Static4D(0,0,0,0);
+      mMove       = new Static3D(0,0,0);
+      mTouchPoint = new Static3D(0,0,0);
 
       // DISTORT
       Dynamic3D releasedDistortDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
@@ -136,12 +136,12 @@ class DeformRenderer implements GLSurfaceView.Renderer
       mScreen = new DistortedScreen();
       mScreen.showFPS();
 
-      mMovingDistort   = new VertexEffectDistort(movingDistortDynamic, mTouchPoint, mRegion);
-      mMovingDeform    = new VertexEffectDeform(movingDeformDynamic, mTouchPoint, mRegion);
-      mMovingShear     = new MatrixEffectShear(movingShearDynamic, mTouchPoint);
-      mReleasedDistort = new VertexEffectDistort(releasedDistortDynamic, mTouchPoint, mRegion);
-      mReleasedDeform  = new VertexEffectDeform(releasedDeformDynamic, mTouchPoint, mRegion);
-      mReleasedShear   = new MatrixEffectShear(releasedShearDynamic, mTouchPoint);
+      mMovingDistort   = new VertexEffectDistort( movingDistortDynamic  , mTouchPoint, mRegion);
+      mMovingDeform    = new VertexEffectDeform ( movingDeformDynamic   , mTouchPoint, mRegion);
+      mMovingShear     = new MatrixEffectShear  ( movingShearDynamic    , mTouchPoint         );
+      mReleasedDistort = new VertexEffectDistort( releasedDistortDynamic, mTouchPoint, mRegion);
+      mReleasedDeform  = new VertexEffectDeform ( releasedDeformDynamic , mTouchPoint, mRegion);
+      mReleasedShear   = new MatrixEffectShear  ( releasedShearDynamic  , mTouchPoint         );
 
       stretchEffects.apply(new MatrixEffectMove(mMove));
       }
@@ -195,8 +195,8 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
      for(int i=0; i<=NUM_LINES ; i++ )
        {
-       stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , paint);
-       stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, paint);
+       stretchCanvas.drawRect(w*i/NUM_LINES-1,               0, w*i/NUM_LINES+1, h              , paint);
+       stretchCanvas.drawRect(              0, h*i/NUM_LINES-1, w              , h*i/NUM_LINES+1, paint);
        }
 
      if( stretchTexture==null ) stretchTexture = new DistortedTexture(w,h);
@@ -231,15 +231,15 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
    void down(int x, int y)
      {
-     int xt = x-scrWidth/4;
+     int xt = x-scrWidth /4;
      int yt = y-scrHeight/4;
       
      if( xt<0 ) xt=0;
-     if( xt>scrWidth/2 ) xt=scrWidth/2;
+     if( xt>scrWidth /2 ) xt=scrWidth/2;
      if( yt<0 ) yt=0;
      if( yt>scrHeight/2 ) yt=scrHeight/2;
       
-     mTouchPoint.set(xt,yt,0);
+     mTouchPoint.set(xt, scrHeight/2-yt,0);   // OpenGL coord system and 2D coords have inverted Y axis
 
      switch(mMode)
        {
@@ -264,11 +264,11 @@ class DeformRenderer implements GLSurfaceView.Renderer
      {
      switch(mMode)
        {
-       case DISTORT: vDistort[0].set(x,y,0);
+       case DISTORT: vDistort[0].set(x,-y,0);
                      break;
-       case DEFORM:  vDeform[0].set(x,y,0);
+       case DEFORM:  vDeform[0].set(x,-y,0);
                      break;
-       case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2), 0);
+       case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)(-y)/(scrHeight/2), 0);
                      break;
        }
      }
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index eff3850..62867dd 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -69,7 +69,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       Dynamic3D dDistort = new Dynamic3D(3000,0.0f);
       dDistort.add(new Static3D( 25,0,0));
       dDistort.add(new Static3D(-25,0,0));
-      Static3D mPoint = new Static3D(305, 380, 0);
+      Static3D mPoint = new Static3D(305, 220, 0);
 
       mEffects = new DistortedEffects[NUM];
       mEffects[0] = new DistortedEffects();
@@ -78,7 +78,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
 
       // Add the effects only to the first queue - all VERTEX and FRAGMENT effects are shared!
       // (Matrix effect cannot be shared as we have to display each Texture in a different location)
-      VertexEffectSink sink = new VertexEffectSink(new Static1D(8), mPoint, new Static4D(0,0,80,80));
+      VertexEffectSink sink = new VertexEffectSink(new Static1D(8), mPoint, new Static4D(0,0,0,80));
       VertexEffectDistort distort = new VertexEffectDistort(dDistort,mPoint);
       mEffects[0].apply(sink);    // enlarge the nose
       mEffects[0].apply(distort); // keep moving the whole bitmap left and right.
@@ -106,7 +106,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    private Bitmap readBitmap(int id)
      {
      InputStream is = mView.getContext().getResources().openRawResource(id);
-     Bitmap bitmap=null;
+     Bitmap bitmap;
            
      try 
        {
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 6c66cbb..18a2076 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -69,15 +69,15 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
       mView = v;
       
       // mEffects[0] effects
-      Static3D pLeft = new Static3D(214, 206, 0);
-      Static3D pRight= new Static3D(390, 212, 0);
+      Static3D pLeft = new Static3D(214, 394, 0);
+      Static3D pRight= new Static3D(390, 388, 0);
       Static4D RegionEye = new Static4D(0,0,0,60);
       
       // mEffects[1] effects
       Dynamic3D dyn = new Dynamic3D(1000,0.0f);
       dyn.add(new Static3D( 50,0,0));
       dyn.add(new Static3D(-50,0,0));
-      Static3D pNose1 = new Static3D(305, 340, 0);
+      Static3D pNose1 = new Static3D(305, 260, 0);
       
       // we don't need to prepare anything for mEffects[2] effects
 
diff --git a/src/main/java/org/distorted/examples/earth/EarthRenderer.java b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
index b61fb59..0da7c18 100644
--- a/src/main/java/org/distorted/examples/earth/EarthRenderer.java
+++ b/src/main/java/org/distorted/examples/earth/EarthRenderer.java
@@ -187,7 +187,7 @@ class EarthRenderer implements GLSurfaceView.Renderer
 
       float factor = xW>xH ? mLevel*xH : mLevel*xW;
 
-      mMove.set( (mScrWidth-factor*mObjWidth)/2 , (mScrHeight-factor*mObjHeight)/2 , 0);
+      mMove.set( (mScrWidth-factor*mObjWidth)/2 , (mScrHeight-factor*mObjHeight)/2 , -factor*mObjDepth );
       mScaleFactor.set(factor,factor,factor);
       }
 
@@ -205,7 +205,7 @@ class EarthRenderer implements GLSurfaceView.Renderer
       double cosLAT = Math.cos(latitude);
 
       float x = (float)(sinLON*cosLAT)/2.0f;
-      float y = (float)        sinLAT /2.0f;
+      float y = (float)       -sinLAT /2.0f;
       float z = (float)(cosLON*cosLAT)/2.0f;
 
       Static3D center = new Static3D( (0.5f+x)*mObjWidth, (0.5f+y)*mObjHeight, (0.5f+z)*mObjDepth);
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
index 3f79a28..1473ccb 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
@@ -65,10 +65,10 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     mPosName = 0;
     mPosType = 0;
 
-    mAdd  = (Spinner)findViewById(R.id.effects2d_spinnerAdd );
-    mID   = (Spinner)findViewById(R.id.effects2d_spinnerID  );
-    mName = (Spinner)findViewById(R.id.effects2d_spinnerName);
-    mType = (Spinner)findViewById(R.id.effects2d_spinnerType);
+    mAdd  = findViewById(R.id.effects2d_spinnerAdd );
+    mID   = findViewById(R.id.effects2d_spinnerID  );
+    mName = findViewById(R.id.effects2d_spinnerName);
+    mType = findViewById(R.id.effects2d_spinnerType);
 
     mAdd.setOnItemSelectedListener(this);
     mID.setOnItemSelectedListener(this);
@@ -101,7 +101,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
     mType.setAdapter(adapterType);
 
-    mLayoutList = (TableLayout)findViewById(R.id.effects2dTableList);
+    mLayoutList = findViewById(R.id.effects2dTableList);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -111,7 +111,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     {
     super.onResume();
       
-    GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+    GLSurfaceView mView = findViewById(R.id.effects2dSurfaceView);
     mView.onResume();
     }
 
@@ -120,7 +120,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
   @Override
   protected void onPause() 
     {
-    GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+    GLSurfaceView mView = findViewById(R.id.effects2dSurfaceView);
     mView.onPause();
 
     Distorted.onPause();
@@ -150,7 +150,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     {
     switch(parent.getId())
       {
-      case R.id.effects2d_spinnerAdd : EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+      case R.id.effects2d_spinnerAdd : EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
                                        v.setEffect(pos); break;
       case R.id.effects2d_spinnerID  : mPosID   = pos; break;
       case R.id.effects2d_spinnerName: mPosName = pos; break;
@@ -171,7 +171,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     try
       {
       Long currEffect = (Long)mID.getItemAtPosition(mPosID);
-      EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+      EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
       v.getRenderer().getEffects().abortById(currEffect);
       }
     catch(IndexOutOfBoundsException ex)
@@ -196,7 +196,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       default: name = EffectName.CONTRAST     ;
       }
 
-    EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+    EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
     v.getRenderer().getEffects().abortByName(name);
     }
 
@@ -213,7 +213,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       default: type = EffectType.MATRIX;
       }
 
-    EffectQueueSurfaceView v = (EffectQueueSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
+    EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
     v.getRenderer().getEffects().abortByType(type);
     }
 
@@ -230,7 +230,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
 
       TextView b1 = new TextView(this);
-      b1.setText("ID: "+effect.getID());
+      b1.setText(getString(R.string.effect_id_placeholder,effect.getID()));
       b1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b1);
 
@@ -245,7 +245,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
       tr.addView(b3);
 
       TextView b4 = new TextView(this);
-      b4.setText("LIVE");
+      b4.setText(R.string.effect_live);
       b4.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
       tr.addView(b4);
 
@@ -297,7 +297,7 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
         if( row!=null )
           {
           TextView v = (TextView)row.getVirtualChildAt(3);
-          v.setText("FINISHED");
+          v.setText(R.string.effect_finished);
           }
         }
       });
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index 7704579..f4b0506 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -107,8 +107,8 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
 
     for(int i=0; i<=NUMLINES ; i++ )
       {
-      canvas.drawRect(texWidth*i/NUMLINES - 1,                       0,  texWidth*i/NUMLINES + 1,  texHeight               , mPaint);
-      canvas.drawRect(                      0, texHeight*i/NUMLINES -1,  texWidth               ,  texHeight*i/NUMLINES + 1, mPaint);
+      canvas.drawRect(texWidth*i/NUMLINES-1,                      0, texWidth*i/NUMLINES+1, texHeight             , mPaint);
+      canvas.drawRect(                    0, texHeight*i/NUMLINES-1, texWidth             , texHeight*i/NUMLINES+1, mPaint);
       }
     mTexture.setTexture(bitmap);
 
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
index 234e889..c68c1ef 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
@@ -26,6 +26,7 @@ import android.opengl.GLSurfaceView;
 import android.view.MotionEvent;
 import android.util.AttributeSet;
 
+import org.distorted.library.effect.Effect;
 import org.distorted.library.effect.FragmentEffectAlpha;
 import org.distorted.library.effect.FragmentEffectChroma;
 import org.distorted.library.effect.FragmentEffectSaturation;
@@ -47,12 +48,12 @@ public class EffectQueueSurfaceView extends GLSurfaceView
   private int mCurrentEffect;
   private int mScrW, mScrH;
     
-  private Static4D mRegionV;
   private Dynamic1D mInterA, mInterB, mInterC, mInterS;
   private Dynamic3D mInterD;
 
-  private final static Static3D mRED    = new Static3D(1,0,0);
-  private final static Static3D mREGION = new Static3D(RADIUS,RADIUS,RADIUS);
+  private final static Static3D RED      = new Static3D(1,0,0);
+  private final static Static3D REGION_F = new Static3D(RADIUS,RADIUS,RADIUS);
+  private final static Static4D REGION_V = new Static4D(0,0,0,RADIUS);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
@@ -97,8 +98,7 @@ public class EffectQueueSurfaceView extends GLSurfaceView
       final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
       setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(mRenderer);
-      mRegionV= new Static4D(0,0,0,RADIUS);
-      setEffect(0);  
+      setEffect(0);
       }
     }
 
@@ -126,38 +126,41 @@ public class EffectQueueSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-  @Override public boolean onTouchEvent(MotionEvent event) 
+  @Override
+  public boolean onTouchEvent(MotionEvent event)
     {
     int x,y,action = event.getAction();
+    Effect effect;
     boolean success;
 
     switch(action)
       {
-      case MotionEvent.ACTION_DOWN: x = (int)event.getX()* mRenderer.BWID/mScrW;
-                                    y = (int)event.getY()* mRenderer.BHEI/mScrH;
+      case MotionEvent.ACTION_DOWN: x =                          (int)event.getX()* EffectQueueRenderer.BWID/mScrW;
+                                    y = EffectQueueRenderer.BHEI-(int)event.getY()* EffectQueueRenderer.BHEI/mScrH;
                                     EffectQueueActivity act = (EffectQueueActivity)getContext();
+                                    Static3D center = new Static3D(x,y,0);
 
                                     switch(mCurrentEffect)
                                       {
-                                      case 0: VertexEffectDistort distort = new VertexEffectDistort(mInterD, new Static3D(x,y,0), mRegionV);
-                                              success = mRenderer.getEffects().apply(distort);
-                                              act.effectAdded(success,distort);
+                                      case 0: effect = new VertexEffectDistort     (mInterD,      center, REGION_V);
+                                              success= mRenderer.getEffects().apply(effect);
+                                              act.effectAdded(success,effect);
                                               break;
-                                      case 1: VertexEffectSink sink = new VertexEffectSink(mInterS, new Static3D(x,y,0), mRegionV);
-                                              success = mRenderer.getEffects().apply(sink);
-                                              act.effectAdded(success,sink);
+                                      case 1: effect = new VertexEffectSink        (mInterS,      center, REGION_V);
+                                              success= mRenderer.getEffects().apply(effect);
+                                              act.effectAdded(success,effect);
                                               break;
-                                      case 2: FragmentEffectAlpha alpha = new FragmentEffectAlpha(mInterA, new Static3D(x,y,0), mREGION, true);
-                                              success = mRenderer.getEffects().apply(alpha);
-                                              act.effectAdded(success,alpha);
+                                      case 2: effect = new FragmentEffectAlpha     (mInterA,      center, REGION_F, true);
+                                              success= mRenderer.getEffects().apply(effect);
+                                              act.effectAdded(success,effect);
                                               break;
-                                      case 3: FragmentEffectSaturation saturation = new FragmentEffectSaturation(mInterB, new Static3D(x,y,0), mREGION, false);
-                                              success = mRenderer.getEffects().apply(saturation);
-                                              act.effectAdded(success,saturation);
+                                      case 3: effect = new FragmentEffectSaturation(mInterB,      center, REGION_F, false);
+                                              success= mRenderer.getEffects().apply(effect);
+                                              act.effectAdded(success,effect);
                                               break;
-                                      case 4: FragmentEffectChroma chroma = new FragmentEffectChroma(mInterC, mRED, new Static3D(x,y,0), mREGION, true);
-                                              success = mRenderer.getEffects().apply(chroma);
-                                              act.effectAdded(success,chroma);
+                                      case 4: effect = new FragmentEffectChroma    (mInterC, RED, center, REGION_F, true);
+                                              success= mRenderer.getEffects().apply(effect);
+                                              act.effectAdded(success,effect);
                                               break;
                                       }
 
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
index de5f354..a01d40a 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
@@ -253,7 +253,7 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
       mRegionPoint.set(mFactorObj*act.getRegionX(),-mFactorObj*act.getRegionY(),0);
       mFactorReg = 2*mFactorObj*act.getRegionR()/regionSize;
       mRegionScalePoint.set(mFactorReg,mFactorReg,mFactorReg);
-      mMoveObject.set( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , 0 );
+      mMoveObject.set( (width-mFactorObj*mObjWidth)/2 , (height-mFactorObj*mObjHeight)/2 , -mFactorObj*mObjDepth );
       mRotateCen.set(width/2,height/2, 0);
       mScaleObject.set(mFactorObj,mFactorObj,mFactorObj);
       mMoveCenter.set( (width -factorCen*centerSize-mFactorObj*mObjWidth )/2 ,
diff --git a/src/main/java/org/distorted/examples/flag/FlagActivity.java b/src/main/java/org/distorted/examples/flag/FlagActivity.java
index f6f64cf..fe554db 100644
--- a/src/main/java/org/distorted/examples/flag/FlagActivity.java
+++ b/src/main/java/org/distorted/examples/flag/FlagActivity.java
@@ -48,15 +48,15 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
 
       mNoise = new Static5D(0,0,0,0,0);
 
-      textAmplitude = (TextView)findViewById(R.id.flagAmplitude);
-      textLength    = (TextView)findViewById(R.id.flagLength);
-      textAngleA    = (TextView)findViewById(R.id.flagAngleA);
-      textAngleB    = (TextView)findViewById(R.id.flagAngleB);
+      textAmplitude = findViewById(R.id.flagAmplitude);
+      textLength    = findViewById(R.id.flagLength);
+      textAngleA    = findViewById(R.id.flagAngleA);
+      textAngleB    = findViewById(R.id.flagAngleB);
 
-      SeekBar barAmplitude  = (SeekBar)findViewById(R.id.flagSeekAmplitude);
-      SeekBar barLength     = (SeekBar)findViewById(R.id.flagSeekLength);
-      SeekBar barAngleA     = (SeekBar)findViewById(R.id.flagSeekAngleA);
-      SeekBar barAngleB     = (SeekBar)findViewById(R.id.flagSeekAngleB);
+      SeekBar barAmplitude  = findViewById(R.id.flagSeekAmplitude);
+      SeekBar barLength     = findViewById(R.id.flagSeekLength);
+      SeekBar barAngleA     = findViewById(R.id.flagSeekAngleA);
+      SeekBar barAngleB     = findViewById(R.id.flagSeekAngleB);
 
       barAmplitude.setOnSeekBarChangeListener(this);
       barLength.setOnSeekBarChangeListener(this);
@@ -68,15 +68,15 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
       barAngleA.setProgress(25);
       barAngleB.setProgress(1);
 
-      textNoiseAmplitude = (TextView)findViewById(R.id.flagNoiseAmplitude);
-      textNoiseLength    = (TextView)findViewById(R.id.flagNoiseLength);
-      textNoiseAngleA    = (TextView)findViewById(R.id.flagNoiseAngleA);
-      textNoiseAngleB    = (TextView)findViewById(R.id.flagNoiseAngleB);
+      textNoiseAmplitude = findViewById(R.id.flagNoiseAmplitude);
+      textNoiseLength    = findViewById(R.id.flagNoiseLength);
+      textNoiseAngleA    = findViewById(R.id.flagNoiseAngleA);
+      textNoiseAngleB    = findViewById(R.id.flagNoiseAngleB);
 
-      SeekBar barNoiseAmplitude  = (SeekBar)findViewById(R.id.flagSeekNoiseAmplitude);
-      SeekBar barNoiseLength     = (SeekBar)findViewById(R.id.flagSeekNoiseLength);
-      SeekBar barNoiseAngleA     = (SeekBar)findViewById(R.id.flagSeekNoiseAngleA);
-      SeekBar barNoiseAngleB     = (SeekBar)findViewById(R.id.flagSeekNoiseAngleB);
+      SeekBar barNoiseAmplitude = findViewById(R.id.flagSeekNoiseAmplitude);
+      SeekBar barNoiseLength    = findViewById(R.id.flagSeekNoiseLength);
+      SeekBar barNoiseAngleA    = findViewById(R.id.flagSeekNoiseAngleA);
+      SeekBar barNoiseAngleB    = findViewById(R.id.flagSeekNoiseAngleB);
 
       barNoiseAmplitude.setOnSeekBarChangeListener(this);
       barNoiseLength.setOnSeekBarChangeListener(this);
@@ -99,7 +99,7 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
     @Override
     protected void onPause() 
       {
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.flagSurfaceView);
+      GLSurfaceView mView = findViewById(R.id.flagSurfaceView);
       mView.onPause();
 
       Distorted.onPause();
@@ -113,7 +113,7 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
       {
       super.onResume();
 
-      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.flagSurfaceView);
+      GLSurfaceView mView = findViewById(R.id.flagSurfaceView);
       mView.onResume();
       }
     
@@ -140,7 +140,7 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
 
     public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
       {
-      FlagSurfaceView mView = (FlagSurfaceView) this.findViewById(R.id.flagSurfaceView);
+      FlagSurfaceView mView = findViewById(R.id.flagSurfaceView);
       FlagRenderer renderer = mView.getRenderer();
 
       switch (bar.getId())
diff --git a/src/main/java/org/distorted/examples/flag/FlagRenderer.java b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
index ec2c72d..639489f 100644
--- a/src/main/java/org/distorted/examples/flag/FlagRenderer.java
+++ b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
@@ -50,7 +50,6 @@ import javax.microedition.khronos.opengles.GL10;
 class FlagRenderer implements GLSurfaceView.Renderer
 {
     private GLSurfaceView mView;
-    private DistortedEffects mEffects;
     private DistortedTexture mTexture;
     private DistortedScreen mScreen;
     private Dynamic5D mWaveDyn;
@@ -67,7 +66,6 @@ class FlagRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
 
-      mEffects = new DistortedEffects();
       mTexture = new DistortedTexture(500,300);
 
       mObjWidth = mTexture.getWidth();
@@ -87,19 +85,20 @@ class FlagRenderer implements GLSurfaceView.Renderer
       Static3D waveCenter = new Static3D(mObjWidth, mObjHeight/2, 0);  // middle of the right edge
       Static4D waveRegion = new Static4D(0,0,0,mObjWidth);
 
-      mEffects.apply( new VertexEffectWave(mWaveDyn, waveCenter, waveRegion) );
+      DistortedEffects effects = new DistortedEffects();
+      effects.apply( new VertexEffectWave(mWaveDyn, waveCenter, waveRegion) );
 
       mMove  = new Static3D(0,0,0);
       mScale = new Static3D(1,1,1);
       mCenter= new Static3D(0,0,0);
 
-      mEffects.apply( new MatrixEffectMove(mMove));
-      mEffects.apply( new MatrixEffectScale(mScale));
-      mEffects.apply( new MatrixEffectQuaternion(mQuat1, mCenter) );
-      mEffects.apply( new MatrixEffectQuaternion(mQuat2, mCenter) );
+      effects.apply( new MatrixEffectMove(mMove));
+      effects.apply( new MatrixEffectScale(mScale));
+      effects.apply( new MatrixEffectQuaternion(mQuat1, mCenter) );
+      effects.apply( new MatrixEffectQuaternion(mQuat2, mCenter) );
 
       mScreen = new DistortedScreen();
-      mScreen.attach(mTexture,mEffects, new MeshCubes(50,30,1) );
+      mScreen.attach(mTexture, effects, new MeshCubes(50,30,1) );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/girl/GirlActivity.java b/src/main/java/org/distorted/examples/girl/GirlActivity.java
index 349e4c1..63e160c 100644
--- a/src/main/java/org/distorted/examples/girl/GirlActivity.java
+++ b/src/main/java/org/distorted/examples/girl/GirlActivity.java
@@ -44,13 +44,13 @@ public class GirlActivity extends Activity  implements OnSeekBarChangeListener
       
       setContentView(R.layout.girllayout);
            
-      textSwing = (TextView)findViewById(R.id.girlTextSwing);
-      textSize  = (TextView)findViewById(R.id.girlTextSize);
-      textHips  = (TextView)findViewById(R.id.girlTextHips);
+      textSwing = findViewById(R.id.girlTextSwing);
+      textSize  = findViewById(R.id.girlTextSize);
+      textHips  = findViewById(R.id.girlTextHips);
 
-      SeekBar barSwing = (SeekBar)findViewById(R.id.girlSeekSwing);
-      SeekBar barSize  = (SeekBar)findViewById(R.id.girlSeekSize);
-      SeekBar barHips  = (SeekBar)findViewById(R.id.girlSeekHips);
+      SeekBar barSwing = findViewById(R.id.girlSeekSwing);
+      SeekBar barSize  = findViewById(R.id.girlSeekSize);
+      SeekBar barHips  = findViewById(R.id.girlSeekHips);
       
       barSwing.setOnSeekBarChangeListener(this); 
       barSize.setOnSeekBarChangeListener(this); 
@@ -70,7 +70,7 @@ public class GirlActivity extends Activity  implements OnSeekBarChangeListener
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.girlSurfaceView);
+      GLSurfaceView view = findViewById(R.id.girlSurfaceView);
       view.onPause();
 
       Distorted.onPause();
@@ -84,7 +84,7 @@ public class GirlActivity extends Activity  implements OnSeekBarChangeListener
       {
       super.onResume();
       
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.girlSurfaceView);
+      GLSurfaceView view = findViewById(R.id.girlSurfaceView);
       view.onResume();
       }
  
@@ -103,7 +103,7 @@ public class GirlActivity extends Activity  implements OnSeekBarChangeListener
       {
       int v;
       float s;
-      GirlSurfaceView view = (GirlSurfaceView) this.findViewById(R.id.girlSurfaceView);
+      GirlSurfaceView view = findViewById(R.id.girlSurfaceView);
 
       switch (bar.getId()) 
         {
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 313a4c0..3d25bdc 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -67,8 +67,8 @@ class GirlRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
 
-      Static3D pLeft = new Static3D(132, 264, 0);
-      Static3D pRight= new Static3D(247, 264, 0);
+      Static3D pLeft = new Static3D(132, 336, 0);
+      Static3D pRight= new Static3D(247, 336, 0);
       
       // Size
       Static4D sinkRegion = new Static4D(0,0,0,60);
@@ -100,9 +100,9 @@ class GirlRenderer implements GLSurfaceView.Renderer
       diR.add(v1);
       
       // Lower Movement
-      Static3D pHips = new Static3D(216,505,0);
+      Static3D pHips      = new Static3D(216,95,0);
       Static4D HipsRegion = new Static4D(0,0,0,120);
-      Dynamic1D diHips = new Dynamic1D(1500,0.0f);
+      Dynamic1D diHips    = new Dynamic1D(1500,0.0f);
       
       dBegin = new Static1D(0);
       dMiddle= new Static1D(0);
@@ -117,11 +117,11 @@ class GirlRenderer implements GLSurfaceView.Renderer
 
       mEffects = new DistortedEffects();
 
-      mEffects.apply( new VertexEffectSink(diSink, pLeft, sinkRegion) );
-      mEffects.apply( new VertexEffectSink(diSink, pRight,sinkRegion) );
-      mEffects.apply( new VertexEffectDistort(diL, pLeft , Region) );
-      mEffects.apply( new VertexEffectDistort(diR, pRight, Region) );
-      mEffects.apply( new VertexEffectSwirl(diHips, pHips, HipsRegion) );
+      mEffects.apply( new VertexEffectSink   ( diSink, pLeft , sinkRegion) );
+      mEffects.apply( new VertexEffectSink   ( diSink, pRight, sinkRegion) );
+      mEffects.apply( new VertexEffectDistort( diL   , pLeft , Region    ) );
+      mEffects.apply( new VertexEffectDistort( diR   , pRight, Region    ) );
+      mEffects.apply( new VertexEffectSwirl  ( diHips, pHips , HipsRegion) );
 
       mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
@@ -150,9 +150,9 @@ class GirlRenderer implements GLSurfaceView.Renderer
 
    void setSwing(int swing)
      {
-     v0.set( 0,-swing, 0);
+     v0.set( 0, swing, 0);
      v1.set( swing, 0, 0);
-     v2.set( 0, swing, 0);
+     v2.set( 0,-swing, 0);
      v3.set(-swing, 0, 0);
      }
    
diff --git a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
index 0043014..54f7baa 100644
--- a/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
+++ b/src/main/java/org/distorted/examples/inflate/InflateRenderer.java
@@ -110,9 +110,11 @@ class InflateRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
+      final float SCALE = 0.75f;
+
       mScreenMin = width<height ? width:height;
-      float factor = ( width*mObjHeight > height*mObjWidth ) ? (0.75f*height)/mObjHeight :  (0.75f*width)/mObjWidth;
-      mMove.set( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , 0);
+      float factor = ( width*mObjHeight > height*mObjWidth ) ? (SCALE*height)/mObjHeight :  (SCALE*width)/mObjWidth;
+      mMove.set( (width-factor*mObjWidth)/2 , (height-factor*mObjHeight)/2 , -factor*mObjDepth/2 );
       mScale.set(factor,factor,factor);
       mCenter.set( (float)mObjWidth/2, (float)mObjHeight/2, (float)mObjDepth/2 );
       mScreen.resize(width, height);
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index 63ae352..58736dd 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -66,7 +66,10 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
 
    ListenerRenderer(GLSurfaceView v)
       {
-      DistortedEffects.setMax(EffectType.VERTEX,NUM_BUBBLES);
+      // one more than we have bubbles at any given time because it can sometimes happen that
+      // the old bubble is not yet removed when we add a new one
+      DistortedEffects.setMax(EffectType.VERTEX,NUM_BUBBLES+1);
+
       mView = v;
       mEffects = new DistortedEffects();
       mEffects.registerForMessages(this);
@@ -81,13 +84,13 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   private boolean randomizeNewBubble()
+   private boolean addNewBubble()
       {
       int radius   = (int)(( 0.10f + 0.70f*mRnd.nextFloat())*bmpWidth);           // pop up a bubble of size (radius,height)
       int height   = (int)((-0.10f + 0.20f*mRnd.nextFloat())*bmpWidth);           // 
       int pointx   = mRnd.nextInt( (int)(0.8f*bmpWidth ))+ (int)(0.1f*bmpWidth ); // at a random place on the bitmap (but not near the edge)
       int pointy   = mRnd.nextInt( (int)(0.8f*bmpHeight))+ (int)(0.1f*bmpHeight); // 
-      int duration = 1000 + mRnd.nextInt(3000);                                   // for anytime from 3 to 4 seconds 
+      int duration = 1000 + mRnd.nextInt(3000);                                   // for anytime from 1 to 4 seconds
 
       Dynamic3D dDistort = new Dynamic3D(duration,1.0f);
       dDistort.add(new Static3D(0,0,     0));
@@ -103,8 +106,11 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
      {
      switch(em)
         {
-        case EFFECT_REMOVED: randomizeNewBubble();
-        default            : break;
+        case EFFECT_REMOVED: if( !addNewBubble() )
+                               {
+                               android.util.Log.e("Listener", "failed to add new bubble - this should never happen!");
+                               }
+                             break;
         }
      }
    
@@ -170,7 +176,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
      mScreen.detachAll();
      mScreen.attach(mTexture,mEffects,mMesh);
 
-     for(int i=0; i<NUM_BUBBLES; i++) randomizeNewBubble();
+     for(int i=0; i<NUM_BUBBLES; i++) addNewBubble();
 
      VertexEffectDistort.enable();
 
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorActivity.java b/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
index 26e697d..dce6dfc 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
@@ -42,7 +42,7 @@ public class MirrorActivity extends Activity implements OnSeekBarChangeListener
       super.onCreate(icicle);
       setContentView(R.layout.mirrorlayout);
        
-      SeekBar bar = (SeekBar)findViewById(R.id.mirrorSeek);
+      SeekBar bar = findViewById(R.id.mirrorSeek);
       bar.setOnSeekBarChangeListener(this);
       bar.setProgress(INIT_POSITION);
       }
@@ -52,7 +52,7 @@ public class MirrorActivity extends Activity implements OnSeekBarChangeListener
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.mirrorSurfaceView);
+      GLSurfaceView view = findViewById(R.id.mirrorSurfaceView);
       view.onPause();
 
       Distorted.onPause();
@@ -65,7 +65,7 @@ public class MirrorActivity extends Activity implements OnSeekBarChangeListener
     protected void onResume() 
       {
       super.onResume();
-      MirrorSurfaceView view = (MirrorSurfaceView) this.findViewById(R.id.mirrorSurfaceView);
+      MirrorSurfaceView view = findViewById(R.id.mirrorSurfaceView);
       view.onResume();
       view.getRenderer().onResume();
       }
@@ -85,7 +85,7 @@ public class MirrorActivity extends Activity implements OnSeekBarChangeListener
       {
       switch (bar.getId()) 
         {
-        case R.id.mirrorSeek: MirrorSurfaceView view = (MirrorSurfaceView) this.findViewById(R.id.mirrorSurfaceView);
+        case R.id.mirrorSeek: MirrorSurfaceView view = findViewById(R.id.mirrorSurfaceView);
                               view.getRenderer().setPosition(progress);
                               break;
         }
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
index 7b75a6a..9d76a0a 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
@@ -50,8 +50,9 @@ class MirrorRenderer implements GLSurfaceView.Renderer
    private static final float HEAD_SCALE       =0.30f;  // Head's height will be 30% of the height of the mirror
    private static final float MIRROR_BRIGHTNESS=0.70f;  // Each next mirror 30% darker
    private static final float MIRROR_MARGIN    =0.11f;  // The frame of the mirror takes up 11% of its width
-   private static final float MIRROR_MOVE      =0.12f;  // Each next mirror is moved to the right by 12% of
+   private static final float MIRROR_MOVE_H    =0.12f;  // Each next mirror is moved to the left by 12% of
                                                         // the length of the previous one
+   private static final float MIRROR_MOVE_V    =0.22f;  // Move the mirror up
 
    private GLSurfaceView mView;
    private DistortedEffects mEffectsMirror, mEffectsHead, mEffectsNull;
@@ -141,11 +142,11 @@ class MirrorRenderer implements GLSurfaceView.Renderer
         mOffScreen2 = new DistortedFramebuffer( (int)(MIRROR_SCALE*mScreenW), (int)(MIRROR_SCALE*mScreenH), 1, DistortedFramebuffer.NO_DEPTH_NO_STENCIL );
 
         mScaleMirror.set( (float)mScreenW/mMirrorW, (float)mScreenH/mMirrorH, 1.0f);
-        mMoveOffscreen2.set( MIRROR_MOVE*mScreenW, MIRROR_MOVE*mScreenH*mMirrorW/mMirrorH, 0);
+        mMoveOffscreen2.set( MIRROR_MOVE_H*mScreenW, MIRROR_MOVE_V*mScreenH*mMirrorW/mMirrorH, 0);
 
         float headScale = HEAD_SCALE *mScreenH/ mHeadH;
         mScaleHead.set(headScale,headScale,headScale);
-        mHeadPosition.set2( mScreenH*(1.0f-MIRROR_MARGIN*mMirrorW/mMirrorH) - headScale* mHeadH);
+        mHeadPosition.set2( mScreenH*MIRROR_MARGIN*mMirrorW/mMirrorH );
         setPosition(mX);
 
         mOffScreen1.attach( mTextureMirror, mEffectsMirror    , mQuad );
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index b59e458..c24524f 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -60,17 +60,29 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
 
-      Static3D pLeft = new Static3D( 90, 258, 0);
-      Static3D pRight= new Static3D(176, 255, 0);
+      // two points, centers of the Distort effect
+      // the left and right tip of the mouth
+      Static3D pLeft  = new Static3D( 90, 108, 0);
+      Static3D pRight = new Static3D(176, 111, 0);
 
-      Static4D rLeft = new Static4D(-10,-10, 0,25);
-      Static4D rRight= new Static4D( 10, -5, 0,25);
+      // two regions defining the areas affected by the Distort effect
+      Static4D rLeft  = new Static4D(-10, 10, 0, 25);
+      Static4D rRight = new Static4D( 10,  5, 0, 25);
+
+      // two dynamics for interpolating through vectors of distortion. Interpolate
+      // every 1000 miliseconds, indefinately ('0.0f').
       Dynamic3D dLeft = new Dynamic3D(1000,0.0f);
       Dynamic3D dRight= new Dynamic3D(1000,0.0f);
-      dLeft.add ( new Static3D(  0,  0,0) );
-      dLeft.add ( new Static3D(-20,-20,0) );
-      dRight.add( new Static3D(  0,  0,0) );
-      dRight.add( new Static3D( 20,-10,0) );
+
+      // two vectors of distortion the left tip of the mouth gets distorted with -
+      // interpolated from (0,0,0) - i.e. no distortion - to (-20,20,0), i.e.
+      // slightly to the top left.
+      dLeft.add ( new Static3D(  0,  0, 0) );
+      dLeft.add ( new Static3D(-20, 20, 0) );
+
+      // likewise two vectors the right tip is distorted with.
+      dRight.add( new Static3D(  0,  0, 0) );
+      dRight.add( new Static3D( 20, 10, 0) );
 
       mEffects = new DistortedEffects();
       mEffects.apply( new VertexEffectDistort(dLeft , pLeft , rLeft ) );
@@ -155,6 +167,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       mScreen.detachAll();
       mScreen.attach(mTexture,mEffects,mMesh);
 
+      // All effects are by default disabled!
       VertexEffectDistort.enable();
 
       try
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
index ec86acd..ac99ad4 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
@@ -47,12 +47,12 @@ public class MovingEffectsActivity extends Activity
   
       setContentView(R.layout.movingeffectslayout);
       
-      mAbort = (Button)findViewById(R.id.movingeffectsAbort);
-      mChroma= (Button)findViewById(R.id.movingeffectsChroma);
-      mTrans = (Button)findViewById(R.id.movingeffectsTrans);
-      mSink  = (Button)findViewById(R.id.movingeffectsSink);
-      mBubble= (Button)findViewById(R.id.movingeffectsBubble);
-      mSwirl= (Button)findViewById(R.id.movingeffectsSwirl);
+      mAbort = findViewById(R.id.movingeffectsAbort);
+      mChroma= findViewById(R.id.movingeffectsChroma);
+      mTrans = findViewById(R.id.movingeffectsTrans);
+      mSink  = findViewById(R.id.movingeffectsSink);
+      mBubble= findViewById(R.id.movingeffectsBubble);
+      mSwirl = findViewById(R.id.movingeffectsSwirl);
       
       mAbort.setBackgroundColor(COLOR_PRESSED);
       mChroma.setBackgroundColor(COLOR_UNPRESSED);
@@ -68,22 +68,24 @@ public class MovingEffectsActivity extends Activity
       }
 
 ///////////////////////////////////////////////////////////////////
+
     @Override
     protected void onResume() 
       {
       super.onResume();
       
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      GLSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.onResume();
       }
 
 ///////////////////////////////////////////////////////////////////
+
     @Override
     protected void onPause() 
       {
       Abort(null);   
       
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      GLSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.onPause();
 
       Distorted.onPause();
@@ -91,6 +93,7 @@ public class MovingEffectsActivity extends Activity
       }
     
 ///////////////////////////////////////////////////////////////////
+
     @Override
     public void onStop()
       {
@@ -117,7 +120,7 @@ public class MovingEffectsActivity extends Activity
     
     public void Bubble(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Bubble();
       
       mAbort.setBackgroundColor(COLOR_UNPRESSED);
@@ -132,7 +135,7 @@ public class MovingEffectsActivity extends Activity
 
     public void Sink(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Sink();
       
       mAbort.setBackgroundColor(COLOR_UNPRESSED);
@@ -147,7 +150,7 @@ public class MovingEffectsActivity extends Activity
     
     public void Transparency(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Transparency();
       
       mAbort.setBackgroundColor(COLOR_UNPRESSED);
@@ -162,7 +165,7 @@ public class MovingEffectsActivity extends Activity
 
     public void Chroma(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Chroma();
       
       mAbort.setBackgroundColor(COLOR_UNPRESSED);
@@ -177,7 +180,7 @@ public class MovingEffectsActivity extends Activity
 
     public void Swirl(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Swirl();
       
       mAbort.setBackgroundColor(COLOR_UNPRESSED);
@@ -192,7 +195,7 @@ public class MovingEffectsActivity extends Activity
 
     public void Abort(View v)
       {
-      MovingEffectsSurfaceView view = (MovingEffectsSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
+      MovingEffectsSurfaceView view = findViewById(R.id.movingeffectsSurfaceView);
       view.Abort();
       
       mAbort.setBackgroundColor(COLOR_PRESSED);
@@ -202,7 +205,4 @@ public class MovingEffectsActivity extends Activity
       mBubble.setBackgroundColor(COLOR_UNPRESSED);
       mSwirl.setBackgroundColor(COLOR_UNPRESSED);
       }
-
-///////////////////////////////////////////////////////////////////
-// end of file
 }
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
index 879ab19..b576b0f 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
@@ -63,6 +63,7 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
 
     private Paint mPaint;
     private int moving;
+    private int mScrHeight;
     private long mTime = 0;
     
     private int mCurrEffect;
@@ -118,6 +119,8 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
       {
       int max = width>height ? width:height;
 
+      mScrHeight = height;
+
       mSize1 = max/200;
       mSize2 = max/80;
       int rad= max/6;
@@ -248,7 +251,7 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
             {
             mPaint.setColor( 0xffffffff );
             mCenter.get( drawCoord, 0, (long)(i*step) );
-            c.drawCircle(drawCoord[0], drawCoord[1], mSize1, mPaint );
+            c.drawCircle(drawCoord[0], mScrHeight-drawCoord[1], mSize1, mPaint );
             }
           }
      
@@ -257,7 +260,7 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
         for(int curr=0; curr<len; curr++)
           {       
           cu = mCenter.getPoint(curr);
-          c.drawCircle(cu.get1(), cu.get2(), mSize2, mPaint);
+          c.drawCircle(cu.get1(), mScrHeight-cu.get2(), mSize2, mPaint);
           }
         
         if( time-mTime > LOOP_TIME ) mTime = time;
@@ -266,7 +269,8 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
        
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    @Override public boolean onTouchEvent(MotionEvent event) 
+    @Override
+    public boolean onTouchEvent(MotionEvent event)
       {
       if( mCurrEffect!=EFFECT_POINTS ) return true;   
 
@@ -274,8 +278,8 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
 
       switch(event.getAction())
         {
-        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX();
-                                      yDown = (int)event.getY();
+        case MotionEvent.ACTION_DOWN: xDown =              (int)event.getX();
+                                      yDown = mScrHeight - (int)event.getY();
                                     
                                       float gx, gy;
                                       Static3D dv;
@@ -306,8 +310,8 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
                                       break;
         case MotionEvent.ACTION_MOVE: if( moving>=0 )
                                         {
-                                        xDown = (int)event.getX();
-                                        yDown = (int)event.getY();
+                                        xDown =              (int)event.getX();
+                                        yDown = mScrHeight - (int)event.getY();
 
                                         mCenter.setPoint(moving, xDown, yDown, 0);
                                         }
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
index 98225d9..c244672 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
@@ -83,7 +83,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
       {
-      MultiblurSurfaceView v = this.findViewById(R.id.multiblurSurfaceView);
+      MultiblurSurfaceView v = findViewById(R.id.multiblurSurfaceView);
       MultiblurRenderer renderer = v.getRenderer();
 
       switch(parent.getId())
@@ -128,7 +128,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = this.findViewById(R.id.multiblurSurfaceView);
+      GLSurfaceView view = findViewById(R.id.multiblurSurfaceView);
       view.onResume();
       }
     
@@ -148,7 +148,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
       {
       super.onSaveInstanceState(savedInstanceState);
 
-      MultiblurSurfaceView view = this.findViewById(R.id.multiblurSurfaceView);
+      MultiblurSurfaceView view = findViewById(R.id.multiblurSurfaceView);
       MultiblurRenderer renderer = view.getRenderer();
 
       savedInstanceState.putBooleanArray("checkboxes", renderer.getChecked() );
@@ -164,7 +164,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
 
       boolean[] checkboxes = savedInstanceState.getBooleanArray("checkboxes");
 
-      MultiblurSurfaceView view = this.findViewById(R.id.multiblurSurfaceView);
+      MultiblurSurfaceView view = findViewById(R.id.multiblurSurfaceView);
       MultiblurRenderer renderer = view.getRenderer();
 
       if( checkboxes!=null )
@@ -193,10 +193,10 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
       {
       switch (bar.getId())
         {
-        case R.id.multiblurDistanceSeek: MultiblurSurfaceView view1 = this.findViewById(R.id.multiblurSurfaceView);
+        case R.id.multiblurDistanceSeek: MultiblurSurfaceView view1 = findViewById(R.id.multiblurSurfaceView);
                                          view1.getRenderer().setDistance(progress);
                                          break;
-        case R.id.multiblurRangeSeek   : MultiblurSurfaceView view2 = this.findViewById(R.id.multiblurSurfaceView);
+        case R.id.multiblurRangeSeek   : MultiblurSurfaceView view2 = findViewById(R.id.multiblurSurfaceView);
                                          view2.getRenderer().setRange(progress);
                                          break;
 
@@ -218,7 +218,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
     CheckBox box = (CheckBox)view;
     int id = box.getId();
     boolean checked = box.isChecked();
-    MultiblurSurfaceView sView = this.findViewById(R.id.multiblurSurfaceView);
+    MultiblurSurfaceView sView = findViewById(R.id.multiblurSurfaceView);
 
     switch(id)
       {
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
index 7e079d1..f78041c 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurRenderer.java
@@ -170,7 +170,7 @@ class MultiblurRenderer implements GLSurfaceView.Renderer
     	float factor    = 0.15f*mScreenMin/OBJ_SIZE;
     	mScale.set(factor,factor,factor);
       mCenter.set((float)OBJ_SIZE/2, (float)OBJ_SIZE/2, (float)OBJ_SIZE/2 );
-      mMove.set( (width -factor*OBJ_SIZE)/2 ,(height-factor*OBJ_SIZE)/2 ,0);
+      mMove.set( (width -factor*OBJ_SIZE)/2 ,(height-factor*OBJ_SIZE)/2 , -factor*OBJ_SIZE);
       computeMoveVectors();
       mScreen.resize(width, height);
       }
diff --git a/src/main/java/org/distorted/examples/objecttree/ObjectTreeActivity.java b/src/main/java/org/distorted/examples/objecttree/ObjectTreeActivity.java
index a4c9b5b..9a1a80d 100644
--- a/src/main/java/org/distorted/examples/objecttree/ObjectTreeActivity.java
+++ b/src/main/java/org/distorted/examples/objecttree/ObjectTreeActivity.java
@@ -51,7 +51,7 @@ public class ObjectTreeActivity extends Activity
     @Override
     protected void onPause() 
       {
-      ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView);
+      ObjectTreeSurfaceView view = findViewById(R.id.objecttreeSurfaceView);
 
       view.onPause();
       Distorted.onPause();
@@ -63,7 +63,7 @@ public class ObjectTreeActivity extends Activity
     @Override
     protected void onResume() 
       {
-      ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView);
+      ObjectTreeSurfaceView view = findViewById(R.id.objecttreeSurfaceView);
 
       super.onResume();
       view.onResume();
@@ -82,7 +82,7 @@ public class ObjectTreeActivity extends Activity
 
     public void DepthYes(View v)
       {
-      ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView);
+      ObjectTreeSurfaceView view = findViewById(R.id.objecttreeSurfaceView);
       ObjectTreeRenderer renderer = view.getRenderer();
 
       renderer.setDepth(true);
@@ -93,7 +93,7 @@ public class ObjectTreeActivity extends Activity
 
     public void DepthNo(View v)
       {
-      ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView);
+      ObjectTreeSurfaceView view = findViewById(R.id.objecttreeSurfaceView);
       ObjectTreeRenderer renderer = view.getRenderer();
 
       renderer.setDepth(false);
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
index 839b0b8..7012727 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
@@ -43,7 +43,7 @@ public class OlimpicActivity extends Activity
       {
       super.onCreate(savedState);
       setContentView(R.layout.olimpiclayout);
-      mText = (TextView)findViewById(R.id.olimpicText);
+      mText = findViewById(R.id.olimpicText);
 
       int num = OlimpicRenderer.NUM_LEAVES+1;
 
@@ -80,7 +80,7 @@ public class OlimpicActivity extends Activity
       CheckBox box = (CheckBox)view;
       int id = box.getId();
       boolean checked = box.isChecked();
-      OlimpicSurfaceView sView = (OlimpicSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
+      OlimpicSurfaceView sView = findViewById(R.id.olimpicSurfaceView);
 
       switch(id)
         {
@@ -141,7 +141,7 @@ public class OlimpicActivity extends Activity
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
+      GLSurfaceView view = findViewById(R.id.olimpicSurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -153,7 +153,7 @@ public class OlimpicActivity extends Activity
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
+      GLSurfaceView view = findViewById(R.id.olimpicSurfaceView);
       view.onResume();
       }
  
@@ -193,7 +193,7 @@ public class OlimpicActivity extends Activity
       mYellow = savedInstanceState.getBooleanArray("yellow");
       mGreen  = savedInstanceState.getBooleanArray("green" );
 
-      OlimpicSurfaceView view = (OlimpicSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
+      OlimpicSurfaceView view = findViewById(R.id.olimpicSurfaceView);
       OlimpicRenderer renderer = view.getRenderer();
 
       int num = OlimpicRenderer.NUM_LEAVES + 1;
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index d379d79..8a62f79 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -113,7 +113,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
       rot.add(new Static1D(360));
 
       int[] colors    = new int[] {0,0,1,  0,0,0,  1,0,0,  1,1,0,  0,1,0}; // blue, black, red, yellow, green  
-      int[] positions = new int[] {0,2*LEAF_SIZE,  3*LEAF_SIZE,2*LEAF_SIZE,  6*LEAF_SIZE,2*LEAF_SIZE,  3*LEAF_SIZE/2,9*LEAF_SIZE/2,  9*LEAF_SIZE/2,9*LEAF_SIZE/2};
+      int[] positions = new int[] {0,4*LEAF_SIZE,  3*LEAF_SIZE,4*LEAF_SIZE,  6*LEAF_SIZE,4*LEAF_SIZE,  3*LEAF_SIZE/2,3*LEAF_SIZE/2,  9*LEAF_SIZE/2,3*LEAF_SIZE/2};
       
       Static3D center = new Static3D(3*LEAF_SIZE/2, 3*LEAF_SIZE/2, 0);
       Static3D axis   = new Static3D(0,0,1);
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index 4b057ca..cabc8db 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -80,20 +80,20 @@ class RenderThread extends Thread
     mSurfaceHolder = holder;
     mView = view;
 
-    Static3D pLeft = new Static3D( 90, 258, 0);
-    Static3D pRight= new Static3D(176, 255, 0);
+    Static3D pLeft = new Static3D( 90, 108, 0);
+    Static3D pRight= new Static3D(176, 111, 0);
 
-    Static4D rLeft = new Static4D(-10,-10, 0,25);
-    Static4D rRight= new Static4D( 10, -5, 0,25);
+    Static4D rLeft = new Static4D(-10, 10, 0,25);
+    Static4D rRight= new Static4D( 10,  5, 0,25);
 
     Dynamic3D dLeft = new Dynamic3D(1000,0.0f);
     Dynamic3D dRight= new Dynamic3D(1000,0.0f);
 
-    dLeft.add( new Static3D(  0,  0,0) );
-    dLeft.add( new Static3D(-20,-20,0) );
+    dLeft.add( new Static3D(  0,  0, 0) );
+    dLeft.add( new Static3D(-20, 20, 0) );
 
-    dRight.add( new Static3D(  0,  0,0) );
-    dRight.add( new Static3D( 20,-10,0) );
+    dRight.add( new Static3D(  0,  0, 0) );
+    dRight.add( new Static3D( 20, 10, 0) );
 
     mEffects = new DistortedEffects();
     mEffects.apply( new VertexEffectDistort(dLeft , pLeft , rLeft ) );
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index ed87784..9e78350 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -116,8 +116,8 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
 
       for(int i=0; i<=NUMLINES ; i++ )
         {
-        bmpCanvas.drawRect(width*i/NUMLINES - 1,                    0,  width*i/NUMLINES + 1,  height               , paint);
-        bmpCanvas.drawRect(                   0, height*i/NUMLINES -1,  width               ,  height*i/NUMLINES + 1, paint);
+        bmpCanvas.drawRect(width*i/NUMLINES-1,                   0, width*i/NUMLINES+1, height             , paint);
+        bmpCanvas.drawRect(                 0, height*i/NUMLINES-1, width             , height*i/NUMLINES+1, paint);
         }
 
       int min = width<height ? width:height;
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index 51956b7..8d85a64 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -118,7 +118,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
     float factor = 0.5f*(width>height ? height/h:width/w);
 
     mCenter.set(w/2,h/2,d/2);
-    mMove.set( (width-factor*w)/2 , (height-factor*h)/2 , 0 );
+    mMove.set( (width-factor*w)/2 , (height-factor*h)/2 , -factor*d/2 );
     mScale.set(factor,factor,factor);
 
     mScreen.resize(width, height);
diff --git a/src/main/java/org/distorted/examples/save/SaveActivity.java b/src/main/java/org/distorted/examples/save/SaveActivity.java
index 45fa726..c90b516 100644
--- a/src/main/java/org/distorted/examples/save/SaveActivity.java
+++ b/src/main/java/org/distorted/examples/save/SaveActivity.java
@@ -65,11 +65,11 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
      
     setContentView(R.layout.savelayout);
 
-    SeekBar barSize  = (SeekBar)findViewById(R.id.saveSeekBarSize);
+    SeekBar barSize  = findViewById(R.id.saveSeekBarSize);
     barSize.setOnSeekBarChangeListener(this);
     barSize.setProgress(50);
 
-    SeekBar barScale = (SeekBar)findViewById(R.id.saveSeekBarScale);
+    SeekBar barScale = findViewById(R.id.saveSeekBarScale);
     barScale.setOnSeekBarChangeListener(this);
     barScale.setProgress(100);
     }
@@ -79,7 +79,7 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
   @Override
   protected void onPause() 
     {
-    GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.saveSurfaceView);
+    GLSurfaceView view = findViewById(R.id.saveSurfaceView);
     view.onPause();
 
     Distorted.onPause();
@@ -93,7 +93,7 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
     {
     super.onResume();
       
-    GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.saveSurfaceView);
+    GLSurfaceView view = findViewById(R.id.saveSurfaceView);
     view.onResume();
 
     SaveWorkerThread.create(this);
@@ -114,7 +114,7 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
     {
     verifyStoragePermissions();
 
-    SaveSurfaceView view = (SaveSurfaceView) this.findViewById(R.id.saveSurfaceView);
+    SaveSurfaceView view = findViewById(R.id.saveSurfaceView);
     view.getRenderer().Save();
     }
 
@@ -122,7 +122,7 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
 
   public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
     {
-    SaveSurfaceView view = (SaveSurfaceView) this.findViewById(R.id.saveSurfaceView);
+    SaveSurfaceView view = findViewById(R.id.saveSurfaceView);
 
     switch (bar.getId())
       {
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index d1d91fa..489353f 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -78,8 +78,8 @@ class SaveRenderer implements GLSurfaceView.Renderer
       
     boobsSink  = 1.0f;
       
-    Static3D pLeft = new Static3D(132, 264, 0);
-    Static3D pRight= new Static3D(247, 264, 0);
+    Static3D pLeft = new Static3D(132, 336, 0);
+    Static3D pRight= new Static3D(247, 336, 0);
       
     Static4D sinkRegion = new Static4D(0,0,0,60);
       
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 9db673e..0e39b73 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -66,7 +66,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
     sink.add(new Static1D(0.2f));
 
     mEffects = new DistortedEffects();
-    VertexEffectSink sinkEffect = new VertexEffectSink(sink, new Static3D(297, 320, 0), null);
+    VertexEffectSink sinkEffect = new VertexEffectSink(sink, new Static3D(297, 280, 0), null);
     mEffects.apply(sinkEffect);
 
     mScale = new Static3D(1,1,1);
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index 89014c2..b00c75a 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -39,7 +39,6 @@ import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static4D;
 import org.distorted.library.message.EffectListener;
 import org.distorted.library.message.EffectMessage;
 import org.distorted.library.main.Distorted;
@@ -247,7 +246,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     di.add(new Static1D(1.0f));
     di.add(new Static1D(0.0f));
     
-    mGFFAEffects.apply( new MatrixEffectMove(new Static3D(w/5,h/3,0)) );
+    mGFFAEffects.apply( new MatrixEffectMove(new Static3D(w/5,2*h/3,0)) );
     mGFFAEffects.apply( new MatrixEffectScale(scale) );
     mGFFAEffects.apply( new FragmentEffectAlpha(di) );
       
@@ -410,25 +409,23 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
         int crawlW = mCrawlTexture.getWidth();
         int crawlH = mCrawlTexture.getHeight();
         int screenW= mScreen.getWidth();
-        int screenH= mScreen.getHeight();
         int backH  = mCrawlBackgroundTexture.getHeight();
         float scale= (float)screenW/crawlW;
 
-        mCrawlBackgroundEffects.apply( new MatrixEffectMove(new Static3D(0,screenH-backH,0)) );
-        mCrawlBackgroundEffects.apply( new MatrixEffectRotate(new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,backH,0)) );
+        mCrawlBackgroundEffects.apply( new MatrixEffectRotate(new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,0,0)) );
 
         final int transpDist = 5;
-        Static3D center = new Static3D( screenW/2 , (1-transpDist)*backH , 0 );
+        Static3D center = new Static3D( screenW/2 , transpDist*backH , 0 );
         Static3D region = new Static3D( transpDist*backH , transpDist*backH , transpDist*backH );
         mCrawlBackgroundEffects.apply( new FragmentEffectAlpha(new Static1D(1-transpDist*0.6f), center, region, true) );
 
         Dynamic3D di = new Dynamic3D(70000,0.5f);
-        di.add(new Static3D(screenW/2,+backH       , 0));
-        di.add(new Static3D(screenW/2,-scale*crawlH, 0));
+        di.add(new Static3D(screenW/2,-scale*crawlH/2        , 0));
+        di.add(new Static3D(screenW/2,+scale*crawlH/2 + backH, 0));
 
         mCrawlEffects.apply( new MatrixEffectMove(di) );
         mCrawlEffects.apply( new MatrixEffectScale(new Static3D(scale,scale,scale)) );
-        mCrawlEffects.apply( new MatrixEffectMove(new Static3D(-crawlW/2,0,0)) );
+        mCrawlEffects.apply( new MatrixEffectMove(new Static3D(-crawlW/2,-crawlH/2,0)) );
         
         mBackground = mScreen.attach(mCrawlBackgroundTexture, mCrawlBackgroundEffects,mQuad);
         mBackground.attach(mCrawlTexture, mCrawlEffects,mQuad);
diff --git a/src/main/java/org/distorted/examples/stencil/StencilActivity.java b/src/main/java/org/distorted/examples/stencil/StencilActivity.java
index 750c849..bb86519 100644
--- a/src/main/java/org/distorted/examples/stencil/StencilActivity.java
+++ b/src/main/java/org/distorted/examples/stencil/StencilActivity.java
@@ -51,7 +51,7 @@ public class StencilActivity extends Activity
     @Override
     protected void onPause() 
       {
-      StencilSurfaceView view = (StencilSurfaceView) this.findViewById(R.id.stencilSurfaceView);
+      StencilSurfaceView view = findViewById(R.id.stencilSurfaceView);
 
       view.onPause();
       Distorted.onPause();
@@ -63,7 +63,7 @@ public class StencilActivity extends Activity
     @Override
     protected void onResume() 
       {
-      StencilSurfaceView view = (StencilSurfaceView) this.findViewById(R.id.stencilSurfaceView);
+      StencilSurfaceView view = findViewById(R.id.stencilSurfaceView);
 
       super.onResume();
       view.onResume();
@@ -82,7 +82,7 @@ public class StencilActivity extends Activity
 
     public void Screen(View v)
       {
-      StencilSurfaceView view = (StencilSurfaceView) this.findViewById(R.id.stencilSurfaceView);
+      StencilSurfaceView view = findViewById(R.id.stencilSurfaceView);
       StencilRenderer renderer = view.getRenderer();
 
       renderer.setScreen(true);
@@ -93,7 +93,7 @@ public class StencilActivity extends Activity
 
     public void Framebuffer(View v)
       {
-      StencilSurfaceView view = (StencilSurfaceView) this.findViewById(R.id.stencilSurfaceView);
+      StencilSurfaceView view = findViewById(R.id.stencilSurfaceView);
       StencilRenderer renderer = view.getRenderer();
 
       renderer.setScreen(false);
diff --git a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
index c083248..3389eb8 100644
--- a/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
+++ b/src/main/java/org/distorted/examples/stencil/StencilRenderer.java
@@ -36,8 +36,8 @@ import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshCubes;
-import org.distorted.library.mesh.MeshFlat;
 import org.distorted.library.mesh.MeshBase;
+import org.distorted.library.mesh.MeshQuad;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
@@ -56,8 +56,7 @@ class StencilRenderer implements GLSurfaceView.Renderer
     private DistortedScreen mScreen;
     private DistortedTexture mCubeTex, mFloorTex, mFBOTex;
     private DistortedNode mCube1Node, mCube2Node, mFloorNode, mFBONode;
-    private MeshBase mCubeMesh, mQuad;
-    private Static3D mCubeMove, mCubeScale, mFloorScale, mFloorMove, mFBOScale;
+    private Static3D mMove, mScale, mRotCenter, mFBOScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -87,17 +86,16 @@ class StencilRenderer implements GLSurfaceView.Renderer
       {
       mView = v;
 
-      mCubeMesh = new MeshCubes(1,1,1);
-      mQuad     = new MeshFlat(1,1);
+      MeshBase cube = new MeshCubes(1,1,1);
+      MeshBase quad = new MeshQuad();
 
-      mCubeMove   = new Static3D(0,0,0);
-      mCubeScale  = new Static3D(1,1,1);
-      mFloorScale = new Static3D(1,1,1);
-      mFloorMove  = new Static3D(0,0,0);
+      mMove       = new Static3D(0,0,0);
+      mScale      = new Static3D(1,1,1);
+      mRotCenter  = new Static3D(0,0,0);
       mFBOScale   = new Static3D(1,1,1);
 
       mCubeTex   = new DistortedTexture(1,1);
-      mFloorTex  = new DistortedTexture(1,1);
+      mFloorTex  = new DistortedTexture(2,2);
       mFBOTex    = new DistortedTexture(1,1);
 
       DistortedEffects cube1Effects = new DistortedEffects();
@@ -105,12 +103,10 @@ class StencilRenderer implements GLSurfaceView.Renderer
       DistortedEffects floorEffects = new DistortedEffects();
       DistortedEffects FBOEffects   = new DistortedEffects();
 
-      cube2Effects.apply( new FragmentEffectBrightness(new Static1D(0.5f)) );
-
-      mCube1Node = new DistortedNode(mCubeTex ,cube1Effects,mCubeMesh );
-      mCube2Node = new DistortedNode(mCubeTex ,cube2Effects,mCubeMesh );
-      mFloorNode = new DistortedNode(mFloorTex,floorEffects,mQuad     );
-      mFBONode   = new DistortedNode(mFBOTex  ,FBOEffects  ,mQuad     );
+      mCube1Node = new DistortedNode(mCubeTex , cube1Effects, cube );
+      mCube2Node = new DistortedNode(mCubeTex , cube2Effects, cube );
+      mFloorNode = new DistortedNode(mFloorTex, floorEffects, quad );
+      mFBONode   = new DistortedNode(mFBOTex  , FBOEffects  , quad );
 
       ///////////////// The Meat of this App - shamelessly ripped off https://open.gl/depthstencils ///////////////////////
       /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -142,17 +138,11 @@ class StencilRenderer implements GLSurfaceView.Renderer
 
       float cw = mCubeTex.getWidth();
       float ch = mCubeTex.getHeight();
-      float cd = mCubeTex.getDepth(mCubeMesh);
 
       float fw = mFloorTex.getWidth();
       float fh = mFloorTex.getHeight();
-      float fd = mFloorTex.getDepth(mQuad);
-
-      Static3D cubeCenter = new Static3D(cw/2,ch  ,cd/2);
-      Static3D floorCenter= new Static3D(fw/2,fh/2,fd/2);
 
       Static3D axisX = new Static3D(1,0,0);
-      Static3D axisY = new Static3D(0,1,0);
       Static3D axisZ = new Static3D(0,0,1);
 
       Dynamic1D rotDyn = new Dynamic1D(5000,0.0f);
@@ -160,41 +150,38 @@ class StencilRenderer implements GLSurfaceView.Renderer
       rotDyn.add(new Static1D(  0));
       rotDyn.add(new Static1D(360));
 
-      float angle = 30.0f;
-
-      Static1D rotSt1 = new Static1D(angle);
-      Static1D rotSt2 = new Static1D(angle-90.0f);
-
-      MatrixEffectRotate rot1 = new MatrixEffectRotate(rotSt1, axisX, cubeCenter);
-      MatrixEffectRotate rot2 = new MatrixEffectRotate(rotDyn, axisY, cubeCenter);
-      MatrixEffectScale  scal = new MatrixEffectScale(mCubeScale);
-      MatrixEffectMove   move = new MatrixEffectMove(mCubeMove);
+      MatrixEffectScale  scale = new MatrixEffectScale(mScale);
+      MatrixEffectMove   move1 = new MatrixEffectMove( new Static3D( (fw-cw)/2, (fh-ch)/2, 0) );
+      MatrixEffectMove   move2 = new MatrixEffectMove( mMove );
+      MatrixEffectRotate rotaX = new MatrixEffectRotate(new Static1D(-60.0f), axisX, mRotCenter);
+      MatrixEffectRotate rotaZ = new MatrixEffectRotate(rotDyn, axisZ, mRotCenter);
 
       /////////////////////////////////////////////////////////////////////////////////////////////////////
-      // Those Matrix effects, i.e. correct positioning of Objects on the Screen, is admittedly quite hard.
-      // Figured out of experimentation.
+      // First move the cube and its reflection to the middle of the floor. Then scale the floor, the cube
+      // and its reflection. Then keep rotating all along the Z axis, tilt all, and finally move all to the
+      // middle of the screen.
       /////////////////////////////////////////////////////////////////////////////////////////////////////
-      // Upper cube
-      cube1Effects.apply( move );
-      cube1Effects.apply( scal );
-      cube1Effects.apply( rot1 );
-      cube1Effects.apply( rot2 );
-
+      // The cube
+      cube1Effects.apply( move2 );
+      cube1Effects.apply( rotaX );
+      cube1Effects.apply( rotaZ );
+      cube1Effects.apply( scale );
+      cube1Effects.apply( move1 );
       /////////////////////////////////////////////////////////////////////////////////////////////////////
       // Floor
-      floorEffects.apply( new MatrixEffectMove(mFloorMove));
-      floorEffects.apply( new MatrixEffectScale(mFloorScale) );
-      floorEffects.apply( new MatrixEffectRotate(rotSt2, axisX, floorCenter) );
-      floorEffects.apply( new MatrixEffectRotate(rotDyn, axisZ, floorCenter) );
-
+      floorEffects.apply( move2 );
+      floorEffects.apply( rotaX );
+      floorEffects.apply( rotaZ );
+      floorEffects.apply( scale );
       /////////////////////////////////////////////////////////////////////////////////////////////////////
-      // Lower cube
-      cube2Effects.apply( move );
-      cube2Effects.apply( scal );
-      cube2Effects.apply( rot1 );
-      cube2Effects.apply( rot2 );
-      cube2Effects.apply( new MatrixEffectScale(new Static3D(1,-1,1)) );
-      cube2Effects.apply( new MatrixEffectMove(new Static3D( 0, -2*ch , 0)) );
+      // Reflection
+      cube2Effects.apply( move2 );
+      cube2Effects.apply( rotaX );
+      cube2Effects.apply( rotaZ );
+      cube2Effects.apply( scale );
+      cube2Effects.apply( move1 );
+      cube2Effects.apply( new MatrixEffectScale(new Static3D(1,1,-1)) );
+      cube2Effects.apply( new FragmentEffectBrightness(new Static1D(0.5f)) );
 
       /////////////////////////////////////////////////////////////////////////////////////////////////////
       // Framebuffer
@@ -214,25 +201,21 @@ class StencilRenderer implements GLSurfaceView.Renderer
       {
       float cw = mCubeTex.getWidth();
       float ch = mCubeTex.getHeight();
-      float cd = mCubeTex.getDepth(mCubeMesh);
 
       float fw = mFloorTex.getWidth();
       float fh = mFloorTex.getHeight();
-      float fd = mFloorTex.getDepth(mQuad);
 
       float bw = mFBOTex.getWidth();
       float bh = mFBOTex.getHeight();
 
-      float cubeScale = 0.4f*(width>height ? height/ch:width/cw);
-      float floorScale= 0.8f*(width>height ? height/fh:width/fw);
+      float scale = 0.4f*(width>height ? height/ch:width/cw);
 
-      mCubeMove.set((width-cubeScale*cw)/2 , height/2-cubeScale*ch , cubeScale *cd/2 );
-      mCubeScale.set(cubeScale,cubeScale,cubeScale);
-      mFloorMove.set((width-floorScale*fw)/2 ,height/2-floorScale*fh/2, floorScale*fd/2 );
-      mFloorScale.set(floorScale,floorScale,floorScale);
+      mRotCenter.set(scale*fw/2,scale*fh/2,0);
+      mScale.set(scale,scale,scale);
+      mMove.set((width-scale*fw)/2 , (height-scale*fh)/2, 0 );
       mFBOScale.set((float)width/bw, (float)height/bh, 1.0f );
 
-      mFBONode.resize( (int)((float)width/bw), (int)((float)height/bh) );
+      mFBONode.resize(width,height);
       mScreen.resize( width,height);
       }
 
diff --git a/src/main/java/org/distorted/examples/transparency/TransparencyActivity.java b/src/main/java/org/distorted/examples/transparency/TransparencyActivity.java
index ccd31bb..f690a43 100644
--- a/src/main/java/org/distorted/examples/transparency/TransparencyActivity.java
+++ b/src/main/java/org/distorted/examples/transparency/TransparencyActivity.java
@@ -102,7 +102,7 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = this.findViewById(R.id.transparencySurfaceView);
+      GLSurfaceView view = findViewById(R.id.transparencySurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -114,7 +114,7 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = this.findViewById(R.id.transparencySurfaceView);
+      GLSurfaceView view = findViewById(R.id.transparencySurfaceView);
       view.onResume();
       }
     
@@ -153,10 +153,10 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
       {
       switch (bar.getId())
         {
-        case R.id.transparencySeekRed:    TransparencySurfaceView view0 = this.findViewById(R.id.transparencySurfaceView);
+        case R.id.transparencySeekRed:    TransparencySurfaceView view0 = findViewById(R.id.transparencySurfaceView);
                                           view0.getRenderer().setTransparency(0, (float)progress/100 );
                                           break;
-        case R.id.transparencySeekYellow: TransparencySurfaceView view1 = this.findViewById(R.id.transparencySurfaceView);
+        case R.id.transparencySeekYellow: TransparencySurfaceView view1 = findViewById(R.id.transparencySurfaceView);
                                           view1.getRenderer().setTransparency(1, (float)progress/100 );
                                           break;
         }
@@ -174,7 +174,7 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
 
     private void setRenderModeToOIT(boolean oit)
       {
-      TransparencySurfaceView view = this.findViewById(R.id.transparencySurfaceView);
+      TransparencySurfaceView view = findViewById(R.id.transparencySurfaceView);
       TransparencyRenderer renderer= view.getRenderer();
 
       renderer.setRenderModeToOIT(oit);
@@ -184,7 +184,7 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
 
     private void privateRenderFirst(int index)
       {
-      TransparencySurfaceView view = this.findViewById(R.id.transparencySurfaceView);
+      TransparencySurfaceView view = findViewById(R.id.transparencySurfaceView);
       TransparencyRenderer renderer= view.getRenderer();
 
       renderer.setRenderFirst(index);
@@ -198,7 +198,7 @@ public class TransparencyActivity extends Activity implements SeekBar.OnSeekBarC
       {
       CheckBox box = (CheckBox)view;
       boolean checked = box.isChecked();
-      TransparencySurfaceView sView = this.findViewById(R.id.transparencySurfaceView);
+      TransparencySurfaceView sView = findViewById(R.id.transparencySurfaceView);
 
       switch(box.getId())
         {
diff --git a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
index 5409bcd..9bb27bd 100644
--- a/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
+++ b/src/main/java/org/distorted/examples/transparency/TransparencyRenderer.java
@@ -47,8 +47,8 @@ class TransparencyRenderer implements GLSurfaceView.Renderer
 
     private static final int[] OBJECTS =
         {
-         +9, -10, +2, 0xffff0000,
-         -9, +10, -2, 0xffffff00
+         +9, +10, +2, 0xffff0000,
+         -9, -10, -2, 0xffffff00
         };
 
     private static final int NUM_OBJECTS = OBJECTS.length/NUM;
@@ -217,9 +217,9 @@ class TransparencyRenderer implements GLSurfaceView.Renderer
       float size= 0.02f*OBJ_SIZE;
       mScreenMin = width<height ? width:height;
 
-      float factor = 0.70f*mScreenMin/OBJ_SIZE;
+      float factor = 0.65f*mScreenMin/OBJ_SIZE;
       mScale.set(factor,factor,factor);
-      mCenter.set((float)OBJ_SIZE/2, (float)OBJ_SIZE/2, (float)OBJ_SIZE/2 );
+      mCenter.set((float)OBJ_SIZE/2, (float)OBJ_SIZE/2, 0 );
       mMove.set( (width -factor*OBJ_SIZE)/2 ,(height-factor*OBJ_SIZE)/2 ,0);
 
       for(int i=0; i<NUM_OBJECTS; i++)
diff --git a/src/main/java/org/distorted/examples/triblur/TriblurActivity.java b/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
index 70ea826..f306fe3 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurActivity.java
@@ -25,7 +25,6 @@ import android.os.Bundle;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
 import android.widget.SeekBar;
 import android.widget.Spinner;
 
@@ -106,7 +105,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
         {
         case R.id.triblur_spinnerQuality: privateQuality(pos);
                                           break;
-        case R.id.triblur_spinnerMode   : TriblurSurfaceView v = this.findViewById(R.id.triblurSurfaceView);
+        case R.id.triblur_spinnerMode   : TriblurSurfaceView v = findViewById(R.id.triblurSurfaceView);
                                           TriblurRenderer renderer = v.getRenderer();
                                           renderer.setRenderModeToOIT(pos==1);
                                           break;
@@ -124,7 +123,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+      GLSurfaceView view = findViewById(R.id.triblurSurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -136,7 +135,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+      GLSurfaceView view = findViewById(R.id.triblurSurfaceView);
       view.onResume();
       }
     
@@ -156,7 +155,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
       {
       super.onSaveInstanceState(savedInstanceState);
 
-      TriblurSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+      TriblurSurfaceView view = findViewById(R.id.triblurSurfaceView);
       TriblurRenderer renderer = view.getRenderer();
 
       savedInstanceState.putIntArray("effects", renderer.getEffects() );
@@ -173,7 +172,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
       int[] effects = savedInstanceState.getIntArray("effects");
 
-      TriblurSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+      TriblurSurfaceView view = findViewById(R.id.triblurSurfaceView);
       TriblurRenderer renderer = view.getRenderer();
 
       if( effects!=null )
@@ -197,13 +196,13 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
       {
       switch (bar.getId())
         {
-        case R.id.triblurSeek0: TriblurSurfaceView view0 = this.findViewById(R.id.triblurSurfaceView);
+        case R.id.triblurSeek0: TriblurSurfaceView view0 = findViewById(R.id.triblurSurfaceView);
                                 view0.getRenderer().setRange(0,progress);
                                 break;
-        case R.id.triblurSeek1: TriblurSurfaceView view1 = this.findViewById(R.id.triblurSurfaceView);
+        case R.id.triblurSeek1: TriblurSurfaceView view1 = findViewById(R.id.triblurSurfaceView);
                                 view1.getRenderer().setRange(1,progress);
                                 break;
-        case R.id.triblurSeek2: TriblurSurfaceView view2 = this.findViewById(R.id.triblurSurfaceView);
+        case R.id.triblurSeek2: TriblurSurfaceView view2 = findViewById(R.id.triblurSurfaceView);
                                 view2.getRenderer().setRange(2,progress);
                                 break;
         }
@@ -239,7 +238,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
   private void privateEffect(int index)
     {
-    TriblurSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+    TriblurSurfaceView view = findViewById(R.id.triblurSurfaceView);
     TriblurRenderer renderer = view.getRenderer();
 
     switch(index)
@@ -272,7 +271,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
   private void privateBackgroundColor(int index)
     {
-    TriblurSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+    TriblurSurfaceView view = findViewById(R.id.triblurSurfaceView);
     TriblurRenderer renderer = view.getRenderer();
 
     switch(index)
@@ -287,7 +286,7 @@ public class TriblurActivity extends Activity implements SeekBar.OnSeekBarChange
 
   private void privateQuality(int index)
     {
-    TriblurSurfaceView view = this.findViewById(R.id.triblurSurfaceView);
+    TriblurSurfaceView view = findViewById(R.id.triblurSurfaceView);
     TriblurRenderer renderer = view.getRenderer();
 
     switch(index)
diff --git a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
index eb7fca5..43047f1 100644
--- a/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
+++ b/src/main/java/org/distorted/examples/triblur/TriblurRenderer.java
@@ -221,8 +221,8 @@ class TriblurRenderer implements GLSurfaceView.Renderer
       mScale1.set(factor1,factor1,factor1);
       mScale2.set(factor2,factor2,factor2);
       mCenter.set((float)OBJ_SIZE/2, (float)OBJ_SIZE/2, (float)OBJ_SIZE/2 );
-      mMove1.set( (width -factor1*OBJ_SIZE)/2 ,(height-factor1*OBJ_SIZE)/2 ,0);
-      mMove2.set( (width -factor2*OBJ_SIZE)/2 ,(height-factor2*OBJ_SIZE)/2 ,0);
+      mMove1.set( (width -factor1*OBJ_SIZE)/2 ,(height-factor1*OBJ_SIZE)/2 , -factor1*OBJ_SIZE);
+      mMove2.set( (width -factor2*OBJ_SIZE)/2 ,(height-factor2*OBJ_SIZE)/2 , -factor2*OBJ_SIZE);
       mScreen.resize(width, height);
       }
 
diff --git a/src/main/java/org/distorted/examples/wind/WindActivity.java b/src/main/java/org/distorted/examples/wind/WindActivity.java
index 5d9c6a2..d4a93ee 100644
--- a/src/main/java/org/distorted/examples/wind/WindActivity.java
+++ b/src/main/java/org/distorted/examples/wind/WindActivity.java
@@ -43,10 +43,10 @@ public class WindActivity extends Activity implements OnSeekBarChangeListener
       super.onCreate(icicle);
       setContentView(R.layout.windlayout);
        
-      SeekBar bar = (SeekBar)findViewById(R.id.windSeek);
+      SeekBar bar = findViewById(R.id.windSeek);
       bar.setOnSeekBarChangeListener(this);
         
-      windText = (TextView)findViewById(R.id.windText);
+      windText = findViewById(R.id.windText);
      
       bar.setProgress(50);
       
@@ -58,7 +58,7 @@ public class WindActivity extends Activity implements OnSeekBarChangeListener
     @Override
     protected void onPause() 
       {
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.windSurfaceView);
+      GLSurfaceView view = findViewById(R.id.windSurfaceView);
       view.onPause();
       Distorted.onPause();
       super.onPause();
@@ -70,7 +70,7 @@ public class WindActivity extends Activity implements OnSeekBarChangeListener
     protected void onResume() 
       {
       super.onResume();
-      GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.windSurfaceView);
+      GLSurfaceView view = findViewById(R.id.windSurfaceView);
       view.onResume();
       }
  
@@ -89,7 +89,7 @@ public class WindActivity extends Activity implements OnSeekBarChangeListener
       {
       switch (bar.getId()) 
         {
-        case R.id.windSeek:WindSurfaceView view = (WindSurfaceView) this.findViewById(R.id.windSurfaceView);
+        case R.id.windSeek:WindSurfaceView view = findViewById(R.id.windSurfaceView);
                            view.getRenderer().setWind(progress);
                            windText.setText(getString(R.string.wind_placeholder,progress));
                            break;
diff --git a/src/main/java/org/distorted/examples/wind/WindRenderer.java b/src/main/java/org/distorted/examples/wind/WindRenderer.java
index 98116e0..2830c91 100644
--- a/src/main/java/org/distorted/examples/wind/WindRenderer.java
+++ b/src/main/java/org/distorted/examples/wind/WindRenderer.java
@@ -105,7 +105,7 @@ class WindRenderer implements GLSurfaceView.Renderer
    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
       {
       float factor = ( (float)(width<height? width:height) )/(mObjHeight + 1.4f*mObjWidth);
-      mMove.set( factor*mObjHeight*0.58f , factor*mObjHeight*0.08f , 0 );
+      mMove.set( factor*mObjHeight*0.58f , height - factor*mObjHeight*1.08f , 0 );
       mScale.set(factor,factor,factor);
       mScreen.resize(width, height);
       }
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index ecb914d..41e1eda 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -78,6 +78,8 @@
     <string name="matrixautomatic">Automatic Matrix Effects</string>
     <string name="inflate">Inflate</string>
     <string name="none">None</string>
+    <string name="effect_live">LIVE </string>
+    <string name="effect_finished">FINISHED </string>
 
     <string name="quality0">Highest</string>
     <string name="quality1">High</string>
@@ -108,6 +110,7 @@
     <string name="glow_radius_placeholder">Radius: %1$d</string>
     <string name="glow_alpha_placeholder">Alpha: %1$.2f</string>
     <string name="inflate_placeholder">Inflate: %1$.2f</string>
+    <string name="effect_id_placeholder">ID: %1$d</string>
 
     <string name="example_monalisa">Mona Lisa</string>
     <string name="example_monalisa_subtitle">The basics of Distortions.</string>
