commit 41a81a140071f8abe6502768bcfeaad96d7588e9
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Fri Jan 20 23:50:25 2017 +0000

    Try using OpenGL ES 3.0 everywhere (but if device does not support it, try creating 2.0 context - this is important because of the emulator!)

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index 52223c1..f84dc34 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.aroundtheworld;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -76,7 +76,7 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
 
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -108,7 +108,7 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+      GLES30.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.face);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
index 0bb2d5c..b85465d 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
@@ -26,7 +26,7 @@ import java.nio.FloatBuffer;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 import android.opengl.Matrix;
 
@@ -105,7 +105,7 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 
 	@Override public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
 	  {
-		GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+		GLES30.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
 
 		final float eyeX = 0.0f;
 		final float eyeY = 0.0f;
@@ -142,19 +142,19 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 		  + "  gl_FragColor = v_Color;    \n"
 		  + "  }                          \n";
 
-		int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
+		int vertexShaderHandle = GLES30.glCreateShader(GLES30.GL_VERTEX_SHADER);
 
 		if (vertexShaderHandle != 0)
 		  {
-			GLES20.glShaderSource(vertexShaderHandle, vertexShader);
-      GLES20.glCompileShader(vertexShaderHandle);
+			GLES30.glShaderSource(vertexShaderHandle, vertexShader);
+      GLES30.glCompileShader(vertexShaderHandle);
 
       final int[] compileStatus = new int[1];
-			GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
+			GLES30.glGetShaderiv(vertexShaderHandle, GLES30.GL_COMPILE_STATUS, compileStatus, 0);
 
 			if (compileStatus[0] == 0)
   			{
-				GLES20.glDeleteShader(vertexShaderHandle);
+				GLES30.glDeleteShader(vertexShaderHandle);
 				vertexShaderHandle = 0;
 	  		}
 		  }
@@ -164,19 +164,19 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 			throw new RuntimeException("Error creating vertex shader.");
 		  }
 
-		int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
+		int fragmentShaderHandle = GLES30.glCreateShader(GLES30.GL_FRAGMENT_SHADER);
 
 		if (fragmentShaderHandle != 0)
 		  {
-			GLES20.glShaderSource(fragmentShaderHandle, fragmentShader);
-      GLES20.glCompileShader(fragmentShaderHandle);
+			GLES30.glShaderSource(fragmentShaderHandle, fragmentShader);
+      GLES30.glCompileShader(fragmentShaderHandle);
 
 			final int[] compileStatus = new int[1];
-			GLES20.glGetShaderiv(fragmentShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
+			GLES30.glGetShaderiv(fragmentShaderHandle, GLES30.GL_COMPILE_STATUS, compileStatus, 0);
 
 			if (compileStatus[0] == 0)
 			  {
-				GLES20.glDeleteShader(fragmentShaderHandle);
+				GLES30.glDeleteShader(fragmentShaderHandle);
 				fragmentShaderHandle = 0;
 			  }
 		  }
@@ -186,22 +186,22 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 			throw new RuntimeException("Error creating fragment shader.");
 		  }
 
-		int programHandle = GLES20.glCreateProgram();
+		int programHandle = GLES30.glCreateProgram();
 
 		if (programHandle != 0)
 		  {
-			GLES20.glAttachShader(programHandle, vertexShaderHandle);
-      GLES20.glAttachShader(programHandle, fragmentShaderHandle);
-			GLES20.glBindAttribLocation(programHandle, 0, "a_Position");
-			GLES20.glBindAttribLocation(programHandle, 1, "a_Color");
-			GLES20.glLinkProgram(programHandle);
+			GLES30.glAttachShader(programHandle, vertexShaderHandle);
+      GLES30.glAttachShader(programHandle, fragmentShaderHandle);
+			GLES30.glBindAttribLocation(programHandle, 0, "a_Position");
+			GLES30.glBindAttribLocation(programHandle, 1, "a_Color");
+			GLES30.glLinkProgram(programHandle);
 
 			final int[] linkStatus = new int[1];
-			GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0);
+			GLES30.glGetProgramiv(programHandle, GLES30.GL_LINK_STATUS, linkStatus, 0);
 
 			if (linkStatus[0] == 0)
 			  {
-				GLES20.glDeleteProgram(programHandle);
+				GLES30.glDeleteProgram(programHandle);
 				programHandle = 0;
 			  }
 		  }
@@ -211,11 +211,11 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 			throw new RuntimeException("Error creating program.");
 		  }
 
-    mMVPMatrixH = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
-    mPositionH  = GLES20.glGetAttribLocation(programHandle, "a_Position");
-    mColorH     = GLES20.glGetAttribLocation(programHandle, "a_Color");
+    mMVPMatrixH = GLES30.glGetUniformLocation(programHandle, "u_MVPMatrix");
+    mPositionH  = GLES30.glGetAttribLocation(programHandle, "a_Position");
+    mColorH     = GLES30.glGetAttribLocation(programHandle, "a_Color");
 
-    GLES20.glUseProgram(programHandle);
+    GLES30.glUseProgram(programHandle);
 	  }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -225,7 +225,7 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 	  mHeight = height;
 	  mWidth  = width;
 
-		GLES20.glViewport(0, 0, width, height);
+		GLES30.glViewport(0, 0, width, height);
 
 		final float ratio  = (float) width / height;
 		final float left   =-ratio;
@@ -243,32 +243,32 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 
 	@Override public void onDrawFrame(GL10 glUnused)
 	  {
-		GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
+		GLES30.glClear(GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
+    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
 
     ///////// 'white-black-yellow' triangle //////
     mTriangleVert.position(POSITION_OFFSET);
-    GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
-    GLES20.glEnableVertexAttribArray(mPositionH);
+    GLES30.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
+    GLES30.glEnableVertexAttribArray(mPositionH);
     mTriangleVert.position(COLOR_OFFSET);
-    GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
-    GLES20.glEnableVertexAttribArray(mColorH);
+    GLES30.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES30.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
+    GLES30.glEnableVertexAttribArray(mColorH);
 
-		GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
-		GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
+		GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
+		GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 3);
 
     //////// 'current position' square ///////////
     mSquareVert.position(POSITION_OFFSET);
-    GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
-    GLES20.glEnableVertexAttribArray(mPositionH);
+    GLES30.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
+    GLES30.glEnableVertexAttribArray(mPositionH);
     mSquareVert.position(COLOR_OFFSET);
-    GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
-    GLES20.glEnableVertexAttribArray(mColorH);
+    GLES30.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES30.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
+    GLES30.glEnableVertexAttribArray(mColorH);
 
     Matrix.multiplyMM(mMVPSquareMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
     Matrix.multiplyMM(mMVPSquareMatrix, 0, mProjectionMatrix, 0, mMVPSquareMatrix, 0);
 
-    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPSquareMatrix, 0);
-		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0,4);
+    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPSquareMatrix, 0);
+		GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0,4);
 	  }
   }
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceView.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceView.java
index 1e43ca2..296bc90 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceView.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.aroundtheworld;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,17 +33,21 @@ class AroundTheWorldSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public AroundTheWorldSurfaceView(Context c, AttributeSet attrs)
+    public AroundTheWorldSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new AroundTheWorldRenderer(this);
         setRenderer(mRenderer);
         }
       }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public AroundTheWorldEffectsManager getManager()
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
index 6aaca78..0d89e57 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.aroundtheworld;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -33,13 +35,16 @@ class AroundTheWorldSurfaceViewPicker extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public AroundTheWorldSurfaceViewPicker(Context c, AttributeSet attrs)
+    public AroundTheWorldSurfaceViewPicker(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new AroundTheWorldRendererPicker();
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 7dbd68f..db051aa 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -39,7 +39,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -96,7 +96,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -130,7 +130,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.bean);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/bean/BeanSurfaceView.java b/src/main/java/org/distorted/examples/bean/BeanSurfaceView.java
index ad70483..a06e4d1 100644
--- a/src/main/java/org/distorted/examples/bean/BeanSurfaceView.java
+++ b/src/main/java/org/distorted/examples/bean/BeanSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.bean;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.os.Build;
 
@@ -32,7 +34,10 @@ class BeanSurfaceView extends GLSurfaceView
     public BeanSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new BeanRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/blur/BlurRenderer.java b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
index 21463c9..ca2ae65 100644
--- a/src/main/java/org/distorted/examples/blur/BlurRenderer.java
+++ b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.blur;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -82,7 +82,7 @@ class BlurRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -116,7 +116,7 @@ class BlurRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.dog);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/blur/BlurSurfaceView.java b/src/main/java/org/distorted/examples/blur/BlurSurfaceView.java
index 721127e..b6e2330 100644
--- a/src/main/java/org/distorted/examples/blur/BlurSurfaceView.java
+++ b/src/main/java/org/distorted/examples/blur/BlurSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.blur;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class BlurSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public BlurSurfaceView(Context c, AttributeSet attrs)
+  public BlurSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new BlurRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 20fda86..83e9baa 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -40,7 +40,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -85,7 +85,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -93,7 +93,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.cat_and_dog);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogSurfaceView.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogSurfaceView.java
index 156ccfe..afe2b6f 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogSurfaceView.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.catanddog;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class CatAndDogSurfaceView extends GLSurfaceView
     public CatAndDogSurfaceView(Context context)
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new CatAndDogRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index afec1a3..a0526b3 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -44,7 +44,7 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 import android.util.Log;
 
@@ -81,7 +81,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -115,7 +115,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {  
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.success);
       Bitmap bitmap;
@@ -196,13 +196,13 @@ class CheckRenderer implements GLSurfaceView.Renderer
       
         String ver;
       
-        ver = GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION);   
+        ver = GLES30.glGetString(GLES30.GL_SHADING_LANGUAGE_VERSION);   
         compilationResult += "\n\nGLSL version: "+(ver==null ? "null" : ver);
-        ver = GLES20.glGetString(GLES20.GL_VERSION);  
+        ver = GLES30.glGetString(GLES30.GL_VERSION);  
         compilationResult += "\nGL version: "+(ver==null ? "null" : ver);
-        ver = GLES20.glGetString(GLES20.GL_VENDOR);   
+        ver = GLES30.glGetString(GLES30.GL_VENDOR);   
         compilationResult += "\nGL vendor: "+(ver==null ? "null" : ver);
-        ver = GLES20.glGetString(GLES20.GL_RENDERER);    
+        ver = GLES30.glGetString(GLES30.GL_RENDERER);    
         compilationResult += "\nGL renderer: "+(ver==null ? "null" : ver);
       
         CheckActivity act = (CheckActivity)mView.getContext();
diff --git a/src/main/java/org/distorted/examples/check/CheckSurfaceView.java b/src/main/java/org/distorted/examples/check/CheckSurfaceView.java
index 9e0edd8..5f6e985 100644
--- a/src/main/java/org/distorted/examples/check/CheckSurfaceView.java
+++ b/src/main/java/org/distorted/examples/check/CheckSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.check;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -29,17 +31,18 @@ class CheckSurfaceView extends GLSurfaceView
 {
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public CheckSurfaceView(Context c, AttributeSet attrs) 
+    public CheckSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
     
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         setRenderer(new CheckRenderer(this));
         }
       }
 
 }
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
diff --git a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
index d86b89b..d6016a5 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesRenderer.java
@@ -39,7 +39,7 @@ import org.distorted.library.Distorted;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -88,7 +88,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -124,7 +124,7 @@ class CubesRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.grid);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/cubes/CubesSurfaceView.java b/src/main/java/org/distorted/examples/cubes/CubesSurfaceView.java
index 4a9d33e..6ba6c00 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesSurfaceView.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesSurfaceView.java
@@ -21,7 +21,9 @@ package org.distorted.examples.cubes;
 
 import org.distorted.examples.R;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -36,19 +38,22 @@ class CubesSurfaceView extends GLSurfaceView
 	
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public CubesSurfaceView(Context c, AttributeSet attrs) 
+    public CubesSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c,attrs);
+      super(context,attrs);
     
       mX = -1;
       mY = -1;
       
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new CubesRenderer(this);
         setRenderer(mRenderer);
-        Toast.makeText(c, R.string.example_rotate_toast , Toast.LENGTH_SHORT).show();
+        Toast.makeText(context, R.string.example_rotate_toast , Toast.LENGTH_SHORT).show();
         }
       }
     
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 29a233c..cc74461 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -39,7 +39,7 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -180,7 +180,7 @@ class DeformRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused)
      {
-     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+     GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     
      long time = System.currentTimeMillis();
       
@@ -229,7 +229,7 @@ class DeformRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
      {
-     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+     GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
      try
        {
diff --git a/src/main/java/org/distorted/examples/deform/DeformSurfaceView.java b/src/main/java/org/distorted/examples/deform/DeformSurfaceView.java
index f2757dd..66abcd4 100644
--- a/src/main/java/org/distorted/examples/deform/DeformSurfaceView.java
+++ b/src/main/java/org/distorted/examples/deform/DeformSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.deform;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -33,13 +35,16 @@ class DeformSurfaceView extends GLSurfaceView
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public DeformSurfaceView(Context c, AttributeSet attrs) 
+    public DeformSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
     
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new DeformRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index aeb6dd3..037e24e 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -40,7 +40,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -107,7 +107,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       
       long time = System.currentTimeMillis();
       
@@ -154,7 +154,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+      GLES30.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
 
       Bitmap bitmap0= readBitmap(R.raw.dog);
       Bitmap bitmap1= readBitmap(R.raw.face);
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsSurfaceView.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsSurfaceView.java
index 3b32873..8e68439 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.differentbitmaps;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class DifferentBitmapsSurfaceView extends GLSurfaceView
     public DifferentBitmapsSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new DifferentBitmapsRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 38cd389..f996a27 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -41,7 +41,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -101,7 +101,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused)
      {
-     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+     GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       
      long time = System.currentTimeMillis();
    
@@ -148,7 +148,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
      {
-     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+     GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
      InputStream is = mView.getContext().getResources().openRawResource(R.raw.dog);
      Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsSurfaceView.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsSurfaceView.java
index 9cd31cb..799c296 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.differenteffects;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class DifferentEffectsSurfaceView extends GLSurfaceView
     public DifferentEffectsSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new DifferentEffectsRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
index 8dc8110..9e032a6 100644
--- a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
@@ -26,7 +26,7 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedEffects;
@@ -99,7 +99,7 @@ class DynamicRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused)
      {   
-     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);               
+     GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT);               
        
      long time = System.currentTimeMillis();
       
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java b/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
index a759b66..9f2292c 100644
--- a/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.dynamic;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.view.MotionEvent;
 import android.util.AttributeSet;
@@ -76,9 +78,9 @@ public class DynamicSurfaceView extends GLSurfaceView
       
 ///////////////////////////////////////////////////////////////////
     
-    public DynamicSurfaceView(Context c, AttributeSet attrs)
+    public DynamicSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
       
       mPaint = new Paint();
       mPaint.setStyle(Style.FILL);
@@ -108,7 +110,10 @@ public class DynamicSurfaceView extends GLSurfaceView
         {
         setFocusable(true);
         setFocusableInTouchMode(true);
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         DynamicRenderer mRenderer = new DynamicRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index 747feb8..f553405 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -26,7 +26,7 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedEffects;
@@ -129,7 +129,7 @@ class EffectQueueRenderer implements GLSurfaceView.Renderer, EffectListener
    
   public void onDrawFrame(GL10 glUnused)
     {   
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
+    GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT);
     mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
     }
 
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
index 403c1e3..14cc48e 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.effectqueue;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.view.MotionEvent;
 import android.util.AttributeSet;
@@ -49,9 +51,9 @@ public class EffectQueueSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-  public EffectQueueSurfaceView(Context c, AttributeSet attrs)
+  public EffectQueueSurfaceView(Context context, AttributeSet attrs)
     {
-    super(c, attrs);
+    super(context, attrs);
       
     int duration = 10000;
     float count  = 1.0f;
@@ -85,7 +87,10 @@ public class EffectQueueSurfaceView extends GLSurfaceView
       {
       setFocusable(true);
       setFocusableInTouchMode(true);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
 
       mRenderer = new EffectQueueRenderer(this);
       setRenderer(mRenderer);
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
index 11d3558..659af28 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.effects3d;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -133,7 +133,7 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
     public void onDrawFrame(GL10 glUnused)
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
 
       long time = System.currentTimeMillis();
 
@@ -221,7 +221,7 @@ class Effects3DRenderer implements GLSurfaceView.Renderer
 
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       Effects3DActivity act = (Effects3DActivity)mView.getContext();
 
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java b/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
index 97bb6c5..d8c0c7f 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.effects3d;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -33,13 +35,16 @@ class Effects3DSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  public Effects3DSurfaceView(Context c, AttributeSet attrs)
+  public Effects3DSurfaceView(Context context, AttributeSet attrs)
     {
-    super(c, attrs);
+    super(context, attrs);
       
     if(!isInEditMode())
       {
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       mRenderer = new Effects3DRenderer(this);
       setRenderer(mRenderer);
       }
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index 8d037c2..67fab29 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -42,7 +42,7 @@ import org.distorted.library.type.Static3D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -79,7 +79,7 @@ class FBORenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused)
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mRoot,System.currentTimeMillis());
       }
 
@@ -113,7 +113,7 @@ class FBORenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.monalisa);
       InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.grid);
diff --git a/src/main/java/org/distorted/examples/fbo/FBOSurfaceView.java b/src/main/java/org/distorted/examples/fbo/FBOSurfaceView.java
index f59e820..edfb84d 100644
--- a/src/main/java/org/distorted/examples/fbo/FBOSurfaceView.java
+++ b/src/main/java/org/distorted/examples/fbo/FBOSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.fbo;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class FBOSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public FBOSurfaceView(Context c, AttributeSet attrs)
+    public FBOSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new FBORenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/flag/FlagRenderer.java b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
index 3c2fc50..ae305b0 100644
--- a/src/main/java/org/distorted/examples/flag/FlagRenderer.java
+++ b/src/main/java/org/distorted/examples/flag/FlagRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.flag;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -142,7 +142,7 @@ class FlagRenderer implements GLSurfaceView.Renderer
 
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -178,7 +178,7 @@ class FlagRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.iceland);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/flag/FlagSurfaceView.java b/src/main/java/org/distorted/examples/flag/FlagSurfaceView.java
index 254cd96..a445244 100644
--- a/src/main/java/org/distorted/examples/flag/FlagSurfaceView.java
+++ b/src/main/java/org/distorted/examples/flag/FlagSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.flag;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -33,16 +35,19 @@ class FlagSurfaceView extends GLSurfaceView
 	
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public FlagSurfaceView(Context c, AttributeSet attrs)
+    public FlagSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c,attrs);
+      super(context,attrs);
     
       mX = -1;
       mY = -1;
       
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new FlagRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 65bd8d0..bcf89d6 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -41,7 +41,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -153,7 +153,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -187,7 +187,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.girl);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/girl/GirlSurfaceView.java b/src/main/java/org/distorted/examples/girl/GirlSurfaceView.java
index 0c9e6ed..b065405 100644
--- a/src/main/java/org/distorted/examples/girl/GirlSurfaceView.java
+++ b/src/main/java/org/distorted/examples/girl/GirlSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.girl;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class GirlSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  public GirlSurfaceView(Context c, AttributeSet attrs) 
+  public GirlSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new GirlRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index c7044d4..e565be4 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -43,7 +43,7 @@ import org.distorted.library.message.EffectMessage;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -105,7 +105,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
 
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -139,7 +139,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.water);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/listener/ListenerSurfaceView.java b/src/main/java/org/distorted/examples/listener/ListenerSurfaceView.java
index c0be3ac..be094ff 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerSurfaceView.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.listener;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class ListenerSurfaceView extends GLSurfaceView
     public ListenerSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new ListenerRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
index 9a16a9f..918c458 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DRenderer.java
@@ -19,7 +19,7 @@
 
 package org.distorted.examples.matrix3d;
 
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.Distorted;
@@ -61,7 +61,7 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
 
     public void onDrawFrame(GL10 glUnused)
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -93,7 +93,7 @@ class Matrix3DRenderer implements GLSurfaceView.Renderer
 
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       Matrix3DActivity act = (Matrix3DActivity)mView.getContext();
 
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DSurfaceView.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DSurfaceView.java
index 7aaf705..2853bb4 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DSurfaceView.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.matrix3d;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class Matrix3DSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-  public Matrix3DSurfaceView(Context c, AttributeSet attrs)
+  public Matrix3DSurfaceView(Context context, AttributeSet attrs)
     {
-    super(c, attrs);
+    super(context, attrs);
       
     if(!isInEditMode())
       {
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       mRenderer = new Matrix3DRenderer(this);
       setRenderer(mRenderer);
       }
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
index fbc29ba..9554d63 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.mirror;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -108,7 +108,7 @@ class MirrorRenderer implements GLSurfaceView.Renderer
 
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
 
       long time = System.currentTimeMillis();
 
@@ -155,7 +155,7 @@ class MirrorRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream isM = mView.getContext().getResources().openRawResource(R.raw.mirror);
       InputStream isH = mView.getContext().getResources().openRawResource(R.raw.messi);
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorSurfaceView.java b/src/main/java/org/distorted/examples/mirror/MirrorSurfaceView.java
index 2400610..24d28e1 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorSurfaceView.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.mirror;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class MirrorSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public MirrorSurfaceView(Context c, AttributeSet attrs)
+    public MirrorSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new MirrorRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index e864200..8e3988b 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -38,7 +38,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -81,7 +81,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -113,7 +113,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.monalisa);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaSurfaceView.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaSurfaceView.java
index 955f51e..74b39b6 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaSurfaceView.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.monalisa;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class MonaLisaSurfaceView extends GLSurfaceView
     public MonaLisaSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new MonaLisaRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
index c3ced87..32a4438 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
@@ -26,7 +26,7 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedFramebuffer;
@@ -141,7 +141,7 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused)
      {   
-     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);               
+     GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT);               
        
      long time = System.currentTimeMillis();
       
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
index 1136c53..5f2def5 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.movingeffects;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
@@ -68,9 +70,9 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    public MovingEffectsSurfaceView(Context c, AttributeSet attrs) 
+    public MovingEffectsSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       mCurrEffect=EFFECT_POINTS;
       mPaint = new Paint();
@@ -86,7 +88,10 @@ public class MovingEffectsSurfaceView extends GLSurfaceView
         {
         setFocusable(true);
         setFocusableInTouchMode(true);
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         setRenderer(mRenderer);
         }
       }
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index 13ea7e4..bfc585d 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -40,7 +40,7 @@ import org.distorted.library.DistortedTexture;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -119,7 +119,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
    
     public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mRoot,System.currentTimeMillis());
       }
 
@@ -155,7 +155,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
     
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.leaf);
       Bitmap leaf;
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicSurfaceView.java b/src/main/java/org/distorted/examples/olimpic/OlimpicSurfaceView.java
index 0c774d7..fa76abc 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicSurfaceView.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.olimpic;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class OlimpicSurfaceView extends GLSurfaceView
     public OlimpicSurfaceView(Context context) 
       {
       super(context);
-      setEGLContextClientVersion(2);
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
       setRenderer(new OlimpicRenderer(this));
       }
 }
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index 8b648db..5bba7e0 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -23,7 +23,7 @@ import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.opengl.EGL14;
 import android.opengl.EGLSurface;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.os.Looper;
 import android.util.Log;
 import android.view.Surface;
@@ -102,9 +102,9 @@ class RenderThread extends Thread
 
   private static void checkGlError(String op)
     {
-    int error = GLES20.glGetError();
+    int error = GLES30.glGetError();
 
-    if (error != GLES20.GL_NO_ERROR)
+    if (error != GLES30.GL_NO_ERROR)
       {
       String msg = op + ": glError 0x" + Integer.toHexString(error);
       Log.e(TAG, msg);
@@ -190,7 +190,7 @@ class RenderThread extends Thread
     eglSurface = eglCore.createWindowSurface(surface);
     eglCore.makeCurrent(eglSurface);
 
-    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
     InputStream is = mView.getContext().getResources().openRawResource(R.raw.monalisa);
     Bitmap bmp;
@@ -266,7 +266,7 @@ class RenderThread extends Thread
 
     eglCore.makeCurrent(eglSurface);
 
-    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
 
     eglCore.swapBuffers(eglSurface);
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index 96cf95f..a908c9e 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -34,7 +34,7 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -90,7 +90,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -142,7 +142,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       try
         {
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionSurfaceView.java b/src/main/java/org/distorted/examples/projection/ProjectionSurfaceView.java
index 5526b91..3aaa85a 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionSurfaceView.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.projection;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class ProjectionSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public ProjectionSurfaceView(Context c, AttributeSet attrs)
+    public ProjectionSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
     
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new ProjectionRenderer(this);
         setRenderer(mRenderer);
         }
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
index d2ca215..a32e570 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionRenderer.java
@@ -41,7 +41,7 @@ import org.distorted.library.Distorted;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -93,7 +93,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
    
   public void onDrawFrame(GL10 glUnused) 
     {
-    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
     }
 
@@ -115,7 +115,7 @@ class QuaternionRenderer implements GLSurfaceView.Renderer
     
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
-    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
     InputStream is = mView.getContext().getResources().openRawResource(R.raw.grid);
     Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionSurfaceView.java b/src/main/java/org/distorted/examples/quaternion/QuaternionSurfaceView.java
index 9e44a76..87af32a 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionSurfaceView.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.quaternion;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -29,7 +31,10 @@ class QuaternionSurfaceView extends GLSurfaceView
   public QuaternionSurfaceView(Context context)
     {
     super(context);
-    setEGLContextClientVersion(2);
+    final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+    android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+    setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
     setRenderer(new QuaternionRenderer(this));
     }
   }
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index 4c8f37c..dacc1af 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -44,7 +44,7 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 import android.os.Environment;
 
@@ -148,7 +148,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
    
   public void onDrawFrame(GL10 glUnused)
     {
-    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
 
     long time = System.currentTimeMillis();
 
@@ -168,8 +168,8 @@ class SaveRenderer implements GLSurfaceView.Renderer
 
       if( textureID>=0 )
         {
-        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
-        GLES20.glReadPixels( 0, 0, fW, fH, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureID);
+        GLES30.glReadPixels( 0, 0, fW, fH, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, buf);
         SaveWorkerThread.newBuffer(buf,fW,fH,mPath);
         }
       else
@@ -223,7 +223,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
     
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
     {
-    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
     InputStream is = mView.getContext().getResources().openRawResource(R.raw.girl);
     Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/save/SaveSurfaceView.java b/src/main/java/org/distorted/examples/save/SaveSurfaceView.java
index 3af4e1a..fc72e1f 100644
--- a/src/main/java/org/distorted/examples/save/SaveSurfaceView.java
+++ b/src/main/java/org/distorted/examples/save/SaveSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.save;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,12 +33,19 @@ class SaveSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public SaveSurfaceView(Context c, AttributeSet attrs)
+  public SaveSurfaceView(Context context, AttributeSet attrs)
     {
-    super(c, attrs);
-    setEGLContextClientVersion(2);
-    mRenderer = new SaveRenderer(this);
-    setRenderer(mRenderer);
+    super(context, attrs);
+
+    if(!isInEditMode())
+      {
+      final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+      android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+      setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
+      mRenderer = new SaveRenderer(this);
+      setRenderer(mRenderer);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 12ddc7b..048b61d 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -39,7 +39,7 @@ import org.distorted.library.type.Static3D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -73,7 +73,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
    
   public void onDrawFrame(GL10 glUnused) 
     {
-    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
     }
 
@@ -107,7 +107,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
     
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
-    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
     InputStream is = mView.getContext().getResources().openRawResource(R.raw.cat);
     Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java b/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
index c7772f0..cb6e0ef 100644
--- a/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
+++ b/src/main/java/org/distorted/examples/sink/SinkSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.sink;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -29,7 +31,10 @@ class SinkSurfaceView extends GLSurfaceView
   public SinkSurfaceView(Context context) 
     {
     super(context);
-    setEGLContextClientVersion(2);
+    final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+    android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+    setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
     setRenderer(new SinkRenderer(this));
     }
   }
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index 88cf682..900f09d 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -48,7 +48,7 @@ import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Typeface;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -149,7 +149,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
    
   public void onDrawFrame(GL10 glUnused) 
     {
-    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     mScreen.renderTo(mRoot,System.currentTimeMillis());
     }
 
@@ -180,7 +180,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
     {
-    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
     setupBitmaps();
 
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsSurfaceView.java b/src/main/java/org/distorted/examples/starwars/StarWarsSurfaceView.java
index c4822fc..257b026 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsSurfaceView.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.starwars;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -31,7 +33,10 @@ class StarWarsSurfaceView extends GLSurfaceView
   public StarWarsSurfaceView(Context context) 
     {
     super(context);
-    setEGLContextClientVersion(2);
+    final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+    android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+    setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
     mRenderer = new StarWarsRenderer(this);
     setRenderer(mRenderer);
     }
diff --git a/src/main/java/org/distorted/examples/wind/WindRenderer.java b/src/main/java/org/distorted/examples/wind/WindRenderer.java
index 00508c1..2f127ae 100644
--- a/src/main/java/org/distorted/examples/wind/WindRenderer.java
+++ b/src/main/java/org/distorted/examples/wind/WindRenderer.java
@@ -21,7 +21,7 @@ package org.distorted.examples.wind;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -80,7 +80,7 @@ class WindRenderer implements GLSurfaceView.Renderer
    
    public void onDrawFrame(GL10 glUnused) 
       {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
       mScreen.renderTo(mTexture, mMesh, mEffects, System.currentTimeMillis() );
       }
 
@@ -108,7 +108,7 @@ class WindRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
       {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
       InputStream is = mView.getContext().getResources().openRawResource(R.raw.iceland);
       Bitmap bitmap;
diff --git a/src/main/java/org/distorted/examples/wind/WindSurfaceView.java b/src/main/java/org/distorted/examples/wind/WindSurfaceView.java
index 223ad42..551cad9 100644
--- a/src/main/java/org/distorted/examples/wind/WindSurfaceView.java
+++ b/src/main/java/org/distorted/examples/wind/WindSurfaceView.java
@@ -19,7 +19,9 @@
 
 package org.distorted.examples.wind;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.pm.ConfigurationInfo;
 import android.opengl.GLSurfaceView;
 import android.util.AttributeSet;
 
@@ -31,13 +33,16 @@ class WindSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public WindSurfaceView(Context c, AttributeSet attrs)
+    public WindSurfaceView(Context context, AttributeSet attrs)
       {
-      super(c, attrs);
+      super(context, attrs);
 
       if(!isInEditMode())
         {
-        setEGLContextClientVersion(2);
+        final ActivityManager activityManager     = (android.app.ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
+        android.util.Log.e("View", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
+        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
         mRenderer = new WindRenderer(this);
         setRenderer(mRenderer);
         }
