From 992b456d64e6128af021067e10e485d25977bf24 Mon Sep 17 00:00:00 2001
From: Michael Bien <mbien@fh-landshut.de>
Date: Sat, 27 Mar 2010 02:57:46 +0100
Subject: refactoring due to gluegen changes. - renamed com.sun.gluegen.runtime
 -> com.jogamp.gluegen.runtime.

---
 make/stub_includes/opengl/gl4.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 make/stub_includes/opengl/gl4.c

(limited to 'make/stub_includes/opengl/gl4.c')

diff --git a/make/stub_includes/opengl/gl4.c b/make/stub_includes/opengl/gl4.c
new file mode 100644
index 000000000..cf8a709f7
--- /dev/null
+++ b/make/stub_includes/opengl/gl4.c
@@ -0,0 +1,11 @@
+#define GLAPI
+
+// Define GL4_PROTOTYPES so that the OpenGL prototypes in
+// "gl3.h" are parsed.
+#define GL4_PROTOTYPES
+
+// Define GL_GL4EXT_PROTOTYPES so that the OpenGL extension prototypes in
+// "gl3ext.h" are parsed.
+#define GL_GL4EXT_PROTOTYPES
+
+#include <GL4/gl3.h>
-- 
cgit v1.2.3


From 32790c376583beccd030eecd7c56cbe66d380172 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Tue, 20 Apr 2010 11:46:26 +0200
Subject: JOGL GL4 preperation (cont):

- All available OpenGL versions (native/platform) are verified at GLProfile
  initialization and can be queried ..
  A mapping of major,compat -> major,minor,options is created.

- Removal of temp context creation, when creating a context.
  This was necessary to query general availability of ARB_create_context.
  Due to the shared context of X11GLXDrawableFactory and WindowsWGLDrawableFactory,
  this is no more necessary.
  Due to the version mapping, the ARB_create_context paramters are known.

- NativeWindow X11Lib: Added X11ErrorHandler, throwing a RuntimeException.
  Necessary to catch BadMatch .. etc X11 errors, eg for glXCreateContextAttribsARB
  Hence all X11 calls are covered now.

- X11DummyGLXDrawable needs to use an own Window, otherwise GLn n>2 fails

- Flattening the desktop GL* implementation,
  all use GL4bcImpl, which reduces the footprint dramatically.

- GL*Impl.isGL*() (desktop) utilizes the GLContext.isGL*(),
  hence the results reflect the actual native context version.

- GLContextImpl makeCurrent/create: Added workflow documentation,
  clarified code, defined abstract methods to have a protocol.

- Removed moved files (from here to gluegen),
  see gluegen a01cb3d59715a41153380f1977ec75263b762dc6

- NativeLibLoader -> <TYPE>JNILibLoader

- Fixed Exception Handling (as in gluegen bce53b52c8638729750c4286dbc04cb14329fd34),
  ie removed empty catch Throwable ..

- GLContext.setSwapInterval(): Nop in offscreen case, otherwise X11IOError (NVIDIA Bug)

Test:
  Tests
    - Junit
    - demos.gears.Gears
    - demos.jrefract.JRefract

  Platforms
    - Linux 64/32 ATI/NVidia
    - MacOsX
    - Windows (virtualbox 3.1.6, offscreen failed)

TODO/BUGS:
    - FIXME ATI GLn n>2 with AWT, can't make context current, works well on NVIDIA though
    - FIXME GL3GL4: Due to GL3 and GL4 implementation bugs, we still choose GL2 first, if available!
    - Add GL 3.3 to GL3/gl3ext.h
    - Add GL 4.0 to GL3/gl3ext.h and fix the GL3/GL4 seperation
    - Rename jogl.gl2.jar -> jogl.gldesktop.jar (as done with it's native lib already)
---
 make/build-jogl.xml                                | 133 +++--
 make/build-junit.xml                               |  18 +
 make/build-nativewindow.xml                        |  14 +-
 make/config/jogl/cg-common-CustomJavaCode.java     |   2 +-
 make/config/jogl/gl-gl2.cfg                        |  48 +-
 make/config/jogl/gl-gl2es12.cfg                    |  90 ----
 make/config/jogl/gl-gl3.cfg                        |  43 +-
 make/config/jogl/gl-gl3bc.cfg                      |  64 +--
 make/config/jogl/gl-gl4.cfg                        |  37 ++
 make/config/jogl/gl-gl4bc.cfg                      | 110 +++++
 make/config/jogl/gl-impl-CustomCCode-gl2.c         |  24 -
 make/config/jogl/gl-impl-CustomCCode-gl2es12.c     |  24 -
 make/config/jogl/gl-impl-CustomCCode-gl3.c         |  24 -
 make/config/jogl/gl-impl-CustomCCode-gl3bc.c       |  24 -
 make/config/jogl/gl-impl-CustomCCode-gl4bc.c       |  24 +
 .../config/jogl/gl-impl-CustomJavaCode-common.java |  74 ++-
 .../jogl/gl-impl-CustomJavaCode-desktop.java       | 250 +++++++---
 make/config/jogl/gl-impl-CustomJavaCode-gl2.java   | 514 --------------------
 .../jogl/gl-impl-CustomJavaCode-gl2es12.java       | 455 ------------------
 make/config/jogl/gl-impl-CustomJavaCode-gl3.java   | 468 ------------------
 make/config/jogl/gl-impl-CustomJavaCode-gl3bc.java | 514 --------------------
 make/config/jogl/gl-impl-CustomJavaCode-gl4.java   | 339 +++++++++++++
 make/config/jogl/gl-impl-CustomJavaCode-gl4bc.java | 385 +++++++++++++++
 make/config/jogl/gl-impl-CustomJavaCode-gles1.java |  41 --
 make/config/jogl/gl-impl-CustomJavaCode-gles2.java |  41 --
 make/config/jogl/gl3-common.cfg                    |   3 +
 make/config/jogl/gl3-desktop-tracker.cfg           |  38 --
 make/config/jogl/gl4-common.cfg                    |   5 +
 make/config/jogl/gl4-desktop-tracker.cfg           |  38 ++
 make/config/jogl/glu-CustomJavaCode-base.java      |   4 +-
 make/config/jogl/glu-CustomJavaCode-gl2es1.java    |   2 +-
 make/config/jogl/glu-common.cfg                    |   2 +-
 make/config/jogl/obsolete/gl-gl2es12.cfg           |  90 ++++
 .../config/jogl/obsolete/gl-impl-CustomCCode-gl2.c |  24 +
 .../jogl/obsolete/gl-impl-CustomCCode-gl2es12.c    |  24 +
 .../config/jogl/obsolete/gl-impl-CustomCCode-gl3.c |  24 +
 .../jogl/obsolete/gl-impl-CustomJavaCode-gl2.java  | 385 +++++++++++++++
 .../obsolete/gl-impl-CustomJavaCode-gl2es12.java   | 353 ++++++++++++++
 make/config/nativewindow/x11-CustomJavaCode.java   |   3 +-
 make/stub_includes/opengl/gl4.c                    |  10 +-
 make/stub_includes/opengl/gl4bc.c                  |  18 +
 .../opengl/impl/ExtensionAvailabilityCache.java    |   4 +-
 .../com/jogamp/opengl/impl/GLContextImpl.java      | 489 ++++++++++++-------
 .../jogamp/opengl/impl/GLDrawableFactoryImpl.java  |   5 +-
 .../com/jogamp/opengl/impl/GLDrawableImpl.java     |   2 +-
 .../com/jogamp/opengl/impl/GLJNILibLoader.java     | 100 ++++
 .../com/jogamp/opengl/impl/NativeLibLoader.java    | 109 -----
 .../com/jogamp/opengl/impl/ThreadingImpl.java      |  11 +-
 .../com/jogamp/opengl/impl/egl/EGLContext.java     |  10 +-
 .../jogamp/opengl/impl/egl/EGLDrawableFactory.java |  12 +-
 .../opengl/impl/egl/EGLDynamicLookupHelper.java    |  12 +-
 .../jogamp/opengl/impl/egl/EGLExternalContext.java |   2 +-
 .../opengl/impl/macosx/cgl/MacOSXCGLContext.java   |  19 +-
 .../impl/macosx/cgl/MacOSXCGLDrawableFactory.java  |  11 +-
 .../impl/macosx/cgl/MacOSXExternalCGLContext.java  |   5 +-
 .../impl/macosx/cgl/MacOSXOnscreenCGLContext.java  |   4 +-
 .../impl/macosx/cgl/MacOSXPbufferCGLContext.java   |  13 +-
 .../macosx/cgl/awt/MacOSXJava2DCGLContext.java     |  11 +-
 .../windows/wgl/WindowsExternalWGLContext.java     |   2 +-
 .../opengl/impl/windows/wgl/WindowsWGLContext.java |  16 +-
 .../windows/wgl/WindowsWGLDrawableFactory.java     |  52 +-
 .../WindowsWGLGraphicsConfigurationFactory.java    |   1 -
 .../opengl/impl/x11/glx/X11DummyGLXDrawable.java   |  13 +-
 .../opengl/impl/x11/glx/X11ExternalGLXContext.java |   2 +-
 .../jogamp/opengl/impl/x11/glx/X11GLXContext.java  | 121 +++--
 .../opengl/impl/x11/glx/X11GLXDrawableFactory.java |  52 +-
 .../opengl/impl/x11/glx/X11PbufferGLXContext.java  |  29 +-
 .../com/jogamp/opengl/util/ImmModeSink.java        |   6 +-
 .../opengl/util/glsl/fixedfunc/FixedFuncUtil.java  |   2 +-
 src/jogl/classes/javax/media/opengl/GL4.java       |   5 -
 src/jogl/classes/javax/media/opengl/GL4bc.java     |   5 -
 src/jogl/classes/javax/media/opengl/GLContext.java | 187 +++++++-
 .../javax/media/opengl/GLDrawableFactory.java      |  62 +--
 src/jogl/classes/javax/media/opengl/GLProfile.java | 534 ++++++++++++---------
 .../test/junit/jogl/acore/TestGLProfile01CORE.java |  95 ++++
 .../jogamp/test/junit/jogl/awt/TestAWT01GLn.java   | 106 ++++
 .../junit/jogl/offscreen/TestOffscreen01NEWT.java  |  39 +-
 .../test/junit/jogl/texture/TestTexture01AWT.java  |   2 +-
 .../jogamp/nativewindow/impl/NWJNILibLoader.java   |  50 ++
 .../com/jogamp/nativewindow/impl/NWReflection.java | 188 --------
 .../nativewindow/impl/NativeLibLoaderBase.java     | 210 --------
 .../nativewindow/impl/NativeWindowFactoryImpl.java |   5 +-
 .../nativewindow/impl/jawt/JAWTJNILibLoader.java   |  78 +++
 .../impl/jawt/JAWTNativeLibLoader.java             |  78 ---
 .../jogamp/nativewindow/impl/jawt/JAWTUtil.java    |   4 +-
 .../com/jogamp/nativewindow/impl/jvm/JVMUtil.java  |  72 ---
 .../com/jogamp/nativewindow/impl/x11/X11Util.java  |   2 +-
 .../nativewindow/GraphicsConfigurationFactory.java |   3 +-
 .../media/nativewindow/NativeWindowFactory.java    |  13 +-
 src/nativewindow/native/JVM_Tool.c                 |  51 --
 src/nativewindow/native/x11/Xmisc.c                |  50 +-
 src/newt/classes/com/jogamp/newt/NewtFactory.java  |   2 +-
 src/newt/classes/com/jogamp/newt/Window.java       |   5 +-
 .../com/jogamp/newt/impl/NEWTJNILibLoader.java     |  62 +++
 .../com/jogamp/newt/impl/NativeLibLoader.java      |  62 ---
 .../classes/com/jogamp/newt/intel/gdl/Display.java |   2 +-
 .../classes/com/jogamp/newt/macosx/MacDisplay.java |   2 +-
 .../jogamp/newt/opengl/broadcom/egl/Display.java   |   2 +-
 .../com/jogamp/newt/opengl/kd/KDDisplay.java       |   2 +-
 .../classes/com/jogamp/newt/util/MainThread.java   |   6 +-
 .../com/jogamp/newt/windows/WindowsDisplay.java    |   2 +-
 .../classes/com/jogamp/newt/x11/X11Display.java    |   2 +-
 src/newt/native/X11Window.c                        |  34 +-
 103 files changed, 3850 insertions(+), 4070 deletions(-)
 delete mode 100644 make/config/jogl/gl-gl2es12.cfg
 create mode 100644 make/config/jogl/gl-gl4.cfg
 create mode 100644 make/config/jogl/gl-gl4bc.cfg
 delete mode 100644 make/config/jogl/gl-impl-CustomCCode-gl2.c
 delete mode 100644 make/config/jogl/gl-impl-CustomCCode-gl2es12.c
 delete mode 100644 make/config/jogl/gl-impl-CustomCCode-gl3.c
 delete mode 100644 make/config/jogl/gl-impl-CustomCCode-gl3bc.c
 create mode 100644 make/config/jogl/gl-impl-CustomCCode-gl4bc.c
 delete mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl2.java
 delete mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
 delete mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl3.java
 delete mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl3bc.java
 create mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl4.java
 create mode 100644 make/config/jogl/gl-impl-CustomJavaCode-gl4bc.java
 delete mode 100644 make/config/jogl/gl3-desktop-tracker.cfg
 create mode 100644 make/config/jogl/gl4-common.cfg
 create mode 100644 make/config/jogl/gl4-desktop-tracker.cfg
 create mode 100644 make/config/jogl/obsolete/gl-gl2es12.cfg
 create mode 100644 make/config/jogl/obsolete/gl-impl-CustomCCode-gl2.c
 create mode 100644 make/config/jogl/obsolete/gl-impl-CustomCCode-gl2es12.c
 create mode 100644 make/config/jogl/obsolete/gl-impl-CustomCCode-gl3.c
 create mode 100644 make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2.java
 create mode 100644 make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2es12.java
 create mode 100644 make/stub_includes/opengl/gl4bc.c
 create mode 100644 src/jogl/classes/com/jogamp/opengl/impl/GLJNILibLoader.java
 delete mode 100644 src/jogl/classes/com/jogamp/opengl/impl/NativeLibLoader.java
 delete mode 100644 src/jogl/classes/javax/media/opengl/GL4.java
 delete mode 100644 src/jogl/classes/javax/media/opengl/GL4bc.java
 create mode 100755 src/junit/com/jogamp/test/junit/jogl/acore/TestGLProfile01CORE.java
 create mode 100755 src/junit/com/jogamp/test/junit/jogl/awt/TestAWT01GLn.java
 create mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/NWJNILibLoader.java
 delete mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/NWReflection.java
 delete mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeLibLoaderBase.java
 create mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTJNILibLoader.java
 delete mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTNativeLibLoader.java
 delete mode 100644 src/nativewindow/classes/com/jogamp/nativewindow/impl/jvm/JVMUtil.java
 delete mode 100644 src/nativewindow/native/JVM_Tool.c
 create mode 100644 src/newt/classes/com/jogamp/newt/impl/NEWTJNILibLoader.java
 delete mode 100644 src/newt/classes/com/jogamp/newt/impl/NativeLibLoader.java

(limited to 'make/stub_includes/opengl/gl4.c')

diff --git a/make/build-jogl.xml b/make/build-jogl.xml
index d42b859bd..6d95ebea8 100644
--- a/make/build-jogl.xml
+++ b/make/build-jogl.xml
@@ -104,9 +104,6 @@
         <property name="java.part.cgl"
                   value="com/jogamp/opengl/impl/macosx/cgl/*"/>
 
-        <property name="java.part.gl2es12"
-                  value="com/jogamp/opengl/impl/gl2es12/**"/>
-
         <property name="java.part.gl4"
                   value="com/jogamp/opengl/impl/**/gl4/**"/>
 
@@ -508,12 +505,24 @@
         </gluegen>
     </target>
 
-    <target name="java.generate.gl2es12">
-        <echo message="Generating GL2ES12 implementation" />
+    <target name="java.generate.gl4">
+        <echo message="Generating GL4 interface and implementation" />
+        <antcall target="java.generate.copy2temp" inheritRefs="true" />
+        <gluegen src="${stub.includes.opengl}/gl4.c" 
+                 outputRootDir="${build.jogl}"
+                 config="${config.jogl}/gl-gl4.cfg"
+                 includeRefid="stub.includes.fileset.all.gl2"
+                 emitter="com.sun.gluegen.opengl.GLEmitter">
+            <classpath refid="gluegen.classpath" />
+        </gluegen>
+    </target>
+
+    <target name="java.generate.gl4bc">
+        <echo message="Generating GL4bc implementation" />
         <antcall target="java.generate.copy2temp" inheritRefs="true" />
-        <gluegen src="${stub.includes.opengl}/gl2es12.c" 
+        <gluegen src="${stub.includes.opengl}/gl4bc.c" 
                  outputRootDir="${build.jogl}"
-                 config="${config.jogl}/gl-gl2es12.cfg"
+                 config="${config.jogl}/gl-gl4bc.cfg"
                  includeRefid="stub.includes.fileset.all.gl2"
                  emitter="com.sun.gluegen.opengl.GLEmitter">
             <classpath refid="gluegen.classpath" />
@@ -544,7 +553,7 @@
         </gluegen>
     </target>
 
-    <target name="java.generate.gl.all" depends="java.generate.gl_if, java.generate.gl2_es1_if, java.generate.gl2_es2_if, java.generate.gl2_gl3_if, java.generate.gl2, java.generate.gl3, java.generate.gl3bc, java.generate.gl2es12, java.generate.gles1, java.generate.gles2"/>
+    <target name="java.generate.gl.all" depends="java.generate.gl_if, java.generate.gl2_es1_if, java.generate.gl2_es2_if, java.generate.gl2_gl3_if, java.generate.gl2, java.generate.gl3, java.generate.gl3bc, java.generate.gl4, java.generate.gl4bc, java.generate.gles1, java.generate.gles2"/>
 
     <!-- target name="java.generate.gl.nsig" if="gluegen.nsig">
         <echo message="Generating GL interface and implementation" />
@@ -781,21 +790,6 @@
 
     </target>        
 
-    <target name="java.generate.composable.pipeline.check.gl2es12">
-        <!-- Blow away the DebugGL*.java and TraceGL*.java sources if GL*.class has changed
-             (the uptodate element doesn't support arbitrary source and destination files) -->
-        <dependset>
-            <srcfilelist dir="${classes}/javax/media/opengl" files="GL2ES12.class" />
-            <targetfileset dir="${src.generated.java}/javax/media/opengl"
-                           includes="DebugGL2ES12.java,TraceGL2ES12.java" />
-        </dependset>
-                           
-        <!-- Now choose one of the two to test to see if we have to regenerate -->
-        <uptodate property="java.generate.composable.pipeline.skip.gl2es12"
-                  srcfile="${classes}/javax/media/opengl/GL2ES12.class"
-                  targetfile="${src.generated.java}/javax/media/opengl/DebugGL2ES12.java" />
-    </target>        
-
     <target name="java.generate.composable.pipeline.check.gl2">
         <!-- Blow away the DebugGL*.java and TraceGL*.java sources if GL*.class has changed
              (the uptodate element doesn't support arbitrary source and destination files) -->
@@ -826,6 +820,21 @@
                   targetfile="${src.generated.java}/javax/media/opengl/DebugGL3.java" />
     </target>        
 
+    <target name="java.generate.composable.pipeline.check.gl4">
+        <!-- Blow away the DebugGL*.java and TraceGL*.java sources if GL*.class has changed
+             (the uptodate element doesn't support arbitrary source and destination files) -->
+        <dependset>
+            <srcfilelist dir="${classes}/javax/media/opengl" files="GL4.class" />
+            <targetfileset dir="${src.generated.java}/javax/media/opengl"
+                           includes="DebugGL4.java,TraceGL4.java,DebugGL4bc.java,TraceGL4bc.java" />
+        </dependset>
+                           
+        <!-- Now choose one of the two to test to see if we have to regenerate -->
+        <uptodate property="java.generate.composable.pipeline.skip.gl4"
+                  srcfile="${classes}/javax/media/opengl/GL4.class"
+                  targetfile="${src.generated.java}/javax/media/opengl/DebugGL4.java" />
+    </target>        
+
     <target name="java.generate.composable.pipeline.es1" depends="java.generate.composable.pipeline.check.es1" unless="java.generate.composable.pipeline.skip.es1">
         <java classname="com.sun.gluegen.opengl.BuildComposablePipeline" fork="yes" failonerror="true">
             <arg value="javax.media.opengl.GLES1" />
@@ -899,7 +908,29 @@
         </copy>
     </target>          
 
-    <target name="java.generate.composable.pipeline" depends="java.generate.composable.pipeline.es1, java.generate.composable.pipeline.es2, java.generate.composable.pipeline.gl2, java.generate.composable.pipeline.gl3">
+    <target name="java.generate.composable.pipeline.gl4" depends="java.generate.composable.pipeline.check.gl4" unless="java.generate.composable.pipeline.skip.gl4">
+        <java classname="com.sun.gluegen.opengl.BuildComposablePipeline" fork="yes" failonerror="true">
+            <arg value="javax.media.opengl.GL4" />
+            <arg value="${src.generated.java}/javax/media/opengl" />
+            <classpath refid="pipeline.classpath" />
+        </java>
+        <copy todir="${src.generated.java-cdc}">
+            <fileset dir="${src.generated.java}"
+                     includes="javax/media/opengl/DebugGL4.java javax/media/opengl/TraceGL4.java" />
+        </copy>
+
+        <java classname="com.sun.gluegen.opengl.BuildComposablePipeline" fork="yes" failonerror="true">
+            <arg value="javax.media.opengl.GL4bc" />
+            <arg value="${src.generated.java}/javax/media/opengl" />
+            <classpath refid="pipeline.classpath" />
+        </java>
+        <copy todir="${src.generated.java-cdc}">
+            <fileset dir="${src.generated.java}"
+                     includes="javax/media/opengl/DebugGL4bc.java javax/media/opengl/TraceGL4bc.java" />
+        </copy>
+    </target>          
+
+    <target name="java.generate.composable.pipeline" depends="java.generate.composable.pipeline.es1, java.generate.composable.pipeline.es2, java.generate.composable.pipeline.gl2, java.generate.composable.pipeline.gl3, java.generate.composable.pipeline.gl4">
     </target>
 
     <target name="java.generate.composable.pipeline.custom.check.glfixfunc">
@@ -1259,9 +1290,7 @@
           <include name="${rootrel.src.c.openmax}/omx_tool.c"  if="useOpenMAX"/>
           <include name="${rootrel.src.c.openmax}/com_jogamp_openmax_OMXInstance.c"  if="useOpenMAX"/>
 
-          <include name="${rootrel.generated.c.jogl}/gl2/GL2Impl_JNI.c"/>
-          <include name="${rootrel.generated.c.jogl}/gl3/GL3Impl_JNI.c"/>
-          <include name="${rootrel.generated.c.jogl}/gl3/GL3bcImpl_JNI.c"/>
+          <include name="${rootrel.generated.c.jogl}/gl4/GL4bcImpl_JNI.c"/>
           <!--include name="${rootrel.generated.c.jogl}/GLU_JNI.c"/ EMPTY -->
           <include name="${rootrel.generated.c.jogl}/gl2/GLUgl2_JNI.c"/>
           <include name="${rootrel.generated.c.jogl}/X11/GLX*.c" if="isX11"/>
@@ -1269,24 +1298,6 @@
           <include name="${rootrel.generated.c.jogl}/Windows/WGL*.c" if="isWindows"/>
         </patternset>
 
-        <patternset id="c.src.files.jogl.gl2es12">
-          <include name="${rootrel.src.c}/macosx/MacOSXCustomCGLCode.c" if="isOSX"/>
-          <include name="${rootrel.src.c}/macosx/MacOSXWindowSystemInterface.m" if="isOSX"/>
-          <include name="${rootrel.src.c}/macosx/ContextUpdater.m" if="isOSX"/>
-          <include name="${rootrel.src.c}/GLXGetProcAddressARB.c" if="isX11"/>
-          <!-- FIXME: the Mixer should be moved to another library -->
-          <!--include name="${rootrel.src.c}/Mixer.cpp" if="isWindows"/-->
-          <include name="${rootrel.src.c.openmax}/omx_tool.c"  if="useOpenMAX"/>
-          <include name="${rootrel.src.c.openmax}/com_jogamp_openmax_OMXInstance.c"  if="useOpenMAX"/>
-
-          <include name="${rootrel.generated.c.jogl}/gl2es12/GL2ES12Impl_JNI.c"/>
-          <!--include name="${rootrel.generated.c.jogl}/GLU_JNI.c"/ EMPTY -->
-          <!--include name="${rootrel.generated.c.jogl}/gl2es12/GLUgl2es12_JNI.c"/ SKIPPED -->
-          <include name="${rootrel.generated.c.jogl}/X11/GLX*.c" if="isX11"/>
-          <include name="${rootrel.generated.c.jogl}/MacOSX/CGL*.c" if="isOSX"/>
-          <include name="${rootrel.generated.c.jogl}/Windows/WGL*.c" if="isWindows"/>
-        </patternset>
-
         <patternset id="c.src.files.jogl.es2">
           <include name="${rootrel.src.c}/GLXGetProcAddressARB.c" if="isX11"/>
           <include name="${rootrel.src.c.openmax}/omx_tool.c"  if="useOpenMAX"/>
@@ -1393,13 +1404,6 @@
                linker.cfg.id="${linker.cfg.id.gl2}"/>
     </target>
 
-    <target name="c.build.jogl.gl2es12" unless="setup.nodesktop">
-      <c.build c.compiler.src.files="c.src.files.jogl.gl2es12"
-               output.lib.name="jogl_gl2es12"
-               compiler.cfg.id="${compiler.cfg.id}"
-               linker.cfg.id="${linker.cfg.id.gl2}"/>
-    </target>
-
     <target name="c.build.jogl.es2">
       <c.build c.compiler.src.files="c.src.files.jogl.es2"
                output.lib.name="jogl_es2"
@@ -1430,11 +1434,10 @@
       <msvc.manifest objdir="${obj.jogl}" dllname="jogl_es1" />
       <msvc.manifest objdir="${obj.jogl}" dllname="jogl_es2" />
       <msvc.manifest objdir="${obj.jogl}" dllname="jogl_gl2" />
-      <msvc.manifest objdir="${obj.jogl}" dllname="jogl_gl2es12" />
       <antcall target="c.manifest.cg" inheritRefs="true" />
     </target>
 
-    <target name="c.build.jogl" depends="c.configure,c.build.jogl.prepare,c.build.jogl.gl2es12,c.build.jogl.desktop,c.build.jogl.es2,c.build.jogl.es1,c.build.jogl.cg">
+    <target name="c.build.jogl" depends="c.configure,c.build.jogl.prepare,c.build.jogl.desktop,c.build.jogl.es2,c.build.jogl.es1,c.build.jogl.cg">
       <antcall target="gluegen.cpptasks.striplibs" inheritRefs="true">
           <param name="libdir" value="${obj.jogl}"/>
       </antcall>
@@ -1450,7 +1453,6 @@
         <fileset dir="${obj.jogl}">
           <include name="*_es1.${native.library.suffix-cdc}" />
           <include name="*_es2.${native.library.suffix-cdc}" />
-          <include name="*_gl2es12.${native.library.suffix-cdc}" />
         </fileset>
       </jar>
     </target>
@@ -1528,14 +1530,7 @@
         </jar>
     </target>
 
-    <target name="build-jars-es-desktop-javase" depends="setup-manifestfile,build-jars-os-desktop-javase" unless="setup.nodesktop">
-        <jar manifest="${build.jogl}/tempversion" destfile="${jogl.gl2es12.jar}" filesonly="true">
-            <fileset dir="${classes}" includes="${java.part.gl2es12}, ${java.part.openmax}"
-                     excludes="${java.part.glugl2}"/>
-        </jar>
-    </target>
-
-    <target name="build-jars-es-javase" depends="setup-manifestfile,build-jars-es-desktop-javase">
+    <target name="build-jars-es-javase" depends="setup-manifestfile">
         <jar manifest="${build.jogl}/tempversion" destfile="${jogl.egl.jar}" filesonly="true">
             <fileset dir="${classes}"
                      includes="${java.part.egl}"
@@ -1573,15 +1568,7 @@
         </jar>
     </target>
 
-    <target name="build-jars-es-desktop-cdc" depends="setup-manifestfile-cdc,build-jars-os-desktop-cdc" unless="setup.nodesktop">
-        <jar manifest="${build.jogl}/tempversion-cdc" destfile="${jogl.gl2es12.cdc.jar}" filesonly="true">
-            <fileset dir="${classes-cdc}"
-                     includes="${java.part.gl2es12}, ${java.part.openmax}"
-                     excludes="${java.part.glugl2}"/>
-        </jar>
-    </target>
-
-    <target name="build-jars-es-cdc" depends="setup-manifestfile-cdc,build-jars-es-desktop-cdc" unless="setup.noCDC">
+    <target name="build-jars-es-cdc" depends="setup-manifestfile-cdc" unless="setup.noCDC">
         <jar manifest="${build.jogl}/tempversion-cdc" destfile="${jogl.egl.cdc.jar}" filesonly="true">
             <fileset dir="${classes-cdc}"
                      includes="${java.part.egl}"
@@ -1645,7 +1632,7 @@
     <target name="build-jars-all-cdc" depends="setup-manifestfile">
         <jar manifest="${build.jogl}/tempversion-cdc" destfile="${jogl.all.cdc.jar}" filesonly="true">
             <fileset dir="${classes-cdc}"
-                     includes="${java.part.core} ${java.part.egl} ${java.part.glutess} ${java.part.glumipmap} ${java.part.openmax} ${java.part.sdk} ${java.part.glx} ${java.part.cgl} ${java.part.gl2es12} ${java.part.wgl} ${java.part.es1} ${java.part.es1.dbg} ${java.part.es2} ${java.part.es2.dbg} ${java.part.util} ${java.part.util.glsl} ${java.part.util.fixedfuncemu}"
+                     includes="${java.part.core} ${java.part.egl} ${java.part.glutess} ${java.part.glumipmap} ${java.part.openmax} ${java.part.sdk} ${java.part.glx} ${java.part.cgl} ${java.part.wgl} ${java.part.es1} ${java.part.es1.dbg} ${java.part.es2} ${java.part.es2.dbg} ${java.part.util} ${java.part.util.glsl} ${java.part.util.fixedfuncemu}"
                      excludes="${java.excludes.cdcfp}"/>
             <fileset dir="${src.java}"
                      includes="${java.part.util.fixedfuncemu.shadercode}"/>
diff --git a/make/build-junit.xml b/make/build-junit.xml
index 887060084..ebf3f683e 100644
--- a/make/build-junit.xml
+++ b/make/build-junit.xml
@@ -81,6 +81,24 @@
         <condition property="jvmarg.newt" value="-XstartOnFirstThread -Djava.awt.headless=true"><isset property="isOSX"/></condition>
         <condition property="jvmarg.newt" value="-Djava.awt.headless=true"><not><isset property="isOSX"/></not></condition>
 
+        <!-- Test*CORE* -->
+        <junit forkmode="once" showoutput="true" fork="true" haltonerror="off" timeout="${batchtest.timeout}">
+            <env key="${system.env.library.path}" path="${obj.all.paths}"/>
+            <jvmarg value="-Djava.library.path=${obj.all.paths}"/>
+
+            <formatter usefile="false" type="plain"/>
+            <formatter usefile="true" type="xml"/>
+            <classpath refid="junit_jogl_newt.run.classpath"/>
+
+            <batchtest todir="${results.junit}">
+              <fileset dir="${classes}">
+                  <include name="${java.dir.test}/**/Test*CORE*"/>
+              </fileset>
+              <formatter usefile="false" type="brief"/>
+              <formatter usefile="true" type="xml"/>
+            </batchtest>
+        </junit>
+
         <!-- Test*NEWT* 
 
              Emulation of junit task,
diff --git a/make/build-nativewindow.xml b/make/build-nativewindow.xml
index 4b726bafb..8d1639502 100644
--- a/make/build-nativewindow.xml
+++ b/make/build-nativewindow.xml
@@ -517,10 +517,6 @@
           </and>
         </condition> 
 
-        <patternset id="c.src.files.jvm">
-          <include name="${rootrel.src.c}/JVM*.c"/>
-        </patternset>
-
         <patternset id="c.src.files.awt">
           <include name="${rootrel.src.c}/JAWT*.c"/>
           <include name="${rootrel.generated.c}/X11/JAWT*.c" if="isX11"/>
@@ -608,13 +604,6 @@
       </apply>
     </target>
 
-    <target name="c.build.nativewindow.jvm">
-      <c.build c.compiler.src.files="c.src.files.jvm"
-               output.lib.name="nativewindow_jvm"
-               compiler.cfg.id="${compiler.cfg.id}"
-               linker.cfg.id="${linker.cfg.id.base}"/>
-    </target>
-
     <target name="c.build.nativewindow.awt" unless="setup.noNativeAWT">
       <c.build c.compiler.src.files="c.src.files.awt"
                c.compiler.use-jawt="true"
@@ -636,11 +625,10 @@
 
     <target name="c.manifest" if="isVC8Family">
       <!-- exec mt, the Microsoft Manifest Tool, to include DLL manifests in order to resolve the location of msvcr80.dll -->
-      <msvc.manifest objdir="${obj.nativewindow}" dllname="nativewindow_jvm" />
       <msvc.manifest objdir="${obj.nativewindow}" dllname="nativewindow_awt" />
     </target>
 
-    <target name="c.build.nativewindow" depends="c.configure,c.build.nativewindow.windowlib,c.build.nativewindow.jvm,c.build.nativewindow.awt">
+    <target name="c.build.nativewindow" depends="c.configure,c.build.nativewindow.windowlib,c.build.nativewindow.awt">
       <antcall target="gluegen.cpptasks.striplibs" inheritRefs="true">
           <param name="libdir" value="${obj.nativewindow}"/>
       </antcall>
diff --git a/make/config/jogl/cg-common-CustomJavaCode.java b/make/config/jogl/cg-common-CustomJavaCode.java
index 974e24bf4..d1e4f8bf5 100755
--- a/make/config/jogl/cg-common-CustomJavaCode.java
+++ b/make/config/jogl/cg-common-CustomJavaCode.java
@@ -1,5 +1,5 @@
 static {
-  com.jogamp.opengl.impl.NativeLibLoader.loadCgImpl();
+  com.jogamp.opengl.impl.GLJNILibLoader.loadCgImpl();
 }
 
 /** A convenience method which reads all available data from the InputStream and then calls cgCreateProgram. */
diff --git a/make/config/jogl/gl-gl2.cfg b/make/config/jogl/gl-gl2.cfg
index 37452d159..48dd8eda6 100644
--- a/make/config/jogl/gl-gl2.cfg
+++ b/make/config/jogl/gl-gl2.cfg
@@ -12,72 +12,32 @@ ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/
 ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/GLLightingFunc.java
 
 Package javax.media.opengl
-Style InterfaceAndImpl
+Style InterfaceOnly
 JavaClass GL2
 Extends GL2 GLBase
 Extends GL2 GL
 Extends GL2 GL2ES1
 Extends GL2 GL2ES2
 Extends GL2 GL2GL3
-ImplPackage com.jogamp.opengl.impl.gl2
-ImplJavaClass GL2Impl
-Implements GL2Impl GLBase
-Implements GL2Impl GL
-Implements GL2Impl GL2ES1
-Implements GL2Impl GL2ES2
-Implements GL2Impl GL2GL3
 Include gl-common.cfg
 Include gl-common-extensions.cfg
 Include gl-desktop.cfg
 
-EmitProcAddressTable true
-ProcAddressTableClassName GL2ProcAddressTable
-GetProcAddressTableExpr ((GL2ProcAddressTable)_context.getGLProcAddressTable())
-
 # Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
 TagNativeBinding true
 
 # Ignore extensions that are already picked up via the GL2ES1 interface
 IgnoreExtension GL_EXT_point_parameters
 
-# Add PixelStorei StateTracker
-#
-CustomJavaCode GL2Impl private static final int params_offset = 0; // just a helper for JavaPrologue ..
-
-JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
-
-JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
-
 CustomJavaCode GL2     public boolean glIsPBOPackEnabled();
 CustomJavaCode GL2     public boolean glIsPBOUnpackEnabled();
 
 IncludeAs CustomJavaCode GL2 gl-if-CustomJavaCode-gl2.java
 
-CustomJavaCode GL2Impl public void glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL2Impl   glFrustum((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL2Impl public void glOrthof(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL2Impl   glOrtho((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL2Impl public void glClearDepthf(float depth) {
-CustomJavaCode GL2Impl   glClearDepth((double)depth); }
-
-CustomJavaCode GL2Impl public void glDepthRangef(float zNear, float zFar) {
-CustomJavaCode GL2Impl    glDepthRange((double)zNear, (double)zFar); }
-
 Include gl-headers.cfg
 Include ../intptr.cfg
 
-IncludeAs CustomJavaCode GL2Impl gl-impl-CustomJavaCode-common.java
-IncludeAs CustomJavaCode GL2Impl gl-impl-CustomJavaCode-gl2.java
-IncludeAs CustomJavaCode GL2Impl gl-impl-CustomJavaCode-desktop.java
-IncludeAs CustomJavaCode GL2Impl gl-impl-CustomJavaCode-gl2_es2.java
-IncludeAs CustomCCode gl-impl-CustomCCode-gl2.c
+EmitProcAddressTable false
+ProcAddressTableClassName DontGenerateProcAddressTableStuff
+GetProcAddressTableExpr DontGenerateProcAddressTableStuff
 
-Import javax.media.opengl.GLES1
-Import javax.media.opengl.GLES2
-Import javax.media.opengl.GL2
-Import javax.media.opengl.GLArrayData
-Import javax.media.opengl.GLUniformData
-Import com.jogamp.opengl.impl.InternalBufferUtil
-Import java.io.PrintStream
diff --git a/make/config/jogl/gl-gl2es12.cfg b/make/config/jogl/gl-gl2es12.cfg
deleted file mode 100644
index 3942b1419..000000000
--- a/make/config/jogl/gl-gl2es12.cfg
+++ /dev/null
@@ -1,90 +0,0 @@
-# This .cfg file is used to generate the GL interface and implementing class.
-JavaOutputDir gensrc/classes
-NativeOutputDir gensrc/native/jogl/gl2es12
-
-ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL.java
-ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL2ES1.java
-ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL2ES2.java
-ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/GLBase.java
-ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLMatrixFunc.java
-ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLPointerFunc.java
-ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLLightingFunc.java
-
-Style ImplOnly
-ImplPackage com.jogamp.opengl.impl.gl2es12
-ImplJavaClass GL2ES12Impl
-Implements GL2ES12Impl GLBase
-Implements GL2ES12Impl GL
-Implements GL2ES12Impl GL2ES1
-Implements GL2ES12Impl GL2ES2
-
-Include gl-common.cfg
-Include gl-common-extensions.cfg
-Include gl-desktop.cfg
-
-# Because we're manually implementing glMapBuffer but only producing
-# the implementing class, GlueGen doesn't notice that it has to emit a
-# proc address table entry for it. Force it to here.
-ForceProcAddressGen glMapBuffer
-
-# Force all of the methods to be emitted using dynamic linking so we
-# don't need to link against any emulation library on the desktop or
-# depend on the presence of an import library for a particular device
-ForceProcAddressGen __ALL__
-
-# Also force the calling conventions of the locally generated function
-# pointer typedefs for these routines to APIENTRY
-LocalProcAddressCallingConvention __ALL__ APIENTRY
-
-EmitProcAddressTable true
-ProcAddressTableClassName GL2ES12ProcAddressTable
-GetProcAddressTableExpr ((GL2ES12ProcAddressTable)_context.getGLProcAddressTable())
-
-# Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
-TagNativeBinding true
-
-# There seem to be some errors in the glue code generation where we are not ignoring
-# enough routines from desktop GL in GL2ES12Impl. For now manually ignore those which
-# we know shouldn't be in there
-Ignore glGetTexImage
-Ignore glPixelStoref
-
-# Add PixelStorei StateTracker
-#
-# Add input validation to glPixelStorei to make sure that, even if we
-# are running on top of desktop OpenGL, parameters not exposed in
-# OpenGL ES can not be changed
-CustomJavaCode GL2ES12Impl private static final int params_offset = 0; // just a helper for JavaPrologue ..
-
-JavaPrologue glPixelStorei if (pname != GL_PACK_ALIGNMENT && pname != GL_UNPACK_ALIGNMENT) {
-JavaPrologue glPixelStorei     throw new GLException("Unsupported pixel store parameter name 0x" + Integer.toHexString(pname));
-JavaPrologue glPixelStorei }
-JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
-
-JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
-
-CustomJavaCode GL2ES12Impl public void glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL2ES12Impl   glFrustum((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL2ES12Impl public void glOrthof(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL2ES12Impl   glOrtho((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL2ES12Impl public void glClearDepthf(float depth) {
-CustomJavaCode GL2ES12Impl   glClearDepth((double)depth); }
-
-CustomJavaCode GL2ES12Impl public void glDepthRangef(float zNear, float zFar) {
-CustomJavaCode GL2ES12Impl    glDepthRange((double)zNear, (double)zFar); }
-
-Include gl-headers.cfg
-Include ../intptr.cfg
-
-IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-common.java
-IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-gl2es12.java
-IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-embedded.java
-IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-gl2_es2.java
-IncludeAs CustomCCode gl-impl-CustomCCode-gl2es12.c
-
-Import javax.media.opengl.GLES1
-Import javax.media.opengl.GLES2
-Import com.jogamp.opengl.impl.InternalBufferUtil
-Import java.io.PrintStream
diff --git a/make/config/jogl/gl-gl3.cfg b/make/config/jogl/gl-gl3.cfg
index 0bfe2cc38..d5e0003d4 100644
--- a/make/config/jogl/gl-gl3.cfg
+++ b/make/config/jogl/gl-gl3.cfg
@@ -8,7 +8,7 @@ ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/G
 ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/GLBase.java
 
 Package javax.media.opengl
-Style InterfaceAndImpl
+Style InterfaceOnly
 JavaClass GL3
 Extends GL3 GLBase
 Extends GL3 GL
@@ -27,48 +27,15 @@ Include gl3-desktop.cfg
 
 IncludeAs CustomJavaCode GL3 gl-if-CustomJavaCode-gl3.java
 
-EmitProcAddressTable true
-ProcAddressTableClassName GL3ProcAddressTable
-GetProcAddressTableExpr ((GL3ProcAddressTable)_context.getGLProcAddressTable())
-
-# Force all of the methods to be emitted using dynamic linking so we
-# don't need to link against any emulation library on the desktop or
-# depend on the presence of an import library for a particular device
-ForceProcAddressGen __ALL__
-
-# Also force the calling conventions of the locally generated function
-# pointer typedefs for these routines to APIENTRY
-LocalProcAddressCallingConvention __ALL__ APIENTRY
+EmitProcAddressTable false
 
 # Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
 TagNativeBinding true
 
-# Add PixelStorei StateTracker
-#
-CustomJavaCode GL3Impl private static final int params_offset = 0; // just a helper for JavaPrologue ..
-
-JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
-
-JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
-
-CustomJavaCode GL3Impl public void glClearDepthf(float depth) {
-CustomJavaCode GL3Impl   glClearDepth((double)depth); }
-
-CustomJavaCode GL3Impl public void glDepthRangef(float zNear, float zFar) {
-CustomJavaCode GL3Impl    glDepthRange((double)zNear, (double)zFar); }
-
 Include gl3-headers.cfg
 Include ../intptr.cfg
 
-IncludeAs CustomJavaCode GL3Impl gl-impl-CustomJavaCode-common.java
-IncludeAs CustomJavaCode GL3Impl gl-impl-CustomJavaCode-gl3.java
-IncludeAs CustomJavaCode GL3Impl gl-impl-CustomJavaCode-desktop.java
-IncludeAs CustomJavaCode GL3Impl gl-impl-CustomJavaCode-gl2_es2.java
-IncludeAs CustomCCode gl-impl-CustomCCode-gl3.c
+EmitProcAddressTable false
+ProcAddressTableClassName DontGenerateProcAddressTableStuff
+GetProcAddressTableExpr DontGenerateProcAddressTableStuff
 
-Import javax.media.opengl.GLES2
-Import javax.media.opengl.GL3
-Import javax.media.opengl.GLArrayData
-Import javax.media.opengl.GLUniformData
-Import com.jogamp.opengl.impl.InternalBufferUtil
-Import java.io.PrintStream
diff --git a/make/config/jogl/gl-gl3bc.cfg b/make/config/jogl/gl-gl3bc.cfg
index 7bba2f635..7c53ea8d6 100644
--- a/make/config/jogl/gl-gl3bc.cfg
+++ b/make/config/jogl/gl-gl3bc.cfg
@@ -14,7 +14,7 @@ ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/
 ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/GLLightingFunc.java
 
 Package javax.media.opengl
-Style InterfaceAndImpl
+Style InterfaceOnly
 JavaClass GL3bc
 Extends GL3bc GLBase
 Extends GL3bc GL
@@ -23,15 +23,6 @@ Extends GL3bc GL2ES2
 Extends GL3bc GL2GL3
 Extends GL3bc GL2
 Extends GL3bc GL3
-ImplPackage com.jogamp.opengl.impl.gl3
-ImplJavaClass GL3bcImpl
-Implements GL3bcImpl GLBase
-Implements GL3bcImpl GL
-Implements GL3bcImpl GL2ES1
-Implements GL3bcImpl GL2ES2
-Implements GL3bcImpl GL2GL3
-Implements GL3bcImpl GL2
-Implements GL3bcImpl GL3
 
 Include gl-common.cfg
 Include gl-common-extensions.cfg
@@ -39,64 +30,17 @@ Include gl-desktop.cfg
 Include gl3-common.cfg
 Include gl3-desktop.cfg
 
-# Because we're manually implementing glMapBuffer but only producing
-# the implementing class, GlueGen doesn't notice that it has to emit a
-# proc address table entry for it. Force it to here.
-ForceProcAddressGen glMapBuffer
-
-# Force all of the methods to be emitted using dynamic linking so we
-# don't need to link against any emulation library on the desktop or
-# depend on the presence of an import library for a particular device
-ForceProcAddressGen __ALL__
-
-# Also force the calling conventions of the locally generated function
-# pointer typedefs for these routines to APIENTRY
-LocalProcAddressCallingConvention __ALL__ APIENTRY
-
-EmitProcAddressTable true
-ProcAddressTableClassName GL3bcProcAddressTable
-GetProcAddressTableExpr ((GL3bcProcAddressTable)_context.getGLProcAddressTable())
-
 # Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
 TagNativeBinding true
 
 # Ignore extensions that are already picked up via the GL2ES1 interface
 IgnoreExtension GL_EXT_point_parameters
 
-# Add PixelStorei StateTracker
-CustomJavaCode GL3bcImpl private static final int params_offset = 0; // just a helper for JavaPrologue ..
-
-JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
-
-JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
-
-CustomJavaCode GL3bcImpl public void glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL3bcImpl   glFrustum((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL3bcImpl public void glOrthof(float left, float right, float bottom, float top, float zNear, float zFar) {
-CustomJavaCode GL3bcImpl   glOrtho((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
-
-CustomJavaCode GL3bcImpl public void glClearDepthf(float depth) {
-CustomJavaCode GL3bcImpl   glClearDepth((double)depth); }
-
-CustomJavaCode GL3bcImpl public void glDepthRangef(float zNear, float zFar) {
-CustomJavaCode GL3bcImpl    glDepthRange((double)zNear, (double)zFar); }
-
 Include gl-headers.cfg
 Include gl3ext-headers.cfg
 Include ../intptr.cfg
 
-IncludeAs CustomJavaCode GL3bcImpl gl-impl-CustomJavaCode-common.java
-IncludeAs CustomJavaCode GL3bcImpl gl-impl-CustomJavaCode-gl3bc.java
-IncludeAs CustomJavaCode GL3bcImpl gl-impl-CustomJavaCode-desktop.java
-IncludeAs CustomJavaCode GL3bcImpl gl-impl-CustomJavaCode-gl2_es2.java
-IncludeAs CustomCCode gl-impl-CustomCCode-gl3bc.c
+EmitProcAddressTable false
+ProcAddressTableClassName DontGenerateProcAddressTableStuff
+GetProcAddressTableExpr DontGenerateProcAddressTableStuff
 
-Import javax.media.opengl.GLES1
-Import javax.media.opengl.GLES2
-Import javax.media.opengl.GL2GL3
-Import javax.media.opengl.GL2
-Import javax.media.opengl.GL3
-Import javax.media.opengl.GL3bc
-Import com.jogamp.opengl.impl.InternalBufferUtil
-Import java.io.PrintStream
diff --git a/make/config/jogl/gl-gl4.cfg b/make/config/jogl/gl-gl4.cfg
new file mode 100644
index 000000000..1d4392899
--- /dev/null
+++ b/make/config/jogl/gl-gl4.cfg
@@ -0,0 +1,37 @@
+# This .cfg file is used to generate the GL interface and implementing class.
+JavaOutputDir gensrc/classes
+NativeOutputDir gensrc/native/jogl/gl4
+
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2ES2.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2GL3.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL3.java
+ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/GLBase.java
+
+Package javax.media.opengl
+Style InterfaceOnly
+JavaClass GL4
+Extends GL4 GLBase
+Extends GL4 GL
+Extends GL4 GL2ES2
+Extends GL4 GL2GL3
+Extends GL4 GL3
+Include gl-common.cfg
+Include gl-common-extensions.cfg
+Include gl3-common.cfg
+Include gl4-common.cfg
+Include gl3-desktop.cfg
+
+IncludeAs CustomJavaCode GL4 gl-if-CustomJavaCode-gl3.java
+
+EmitProcAddressTable false
+ProcAddressTableClassName DontGenerateProcAddressTableStuff
+GetProcAddressTableExpr DontGenerateProcAddressTableStuff
+
+
+# Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
+TagNativeBinding true
+
+Include gl3-headers.cfg
+Include ../intptr.cfg
+
diff --git a/make/config/jogl/gl-gl4bc.cfg b/make/config/jogl/gl-gl4bc.cfg
new file mode 100644
index 000000000..3a3e02041
--- /dev/null
+++ b/make/config/jogl/gl-gl4bc.cfg
@@ -0,0 +1,110 @@
+# This .cfg file is used to generate the GL interface and implementing class.
+JavaOutputDir gensrc/classes
+NativeOutputDir gensrc/native/jogl/gl4
+
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2ES1.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2ES2.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2GL3.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL2.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL3.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL4.java
+ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/javax/media/opengl/GL3bc.java
+ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/GLBase.java
+ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/GLMatrixFunc.java
+ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/GLPointerFunc.java
+ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/javax/media/opengl/fixedfunc/GLLightingFunc.java
+
+Package javax.media.opengl
+Style InterfaceAndImpl
+JavaClass GL4bc
+Extends GL4bc GLBase
+Extends GL4bc GL
+Extends GL4bc GL2ES1
+Extends GL4bc GL2ES2
+Extends GL4bc GL2GL3
+Extends GL4bc GL2
+Extends GL4bc GL3
+Extends GL4bc GL3bc
+Extends GL4bc GL4
+ImplPackage com.jogamp.opengl.impl.gl4
+ImplJavaClass GL4bcImpl
+Implements GL4bcImpl GLBase
+Implements GL4bcImpl GL
+Implements GL4bcImpl GL2ES1
+Implements GL4bcImpl GL2ES2
+Implements GL4bcImpl GL2GL3
+Implements GL4bcImpl GL2
+Implements GL4bcImpl GL3
+Implements GL4bcImpl GL3bc
+Implements GL4bcImpl GL4
+
+Include gl-common.cfg
+Include gl-common-extensions.cfg
+Include gl-desktop.cfg
+Include gl3-common.cfg
+Include gl4-common.cfg
+Include gl3-desktop.cfg
+
+# Because we're manually implementing glMapBuffer but only producing
+# the implementing class, GlueGen doesn't notice that it has to emit a
+# proc address table entry for it. Force it to here.
+ForceProcAddressGen glMapBuffer
+
+# Force all of the methods to be emitted using dynamic linking so we
+# don't need to link against any emulation library on the desktop or
+# depend on the presence of an import library for a particular device
+ForceProcAddressGen __ALL__
+
+# Also force the calling conventions of the locally generated function
+# pointer typedefs for these routines to APIENTRY
+LocalProcAddressCallingConvention __ALL__ APIENTRY
+
+EmitProcAddressTable true
+ProcAddressTableClassName GL4bcProcAddressTable
+GetProcAddressTableExpr ((GL4bcProcAddressTable)_context.getGLProcAddressTable())
+
+# Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
+TagNativeBinding true
+
+# Ignore extensions that are already picked up via the GL2ES1 interface
+IgnoreExtension GL_EXT_point_parameters
+
+# Add PixelStorei StateTracker
+CustomJavaCode GL4bcImpl private static final int params_offset = 0; // just a helper for JavaPrologue ..
+
+JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
+
+JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
+
+CustomJavaCode GL4bcImpl public void glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) {
+CustomJavaCode GL4bcImpl   glFrustum((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
+
+CustomJavaCode GL4bcImpl public void glOrthof(float left, float right, float bottom, float top, float zNear, float zFar) {
+CustomJavaCode GL4bcImpl   glOrtho((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
+
+CustomJavaCode GL4bcImpl public void glClearDepthf(float depth) {
+CustomJavaCode GL4bcImpl   glClearDepth((double)depth); }
+
+CustomJavaCode GL4bcImpl public void glDepthRangef(float zNear, float zFar) {
+CustomJavaCode GL4bcImpl    glDepthRange((double)zNear, (double)zFar); }
+
+Include gl-headers.cfg
+Include gl3ext-headers.cfg
+Include ../intptr.cfg
+
+IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-common.java
+IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-gl4bc.java
+IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-desktop.java
+IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-gl2_es2.java
+IncludeAs CustomCCode gl-impl-CustomCCode-gl4bc.c
+
+Import javax.media.opengl.GLES1
+Import javax.media.opengl.GLES2
+Import javax.media.opengl.GL2GL3
+Import javax.media.opengl.GL2
+Import javax.media.opengl.GL3
+Import javax.media.opengl.GL3bc
+Import javax.media.opengl.GL4
+Import com.jogamp.opengl.impl.InternalBufferUtil
+Import java.io.PrintStream
diff --git a/make/config/jogl/gl-impl-CustomCCode-gl2.c b/make/config/jogl/gl-impl-CustomCCode-gl2.c
deleted file mode 100644
index 91fd0078b..000000000
--- a/make/config/jogl/gl-impl-CustomCCode-gl2.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl2.GL2Impl
- *    Java method: long dispatch_glMapBuffer(int target, int access)
- *     C function: void * glMapBuffer(GLenum target, GLenum access);
- */
-JNIEXPORT jlong JNICALL 
-Java_com_jogamp_opengl_impl_gl2_GL2Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
-  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
-  void * _res;
-  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
-  assert(ptr_glMapBuffer != NULL);
-  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
-  return (jlong) (intptr_t) _res;
-}
-
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl2.GL2Impl
- *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
- *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
- */
-JNIEXPORT jobject JNICALL
-Java_com_jogamp_opengl_impl_gl2_GL2Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
-  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
-}
diff --git a/make/config/jogl/gl-impl-CustomCCode-gl2es12.c b/make/config/jogl/gl-impl-CustomCCode-gl2es12.c
deleted file mode 100644
index 07b821802..000000000
--- a/make/config/jogl/gl-impl-CustomCCode-gl2es12.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl2es12.GL2ES12Impl
- *    Java method: long dispatch_glMapBuffer(int target, int access)
- *     C function: void * glMapBuffer(GLenum target, GLenum access);
- */
-JNIEXPORT jlong JNICALL 
-Java_com_jogamp_opengl_impl_gl2es12_GL2ES12Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
-  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
-  void * _res;
-  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
-  assert(ptr_glMapBuffer != NULL);
-  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
-  return (jlong) (intptr_t) _res;
-}
-
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl2es12.GL2ES12Impl
- *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
- *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
- */
-JNIEXPORT jobject JNICALL
-Java_com_jogamp_opengl_impl_gl2es12_GL2ES12Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
-  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
-}
diff --git a/make/config/jogl/gl-impl-CustomCCode-gl3.c b/make/config/jogl/gl-impl-CustomCCode-gl3.c
deleted file mode 100644
index f540a7d4a..000000000
--- a/make/config/jogl/gl-impl-CustomCCode-gl3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl3.GL3Impl
- *    Java method: long dispatch_glMapBuffer(int target, int access)
- *     C function: void * glMapBuffer(GLenum target, GLenum access);
- */
-JNIEXPORT jlong JNICALL 
-Java_com_jogamp_opengl_impl_gl3_GL3Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
-  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
-  void * _res;
-  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
-  assert(ptr_glMapBuffer != NULL);
-  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
-  return (jlong) (intptr_t) _res;
-}
-
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl3.GL3Impl
- *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
- *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
- */
-JNIEXPORT jobject JNICALL
-Java_com_jogamp_opengl_impl_gl3_GL3Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
-  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
-}
diff --git a/make/config/jogl/gl-impl-CustomCCode-gl3bc.c b/make/config/jogl/gl-impl-CustomCCode-gl3bc.c
deleted file mode 100644
index 21de8c925..000000000
--- a/make/config/jogl/gl-impl-CustomCCode-gl3bc.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl3.GL3bcImpl
- *    Java method: long dispatch_glMapBuffer(int target, int access)
- *     C function: void * glMapBuffer(GLenum target, GLenum access);
- */
-JNIEXPORT jlong JNICALL 
-Java_com_jogamp_opengl_impl_gl3_GL3bcImpl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
-  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
-  void * _res;
-  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
-  assert(ptr_glMapBuffer != NULL);
-  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
-  return (jlong) (intptr_t) _res;
-}
-
-/*   Java->C glue code:
- *   Java package: com.jogamp.opengl.impl.gl3.GL3bcImpl
- *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
- *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
- */
-JNIEXPORT jobject JNICALL
-Java_com_jogamp_opengl_impl_gl3_GL3bcImpl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
-  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
-}
diff --git a/make/config/jogl/gl-impl-CustomCCode-gl4bc.c b/make/config/jogl/gl-impl-CustomCCode-gl4bc.c
new file mode 100644
index 000000000..bcda20fa4
--- /dev/null
+++ b/make/config/jogl/gl-impl-CustomCCode-gl4bc.c
@@ -0,0 +1,24 @@
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl4.GL4bcImpl
+ *    Java method: long dispatch_glMapBuffer(int target, int access)
+ *     C function: void * glMapBuffer(GLenum target, GLenum access);
+ */
+JNIEXPORT jlong JNICALL 
+Java_com_jogamp_opengl_impl_gl4_GL4bcImpl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
+  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
+  void * _res;
+  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
+  assert(ptr_glMapBuffer != NULL);
+  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
+  return (jlong) (intptr_t) _res;
+}
+
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl4.GL4bcImpl
+ *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
+ *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
+ */
+JNIEXPORT jobject JNICALL
+Java_com_jogamp_opengl_impl_gl4_GL4bcImpl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
+  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
+}
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-common.java b/make/config/jogl/gl-impl-CustomJavaCode-common.java
index 564606799..4872490b0 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-common.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-common.java
@@ -1,16 +1,58 @@
-  public GLProfile getGLProfile() {
-    return this.glProfile;
-  }
-  private GLProfile glProfile;
-
-  public int glGetBoundBuffer(int target) {
-    return bufferStateTracker.getBoundBufferObject(target, this);
-  }
-
-  public boolean glIsVBOArrayEnabled() {
-    return checkArrayVBOEnabled(false);
-  }
-
-  public boolean glIsVBOElementEnabled() {
-    return checkElementVBOEnabled(false);
-  }
+    public GLProfile getGLProfile() {
+        return this.glProfile;
+    }
+    private GLProfile glProfile;
+
+    public int glGetBoundBuffer(int target) {
+        return bufferStateTracker.getBoundBufferObject(target, this);
+    }
+
+    public boolean glIsVBOArrayEnabled() {
+        return checkArrayVBOEnabled(false);
+    }
+
+    public boolean glIsVBOElementEnabled() {
+        return checkElementVBOEnabled(false);
+    }
+
+    public final boolean isGL() {
+        return true;
+    }
+      
+    public final GL getGL() throws GLException {
+        return this;
+    }
+
+    public boolean isFunctionAvailable(String glFunctionName) {
+      return _context.isFunctionAvailable(glFunctionName);
+    }
+
+    public boolean isExtensionAvailable(String glExtensionName) {
+      return _context.isExtensionAvailable(glExtensionName);
+    }
+
+    public Object getExtension(String extensionName) {
+      // At this point we don't expose any extensions using this mechanism
+      return null;
+    }
+
+    /** Returns the context this GL object is associated with for better
+        error checking by DebugGL. */
+    public GLContext getContext() {
+      return _context;
+    }
+
+    private GLContextImpl _context;
+
+    public void setSwapInterval(int interval) {
+      _context.setSwapInterval(interval);
+    }
+
+    public int getSwapInterval() {
+      return _context.getSwapInterval();
+    }
+
+    public Object getPlatformGLExtensions() {
+      return _context.getPlatformGLExtensions();
+    }
+
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-desktop.java b/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
index 04ba39c3d..93a275269 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
@@ -1,79 +1,191 @@
-private int[] imageSizeTemp = new int[1];
-
-/** Helper for more precise computation of number of bytes that will
-    be touched by a pixel pack or unpack operation. */
-private int imageSizeInBytes(int bytesPerElement,
-                             int width, int height, int depth, boolean pack) {
-    int rowLength = 0;
-    int skipRows = 0;
-    int skipPixels = 0;
-    int alignment = 1;
-    int imageHeight = 0;
-    int skipImages = 0;
-
-    if (pack) {
-        glGetIntegerv(GL_PACK_ROW_LENGTH, imageSizeTemp, 0);
-        rowLength = imageSizeTemp[0];
-        glGetIntegerv(GL_PACK_SKIP_ROWS, imageSizeTemp, 0);
-        skipRows = imageSizeTemp[0];
-        glGetIntegerv(GL_PACK_SKIP_PIXELS, imageSizeTemp, 0);
-        skipPixels = imageSizeTemp[0];
-        glGetIntegerv(GL_PACK_ALIGNMENT, imageSizeTemp, 0);
-        alignment = imageSizeTemp[0];
-        if (depth > 1) {
-            glGetIntegerv(GL_PACK_IMAGE_HEIGHT, imageSizeTemp, 0);
-            imageHeight = imageSizeTemp[0];
-            glGetIntegerv(GL_PACK_SKIP_IMAGES, imageSizeTemp, 0);
-            skipImages = imageSizeTemp[0];
+    private int[] imageSizeTemp = new int[1];
+
+    /** Helper for more precise computation of number of bytes that will
+        be touched by a pixel pack or unpack operation. */
+    private int imageSizeInBytes(int bytesPerElement,
+                                 int width, int height, int depth, boolean pack) {
+        int rowLength = 0;
+        int skipRows = 0;
+        int skipPixels = 0;
+        int alignment = 1;
+        int imageHeight = 0;
+        int skipImages = 0;
+
+        if (pack) {
+            glGetIntegerv(GL_PACK_ROW_LENGTH, imageSizeTemp, 0);
+            rowLength = imageSizeTemp[0];
+            glGetIntegerv(GL_PACK_SKIP_ROWS, imageSizeTemp, 0);
+            skipRows = imageSizeTemp[0];
+            glGetIntegerv(GL_PACK_SKIP_PIXELS, imageSizeTemp, 0);
+            skipPixels = imageSizeTemp[0];
+            glGetIntegerv(GL_PACK_ALIGNMENT, imageSizeTemp, 0);
+            alignment = imageSizeTemp[0];
+            if (depth > 1) {
+                glGetIntegerv(GL_PACK_IMAGE_HEIGHT, imageSizeTemp, 0);
+                imageHeight = imageSizeTemp[0];
+                glGetIntegerv(GL_PACK_SKIP_IMAGES, imageSizeTemp, 0);
+                skipImages = imageSizeTemp[0];
+            }
+        } else {
+            glGetIntegerv(GL_UNPACK_ROW_LENGTH, imageSizeTemp, 0);
+            rowLength = imageSizeTemp[0];
+            glGetIntegerv(GL_UNPACK_SKIP_ROWS, imageSizeTemp, 0);
+            skipRows = imageSizeTemp[0];
+            glGetIntegerv(GL_UNPACK_SKIP_PIXELS, imageSizeTemp, 0);
+            skipPixels = imageSizeTemp[0];
+            glGetIntegerv(GL_UNPACK_ALIGNMENT, imageSizeTemp, 0);
+            alignment = imageSizeTemp[0];
+            if (depth > 1) {
+                glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, imageSizeTemp, 0);
+                imageHeight = imageSizeTemp[0];
+                glGetIntegerv(GL_UNPACK_SKIP_IMAGES, imageSizeTemp, 0);
+                skipImages = imageSizeTemp[0];
+            }
         }
-    } else {
-        glGetIntegerv(GL_UNPACK_ROW_LENGTH, imageSizeTemp, 0);
-        rowLength = imageSizeTemp[0];
-        glGetIntegerv(GL_UNPACK_SKIP_ROWS, imageSizeTemp, 0);
-        skipRows = imageSizeTemp[0];
-        glGetIntegerv(GL_UNPACK_SKIP_PIXELS, imageSizeTemp, 0);
-        skipPixels = imageSizeTemp[0];
-        glGetIntegerv(GL_UNPACK_ALIGNMENT, imageSizeTemp, 0);
-        alignment = imageSizeTemp[0];
-        if (depth > 1) {
-            glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, imageSizeTemp, 0);
-            imageHeight = imageSizeTemp[0];
-            glGetIntegerv(GL_UNPACK_SKIP_IMAGES, imageSizeTemp, 0);
-            skipImages = imageSizeTemp[0];
+        // Try to deal somewhat correctly with potentially invalid values
+        width       = Math.max(0, width );
+        height      = Math.max(1, height); // min 1D
+        depth       = Math.max(1, depth ); // min 1 * imageSize
+        skipRows    = Math.max(0, skipRows);
+        skipPixels  = Math.max(0, skipPixels);
+        alignment   = Math.max(1, alignment);
+        skipImages  = Math.max(0, skipImages);
+
+        imageHeight = ( imageHeight > 0 ) ? imageHeight : height;
+        rowLength   = ( rowLength   > 0 ) ? rowLength   : width;
+
+        int rowLengthInBytes = rowLength * bytesPerElement;
+
+        if (alignment > 1) {
+            int padding = rowLengthInBytes % alignment;
+            if (padding > 0) {
+                rowLengthInBytes += alignment - padding;
+            }
         }
+
+        /**
+         * skipPixels and skipRows is a static one time offset.
+         *
+         * skipImages and depth are in multiples of image size.
+         *
+         * rowlenght is the actual repeating offset 
+         * to go from line n to line n+1 at the same x-axis position.
+         */
+        return 
+            ( skipImages + depth  - 1 ) * imageHeight * rowLengthInBytes + // whole images
+            ( skipRows   + height - 1 ) * rowLengthInBytes +               // lines with padding
+            ( skipPixels + width      ) * bytesPerElement;                 // last line
+    }
+
+    public final boolean isGL4bc() {
+        return _context.isGL4bc();
+    }
+
+    public final boolean isGL4() {
+        return _context.isGL4();
+    }
+
+    public final boolean isGL3bc() {
+        return _context.isGL3bc();
+    }
+
+    public final boolean isGL3() {
+        return _context.isGL3();
     }
-    // Try to deal somewhat correctly with potentially invalid values
-    width       = Math.max(0, width );
-    height      = Math.max(1, height); // min 1D
-    depth       = Math.max(1, depth ); // min 1 * imageSize
-    skipRows    = Math.max(0, skipRows);
-    skipPixels  = Math.max(0, skipPixels);
-    alignment   = Math.max(1, alignment);
-    skipImages  = Math.max(0, skipImages);
 
-    imageHeight = ( imageHeight > 0 ) ? imageHeight : height;
-    rowLength   = ( rowLength   > 0 ) ? rowLength   : width;
+    public final boolean isGL2() {
+        return _context.isGL2();
+    }
+      
+    public final boolean isGL2ES1() {
+        return _context.isGL2ES1();
+    }
 
-    int rowLengthInBytes = rowLength * bytesPerElement;
+    public final boolean isGL2ES2() {
+        return _context.isGL2ES2();
+    }
 
-    if (alignment > 1) {
-        int padding = rowLengthInBytes % alignment;
-        if (padding > 0) {
-            rowLengthInBytes += alignment - padding;
+    public final boolean isGL2GL3() {
+        return _context.isGL2GL3();
+    }
+
+    public final boolean hasGLSL() {
+        return _context.hasGLSL();
+    }
+
+    public final GL4bc getGL4bc() throws GLException {
+        if(!isGL4bc()) {
+            throw new GLException("Not a GL4bc implementation");
+        }
+        return this;
+    }
+
+    public final GL4 getGL4() throws GLException {
+        if(!isGL4bc()) {
+            throw new GLException("Not a GL4 implementation");
         }
+        return this;
     }
 
-    /**
-     * skipPixels and skipRows is a static one time offset.
-     *
-     * skipImages and depth are in multiples of image size.
-     *
-     * rowlenght is the actual repeating offset 
-     * to go from line n to line n+1 at the same x-axis position.
-     */
-    return 
-        ( skipImages + depth  - 1 ) * imageHeight * rowLengthInBytes + // whole images
-        ( skipRows   + height - 1 ) * rowLengthInBytes +               // lines with padding
-        ( skipPixels + width      ) * bytesPerElement;                 // last line
-}
+    public final GL3bc getGL3bc() throws GLException {
+        if(!isGL3bc()) {
+            throw new GLException("Not a GL3bc implementation");
+        }
+        return this;
+    }
+
+    public final GL3 getGL3() throws GLException {
+        if(!isGL3()) {
+            throw new GLException("Not a GL3 implementation");
+        }
+        return this;
+    }
+
+    public final GL2 getGL2() throws GLException {
+        if(!isGL2()) {
+            throw new GLException("Not a GL2 implementation");
+        }
+        return this;
+    }
+
+    public final GL2ES1 getGL2ES1() throws GLException {
+        if(!isGL2ES1()) {
+            throw new GLException("Not a GL2ES1 implementation");
+        }
+        return this;
+    }
+
+    public final GL2ES2 getGL2ES2() throws GLException {
+        if(!isGL2ES2()) {
+            throw new GLException("Not a GL2ES2 implementation");
+        }
+        return this;
+    }
+
+    public final GL2GL3 getGL2GL3() throws GLException {
+        if(!isGL2GL3()) {
+            throw new GLException("Not a GL2GL3 implementation");
+        }
+        return this;
+    }
+
+    public final boolean isGLES1() {
+        return false;
+    }
+
+    public final boolean isGLES2() {
+        return false;
+    }
+
+    public final boolean isGLES() {
+        return false;
+    }
+
+    public final GLES1 getGLES1() throws GLException {
+        throw new GLException("Not a GLES1 implementation");
+    }
+
+    public final GLES2 getGLES2() throws GLException {
+        throw new GLException("Not a GLES2 implementation");
+    }
 
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl2.java b/make/config/jogl/gl-impl-CustomJavaCode-gl2.java
deleted file mode 100644
index 0658b8a01..000000000
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl2.java
+++ /dev/null
@@ -1,514 +0,0 @@
-// Tracks glBegin/glEnd calls to determine whether it is legal to
-// query Vertex Buffer Object state
-private boolean inBeginEndPair;
-
-/* FIXME: refactor dependence on Java 2D / JOGL bridge
-
-// Tracks creation and destruction of server-side OpenGL objects when
-// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
-// objects (FBOs) to do its rendering
-private GLObjectTracker tracker;
-
-public void setObjectTracker(GLObjectTracker tracker) {
-  this.tracker = tracker;
-}
-
-*/
-
-
-public GL2Impl(GLProfile glp, GLContextImpl context) {
-  this._context = context; 
-  this.bufferSizeTracker  = context.getBufferSizeTracker();
-  this.bufferStateTracker = context.getBufferStateTracker();
-  this.glStateTracker     = context.getGLStateTracker();
-  this.glProfile = glp;
-}
-
-public final boolean isGL() {
-    return true;
-}
-  
-public final boolean isGL4bc() {
-    return false;
-}
-
-public final boolean isGL4() {
-    return false;
-}
-
-public final boolean isGL3bc() {
-    return false;
-}
-
-public final boolean isGL3() {
-    return false;
-}
-
-public final boolean isGL2() {
-    return true;
-}
-  
-public final boolean isGLES1() {
-    return false;
-}
-
-public final boolean isGLES2() {
-    return false;
-}
-
-public final boolean isGLES() {
-    return false;
-}
-
-public final boolean isGL2ES1() {
-    return true;
-}
-
-public final boolean isGL2ES2() {
-    return true;
-}
-
-public final boolean isGL2GL3() {
-    return true;
-}
-
-public final boolean hasGLSL() {
-    return true;
-}
-
-public final GL getGL() throws GLException {
-    return this;
-}
-
-public final GL4bc getGL4bc() throws GLException {
-    throw new GLException("Not a GL4bc implementation");
-}
-
-public final GL4 getGL4() throws GLException {
-    throw new GLException("Not a GL4 implementation");
-}
-
-public final GL3bc getGL3bc() throws GLException {
-    throw new GLException("Not a GL3bc implementation");
-}
-
-public final GL3 getGL3() throws GLException {
-    throw new GLException("Not a GL3 implementation");
-}
-
-public final GL2 getGL2() throws GLException {
-    return this;
-}
-
-public final GLES1 getGLES1() throws GLException {
-    throw new GLException("Not a GLES1 implementation");
-}
-
-public final GLES2 getGLES2() throws GLException {
-    throw new GLException("Not a GLES2 implementation");
-}
-
-public final GL2ES1 getGL2ES1() throws GLException {
-    return this;
-}
-
-public final GL2ES2 getGL2ES2() throws GLException {
-    return this;
-}
-
-public final GL2GL3 getGL2GL3() throws GLException {
-    return this;
-}
-
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-/**
- * Provides platform-independent access to the wglAllocateMemoryNV /
- * glXAllocateMemoryNV extension.
- */
-public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
-  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
-}
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
-//
-// Helpers for ensuring the correct amount of texture data
-//
-
-/** Returns the number of bytes required to fill in the appropriate
-    texture. This is computed as closely as possible based on the
-    pixel pack or unpack parameters. The logic in this routine is
-    based on code in the SGI OpenGL sample implementation. */
-
-private int imageSizeInBytes(int format, int type, int w, int h, int d,
-                             boolean pack) {
-  int elements = 0;
-  int esize = 0;
-  
-  if (w < 0) return 0;
-  if (h < 0) return 0;
-  if (d < 0) return 0;
-  switch (format) {
-  case GL_COLOR_INDEX:
-  case GL_STENCIL_INDEX:
-    elements = 1;
-    break;
-  case GL_RED:
-  case GL_GREEN:
-  case GL_BLUE:
-  case GL_ALPHA:
-  case GL_LUMINANCE:
-  case GL_DEPTH_COMPONENT:
-    elements = 1;
-    break;
-  case GL_LUMINANCE_ALPHA:
-    elements = 2;
-    break;
-  case GL_RGB:
-  case GL_BGR:
-    elements = 3;
-    break;
-  case GL_RGBA:
-  case GL_BGRA:
-  case GL_ABGR_EXT:
-    elements = 4;
-    break;
-  /* FIXME ?? 
-   case GL_HILO_NV:
-    elements = 2;
-    break; */
-  default:
-    return 0;
-  }
-  switch (type) {
-  case GL_BITMAP:
-    if (format == GL_COLOR_INDEX) {
-      return (d * (h * ((w+7)/8)));
-    } else {
-      return 0;
-    }
-  case GL_BYTE:
-  case GL_UNSIGNED_BYTE:
-    esize = 1;
-    break;
-  case GL_UNSIGNED_BYTE_3_3_2:
-  case GL_UNSIGNED_BYTE_2_3_3_REV:
-    esize = 1;
-    elements = 1;
-    break;
-  case GL_SHORT:
-  case GL_UNSIGNED_SHORT:
-    esize = 2;
-    break;
-  case GL_UNSIGNED_SHORT_5_6_5:
-  case GL_UNSIGNED_SHORT_5_6_5_REV:
-  case GL_UNSIGNED_SHORT_4_4_4_4:
-  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-  case GL_UNSIGNED_SHORT_5_5_5_1:
-  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-    esize = 2;
-    elements = 1;
-    break;
-  case GL_INT:
-  case GL_UNSIGNED_INT:
-  case GL_FLOAT:
-    esize = 4;
-    break;
-  case GL_UNSIGNED_INT_8_8_8_8:
-  case GL_UNSIGNED_INT_8_8_8_8_REV:
-  case GL_UNSIGNED_INT_10_10_10_2:
-  case GL_UNSIGNED_INT_2_10_10_10_REV:
-    esize = 4;
-    elements = 1;
-    break;
-  default:
-    return 0;
-  }
-  return imageSizeInBytes(elements * esize, w, h, d, pack);
-}
-
-private GLBufferSizeTracker  bufferSizeTracker;
-private GLBufferStateTracker bufferStateTracker;
-private GLStateTracker       glStateTracker;
-
-private boolean bufferObjectExtensionsInitialized = false;
-private boolean haveARBPixelBufferObject;
-private boolean haveEXTPixelBufferObject;
-private boolean haveGL15;
-private boolean haveGL21;
-private boolean haveARBVertexBufferObject;
-
-private void initBufferObjectExtensionChecks() {
-  if (bufferObjectExtensionsInitialized)
-    return;
-  bufferObjectExtensionsInitialized = true;
-  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
-  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
-  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
-  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
-  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
-}
-
-private boolean checkBufferObject(boolean extension1,
-                                  boolean extension2,
-                                  boolean extension3,
-                                  boolean enabled,
-                                  int state,
-                                  String kind, boolean throwException) {
-  if (inBeginEndPair) {
-    throw new GLException("May not call this between glBegin and glEnd");
-  }
-  boolean avail = (extension1 || extension2 || extension3);
-  if (!avail) {
-    if (!enabled)
-      return true;
-    if(throwException) {
-        throw new GLException("Required extensions not available to call this function");
-    }
-    return false;
-  }
-  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
-  if (enabled) {
-    if (buffer == 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be enabled to call this method");
-      }
-      return false;
-    }
-  } else {
-    if (buffer != 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be disabled to call this method");
-      }
-      return false;
-    }
-  }
-  return true;
-}  
-
-private boolean checkArrayVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkArrayVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-public boolean glIsPBOPackEnabled() {
-    return checkPackPBOEnabled(false);
-}
-
-public boolean glIsPBOUnpackEnabled() {
-    return checkUnpackPBOEnabled(false);
-}
-
-// Attempt to return the same ByteBuffer object from glMapBuffer if
-// the vertex buffer object's base address and size haven't changed
-private static class ARBVBOKey {
-  private long addr;
-  private int  capacity;
-
-  ARBVBOKey(long addr, int capacity) {
-    this.addr = addr;
-    this.capacity = capacity;
-  }
-
-  public int hashCode() {
-    return (int) addr;
-  }
-
-  public boolean equals(Object o) {
-    if ((o == null) || (!(o instanceof ARBVBOKey))) {
-      return false;
-    }
-
-    ARBVBOKey other = (ARBVBOKey) o;
-    return ((addr == other.addr) && (capacity == other.capacity));
-  }
-}
-
-private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
-
-/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-public java.nio.ByteBuffer glMapBuffer(int target, int access) {
-  final long __addr_ = ((GL2ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
-  if (__addr_ == 0) {
-    throw new GLException("Method \"glMapBuffer\" not available");
-  }
-  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
-                                           target,
-                                           this);
-  long addr;
-  addr = dispatch_glMapBuffer(target, access, __addr_);
-  if (addr == 0 || sz == 0) {
-    return null;
-  }
-  ARBVBOKey key = new ARBVBOKey(addr, sz);
-  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
-  if (_res == null) {
-    _res = newDirectByteBuffer(addr, sz);
-    InternalBufferUtil.nativeOrder(_res);
-    arbVBOCache.put(key, _res);
-  }
-  _res.position(0);
-  return _res;
-}
-
-/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
-
-native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  public void glReleaseShaderCompiler() {
-    // nothing to do 
-  }
-
-    public void glVertexPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glColorPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-
-    }
-    public void glNormalPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.getComponentNumber()!=3) {
-        throw new GLException("Only 3 components per normal allowed");
-      }
-      if(array.isVBO()) {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glTexCoordPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java b/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
deleted file mode 100644
index 54c7bd92b..000000000
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
+++ /dev/null
@@ -1,455 +0,0 @@
-// Tracks glBegin/glEnd calls to determine whether it is legal to
-// query Vertex Buffer Object state
-private boolean inBeginEndPair;
-
-/* FIXME: refactor dependence on Java 2D / JOGL bridge
-
-// Tracks creation and destruction of server-side OpenGL objects when
-// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
-// objects (FBOs) to do its rendering
-private GLObjectTracker tracker;
-
-public void setObjectTracker(GLObjectTracker tracker) {
-  this.tracker = tracker;
-}
-
-*/
-
-public GL2ES12Impl(GLProfile glp, GLContextImpl context) {
-  this._context = context; 
-  this.bufferSizeTracker  = context.getBufferSizeTracker();
-  this.bufferStateTracker = context.getBufferStateTracker();
-  this.glStateTracker     = context.getGLStateTracker();
-  this.isGL2ES2 = glp.isGL2ES2();
-  this.glProfile = glp;
-}
-
-private boolean isGL2ES2;
-
-public final boolean isGL() {
-    return true;
-}
-
-public final boolean isGL4bc() {
-    return false;
-}
-
-public final boolean isGL4() {
-    return false;
-}
-
-public final boolean isGL3bc() {
-    return false;
-}
-
-public final boolean isGL3() {
-    return false;
-}
-
-public final boolean isGL2() {
-    return false;
-}
-
-public final boolean isGLES1() {
-    return false;
-}
-
-public final boolean isGLES2() {
-    return false;
-}
-
-public final boolean isGLES() {
-    return false;
-}
-
-public final boolean isGL2ES1() {
-    return !isGL2ES2;
-}
-
-public final boolean isGL2ES2() {
-    return isGL2ES2;
-}
-
-public final boolean isGL2GL3() {
-    return false;
-}
-
-public final boolean hasGLSL() {
-    return isGL2ES2;
-}
-
-public final GL getGL() throws GLException {
-    return this;
-}
-
-public final GL4bc getGL4bc() throws GLException {
-    throw new GLException("Not a GL4bc implementation");
-}
-
-public final GL4 getGL4() throws GLException {
-    throw new GLException("Not a GL4 implementation");
-}
-
-public final GL3bc getGL3bc() throws GLException {
-    throw new GLException("Not a GL3bc implementation");
-}
-
-public final GL3 getGL3() throws GLException {
-    throw new GLException("Not a GL3 implementation");
-}
-
-public final GL2 getGL2() throws GLException {
-    throw new GLException("Not a GL2 implementation");
-}
-
-public final GLES1 getGLES1() throws GLException {
-    throw new GLException("Not a GLES1 implementation");
-}
-
-public final GLES2 getGLES2() throws GLException {
-    throw new GLException("Not a GLES2 implementation");
-}
-
-public final GL2ES1 getGL2ES1() throws GLException {
-    if (isGL2ES1()) {
-        return this;
-    }
-    throw new GLException("Not a GL2ES1 implementation");
-}
-
-public final GL2ES2 getGL2ES2() throws GLException {
-    if (isGL2ES2()) {
-        return this;
-    }
-    throw new GLException("Not a GL2ES2 implementation");
-}
-
-public final GL2GL3 getGL2GL3() throws GLException {
-    throw new GLException("Not a GL2GL3 implementation");
-}
-
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
-//
-// Helpers for ensuring the correct amount of texture data
-//
-
-/** Returns the number of bytes required to fill in the appropriate
-    texture. This is computed as closely as possible based on the
-    pixel pack or unpack parameters. The logic in this routine is
-    based on code in the SGI OpenGL sample implementation. */
-
-private int imageSizeInBytes(int format, int type, int w, int h, int d,
-                             boolean pack) {
-  int elements = 0;
-  int esize = 0;
-  
-  if (w < 0) return 0;
-  if (h < 0) return 0;
-  if (d < 0) return 0;
-  switch (format) {
-  case GL_STENCIL_INDEX:
-    elements = 1;
-    break;
-  case GL_ALPHA:
-  case GL_LUMINANCE:
-  case GL_DEPTH_COMPONENT:
-    elements = 1;
-    break;
-  case GL_LUMINANCE_ALPHA:
-    elements = 2;
-    break;
-  case GL_RGB:
-    elements = 3;
-    break;
-  case GL_RGBA:
-    elements = 4;
-    break;
-  /* FIXME ?? 
-   case GL_HILO_NV:
-    elements = 2;
-    break; */
-  default:
-    return 0;
-  }
-  switch (type) {
-  case GL_BYTE:
-  case GL_UNSIGNED_BYTE:
-    esize = 1;
-    break;
-  case GL_SHORT:
-  case GL_UNSIGNED_SHORT:
-    esize = 2;
-    break;
-  case GL_UNSIGNED_SHORT_5_6_5:
-  case GL_UNSIGNED_SHORT_4_4_4_4:
-  case GL_UNSIGNED_SHORT_5_5_5_1:
-    esize = 2;
-    elements = 1;
-    break;
-  case GL_INT:
-  case GL_UNSIGNED_INT:
-  case GL_FLOAT:
-    esize = 4;
-    break;
-  default:
-    return 0;
-  }
-  return imageSizeInBytes(elements * esize, w, h, d, pack);
-}
-
-private GLBufferSizeTracker  bufferSizeTracker;
-private GLBufferStateTracker bufferStateTracker;
-private GLStateTracker       glStateTracker;
-
-private boolean bufferObjectExtensionsInitialized = false;
-private boolean haveGL15;
-private boolean haveGL21;
-private boolean haveARBVertexBufferObject;
-
-private void initBufferObjectExtensionChecks() {
-  if (bufferObjectExtensionsInitialized)
-    return;
-  bufferObjectExtensionsInitialized = true;
-  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
-  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
-  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
-}
-
-private boolean checkBufferObject(boolean extension1,
-                                  boolean extension2,
-                                  boolean extension3,
-                                  boolean enabled,
-                                  int state,
-                                  String kind, boolean throwException) {
-  if (inBeginEndPair) {
-    throw new GLException("May not call this between glBegin and glEnd");
-  }
-  boolean avail = (extension1 || extension2 || extension3);
-  if (!avail) {
-    if (!enabled)
-      return true;
-    if(throwException) {
-        throw new GLException("Required extensions not available to call this function");
-    }
-    return false;
-  }
-  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
-  if (enabled) {
-    if (buffer == 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be enabled to call this method");
-      }
-      return false;
-    }
-  } else {
-    if (buffer != 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be disabled to call this method");
-      }
-      return false;
-    }
-  }
-  return true;
-}  
-
-private boolean checkArrayVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkArrayVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBODisabled(boolean throwException) { 
-  // PBO n/a for ES 1.1 or ES 2.0
-  return true;
-}
-
-private boolean checkUnpackPBOEnabled(boolean throwException) { 
-  // PBO n/a for ES 1.1 or ES 2.0
-  return false;
-}
-
-private boolean checkPackPBODisabled(boolean throwException) { 
-  // PBO n/a for ES 1.1 or ES 2.0
-  return true;
-}
-
-private boolean checkPackPBOEnabled(boolean throwException) { 
-  // PBO n/a for ES 1.1 or ES 2.0
-  return false;
-}
-
-// Attempt to return the same ByteBuffer object from glMapBuffer if
-// the vertex buffer object's base address and size haven't changed
-private static class ARBVBOKey {
-  private long addr;
-  private int  capacity;
-
-  ARBVBOKey(long addr, int capacity) {
-    this.addr = addr;
-    this.capacity = capacity;
-  }
-
-  public int hashCode() {
-    return (int) addr;
-  }
-
-  public boolean equals(Object o) {
-    if ((o == null) || (!(o instanceof ARBVBOKey))) {
-      return false;
-    }
-
-    ARBVBOKey other = (ARBVBOKey) o;
-    return ((addr == other.addr) && (capacity == other.capacity));
-  }
-}
-
-private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
-
-/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-public java.nio.ByteBuffer glMapBuffer(int target, int access) {
-  final long __addr_ = ((GL2ES12ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
-  if (__addr_ == 0) {
-    throw new GLException("Method \"glMapBuffer\" not available");
-  }
-  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
-                                           target,
-                                           this);
-  long addr;
-  addr = dispatch_glMapBuffer(target, access, __addr_);
-  if (addr == 0 || sz == 0) {
-    return null;
-  }
-  ARBVBOKey key = new ARBVBOKey(addr, sz);
-  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
-  if (_res == null) {
-    _res = newDirectByteBuffer(addr, sz);
-    InternalBufferUtil.nativeOrder(_res);
-    arbVBOCache.put(key, _res);
-  }
-  _res.position(0);
-  return _res;
-}
-
-/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
-
-native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  public void glReleaseShaderCompiler() {
-    // nothing to do 
-  }
-
-    public void glVertexPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glColorPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-
-    }
-    public void glNormalPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.getComponentNumber()!=3) {
-        throw new GLException("Only 3 components per normal allowed");
-      }
-      if(array.isVBO()) {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glTexCoordPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-
-
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl3.java b/make/config/jogl/gl-impl-CustomJavaCode-gl3.java
deleted file mode 100644
index cff0b0f94..000000000
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl3.java
+++ /dev/null
@@ -1,468 +0,0 @@
-// Tracks glBegin/glEnd calls to determine whether it is legal to
-// query Vertex Buffer Object state
-private boolean inBeginEndPair;
-
-/* FIXME: refactor dependence on Java 2D / JOGL bridge
-
-// Tracks creation and destruction of server-side OpenGL objects when
-// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
-// objects (FBOs) to do its rendering
-private GLObjectTracker tracker;
-
-public void setObjectTracker(GLObjectTracker tracker) {
-  this.tracker = tracker;
-}
-
-*/
-
-public GL3Impl(GLProfile glp, GLContextImpl context) {
-  this._context = context; 
-  this.bufferSizeTracker  = context.getBufferSizeTracker();
-  this.bufferStateTracker = context.getBufferStateTracker();
-  this.glStateTracker     = context.getGLStateTracker();
-  this.glProfile = glp;
-}
-
-public final boolean isGL() {
-    return true;
-}
-  
-public final boolean isGL4bc() {
-    return false;
-}
-
-public final boolean isGL4() {
-    return false;
-}
-
-public final boolean isGL3bc() {
-    return false;
-}
-
-public final boolean isGL3() {
-    return true;
-}
-
-public final boolean isGL2() {
-    return false;
-}
-  
-public final boolean isGLES1() {
-    return false;
-}
-
-public final boolean isGLES2() {
-    return false;
-}
-
-public final boolean isGLES() {
-    return false;
-}
-
-public final boolean isGL2ES1() {
-    return false;
-}
-
-public final boolean isGL2ES2() {
-    return true;
-}
-
-public final boolean isGL2GL3() {
-    return true;
-}
-
-public final boolean hasGLSL() {
-    return true;
-}
-
-public final GL getGL() throws GLException {
-    return this;
-}
-
-public final GL4bc getGL4bc() throws GLException {
-    throw new GLException("Not a GL4bc implementation");
-}
-
-public final GL4 getGL4() throws GLException {
-    throw new GLException("Not a GL4 implementation");
-}
-
-public final GL3bc getGL3bc() throws GLException {
-    throw new GLException("Not a GL3bc implementation");
-}
-
-public final GL3 getGL3() throws GLException {
-    return this;
-}
-
-public final GL2 getGL2() throws GLException {
-    throw new GLException("Not a GL2 implementation");
-}
-
-public final GLES1 getGLES1() throws GLException {
-    throw new GLException("Not a GLES1 implementation");
-}
-
-public final GLES2 getGLES2() throws GLException {
-    throw new GLException("Not a GLES2 implementation");
-}
-
-public final GL2ES1 getGL2ES1() throws GLException {
-    throw new GLException("Not a GLES2ES1 implementation");
-}
-
-public final GL2ES2 getGL2ES2() throws GLException {
-    return this;
-}
-
-public final GL2GL3 getGL2GL3() throws GLException {
-    return this;
-}
-
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-/**
- * Provides platform-independent access to the wglAllocateMemoryNV /
- * glXAllocateMemoryNV extension.
- */
-public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
-  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
-}
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
-//
-// Helpers for ensuring the correct amount of texture data
-//
-
-/** Returns the number of bytes required to fill in the appropriate
-    texture. This is computed as closely as possible based on the
-    pixel pack or unpack parameters. The logic in this routine is
-    based on code in the SGI OpenGL sample implementation. */
-
-private int imageSizeInBytes(int format, int type, int w, int h, int d,
-                             boolean pack) {
-  int elements = 0;
-  int esize = 0;
-  
-  if (w < 0) return 0;
-  if (h < 0) return 0;
-  if (d < 0) return 0;
-  switch (format) {
-  case GL_STENCIL_INDEX:
-    elements = 1;
-    break;
-  case GL_RED:
-  case GL_GREEN:
-  case GL_BLUE:
-  case GL_ALPHA:
-  case GL_LUMINANCE:
-  case GL_DEPTH_COMPONENT:
-    elements = 1;
-    break;
-  case GL_LUMINANCE_ALPHA:
-    elements = 2;
-    break;
-  case GL_RGB:
-  case GL_BGR:
-    elements = 3;
-    break;
-  case GL_RGBA:
-  case GL_BGRA:
-    elements = 4;
-    break;
-  /* FIXME ?? 
-   case GL_HILO_NV:
-    elements = 2;
-    break; */
-  default:
-    return 0;
-  }
-  switch (type) {
-  case GL_BYTE:
-  case GL_UNSIGNED_BYTE:
-    esize = 1;
-    break;
-  case GL_UNSIGNED_BYTE_3_3_2:
-  case GL_UNSIGNED_BYTE_2_3_3_REV:
-    esize = 1;
-    elements = 1;
-    break;
-  case GL_SHORT:
-  case GL_UNSIGNED_SHORT:
-    esize = 2;
-    break;
-  case GL_UNSIGNED_SHORT_5_6_5:
-  case GL_UNSIGNED_SHORT_5_6_5_REV:
-  case GL_UNSIGNED_SHORT_4_4_4_4:
-  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-  case GL_UNSIGNED_SHORT_5_5_5_1:
-  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-    esize = 2;
-    elements = 1;
-    break;
-  case GL_INT:
-  case GL_UNSIGNED_INT:
-  case GL_FLOAT:
-    esize = 4;
-    break;
-  case GL_UNSIGNED_INT_8_8_8_8:
-  case GL_UNSIGNED_INT_8_8_8_8_REV:
-  case GL_UNSIGNED_INT_10_10_10_2:
-  case GL_UNSIGNED_INT_2_10_10_10_REV:
-    esize = 4;
-    elements = 1;
-    break;
-  default:
-    return 0;
-  }
-  return imageSizeInBytes(elements * esize, w, h, d, pack);
-}
-
-private GLBufferSizeTracker  bufferSizeTracker;
-private GLBufferStateTracker bufferStateTracker;
-private GLStateTracker       glStateTracker;
-
-private boolean bufferObjectExtensionsInitialized = false;
-private boolean haveARBPixelBufferObject;
-private boolean haveEXTPixelBufferObject;
-private boolean haveGL15;
-private boolean haveGL21;
-private boolean haveARBVertexBufferObject;
-
-private void initBufferObjectExtensionChecks() {
-  if (bufferObjectExtensionsInitialized)
-    return;
-  bufferObjectExtensionsInitialized = true;
-  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
-  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
-  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
-  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
-  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
-}
-
-private boolean checkBufferObject(boolean extension1,
-                                  boolean extension2,
-                                  boolean extension3,
-                                  boolean enabled,
-                                  int state,
-                                  String kind, boolean throwException) {
-  if (inBeginEndPair) {
-    throw new GLException("May not call this between glBegin and glEnd");
-  }
-  boolean avail = (extension1 || extension2 || extension3);
-  if (!avail) {
-    if (!enabled)
-      return true;
-    if(throwException) {
-        throw new GLException("Required extensions not available to call this function");
-    }
-    return false;
-  }
-  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
-  if (enabled) {
-    if (buffer == 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be enabled to call this method");
-      }
-      return false;
-    }
-  } else {
-    if (buffer != 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be disabled to call this method");
-      }
-      return false;
-    }
-  }
-  return true;
-}  
-
-private boolean checkArrayVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkArrayVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-public boolean glIsPBOPackEnabled() {
-    return checkPackPBOEnabled(false);
-}
-
-public boolean glIsPBOUnpackEnabled() {
-    return checkUnpackPBOEnabled(false);
-}
-
-// Attempt to return the same ByteBuffer object from glMapBuffer if
-// the vertex buffer object's base address and size haven't changed
-private static class ARBVBOKey {
-  private long addr;
-  private int  capacity;
-
-  ARBVBOKey(long addr, int capacity) {
-    this.addr = addr;
-    this.capacity = capacity;
-  }
-
-  public int hashCode() {
-    return (int) addr;
-  }
-
-  public boolean equals(Object o) {
-    if ((o == null) || (!(o instanceof ARBVBOKey))) {
-      return false;
-    }
-
-    ARBVBOKey other = (ARBVBOKey) o;
-    return ((addr == other.addr) && (capacity == other.capacity));
-  }
-}
-
-private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
-
-/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-public java.nio.ByteBuffer glMapBuffer(int target, int access) {
-  final long __addr_ = ((GL3ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
-  if (__addr_ == 0) {
-    throw new GLException("Method \"glMapBuffer\" not available");
-  }
-  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
-                                           target,
-                                           this);
-  long addr;
-  addr = dispatch_glMapBuffer(target, access, __addr_);
-  if (addr == 0 || sz == 0) {
-    return null;
-  }
-  ARBVBOKey key = new ARBVBOKey(addr, sz);
-  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
-  if (_res == null) {
-    _res = newDirectByteBuffer(addr, sz);
-    InternalBufferUtil.nativeOrder(_res);
-    arbVBOCache.put(key, _res);
-  }
-  _res.position(0);
-  return _res;
-}
-
-/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
-
-native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  public void glReleaseShaderCompiler() {
-    // nothing to do 
-  }
-
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl3bc.java b/make/config/jogl/gl-impl-CustomJavaCode-gl3bc.java
deleted file mode 100644
index 2f804a218..000000000
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl3bc.java
+++ /dev/null
@@ -1,514 +0,0 @@
-// Tracks glBegin/glEnd calls to determine whether it is legal to
-// query Vertex Buffer Object state
-private boolean inBeginEndPair;
-
-/* FIXME: refactor dependence on Java 2D / JOGL bridge
-
-// Tracks creation and destruction of server-side OpenGL objects when
-// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
-// objects (FBOs) to do its rendering
-private GLObjectTracker tracker;
-
-public void setObjectTracker(GLObjectTracker tracker) {
-  this.tracker = tracker;
-}
-
-*/
-
-
-public GL3bcImpl(GLProfile glp, GLContextImpl context) {
-  this._context = context; 
-  this.bufferSizeTracker  = context.getBufferSizeTracker();
-  this.bufferStateTracker = context.getBufferStateTracker();
-  this.glStateTracker     = context.getGLStateTracker();
-  this.glProfile = glp;
-}
-
-public final boolean isGL() {
-    return true;
-}
-  
-public final boolean isGL4bc() {
-    return false;
-}
-
-public final boolean isGL4() {
-    return false;
-}
-
-public final boolean isGL3bc() {
-    return true;
-}
-
-public final boolean isGL3() {
-    return true;
-}
-
-public final boolean isGL2() {
-    return true;
-}
-  
-public final boolean isGLES1() {
-    return false;
-}
-
-public final boolean isGLES2() {
-    return false;
-}
-
-public final boolean isGLES() {
-    return false;
-}
-
-public final boolean isGL2ES1() {
-    return true;
-}
-
-public final boolean isGL2ES2() {
-    return true;
-}
-
-public final boolean isGL2GL3() {
-    return true;
-}
-
-public final boolean hasGLSL() {
-    return true;
-}
-
-public final GL getGL() throws GLException {
-    return this;
-}
-
-public final GL4bc getGL4bc() throws GLException {
-    throw new GLException("Not a GL4bc implementation");
-}
-
-public final GL4 getGL4() throws GLException {
-    throw new GLException("Not a GL4 implementation");
-}
-
-public final GL3bc getGL3bc() throws GLException {
-    return this;
-}
-
-public final GL3 getGL3() throws GLException {
-    return this;
-}
-
-public final GL2 getGL2() throws GLException {
-    return this;
-}
-
-public final GLES1 getGLES1() throws GLException {
-    throw new GLException("Not a GLES1 implementation");
-}
-
-public final GLES2 getGLES2() throws GLException {
-    throw new GLException("Not a GLES2 implementation");
-}
-
-public final GL2ES1 getGL2ES1() throws GLException {
-    return this;
-}
-
-public final GL2ES2 getGL2ES2() throws GLException {
-    return this;
-}
-
-public final GL2GL3 getGL2GL3() throws GLException {
-    return this;
-}
-
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-/**
- * Provides platform-independent access to the wglAllocateMemoryNV /
- * glXAllocateMemoryNV extension.
- */
-public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
-  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
-}
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
-//
-// Helpers for ensuring the correct amount of texture data
-//
-
-/** Returns the number of bytes required to fill in the appropriate
-    texture. This is computed as closely as possible based on the
-    pixel pack or unpack parameters. The logic in this routine is
-    based on code in the SGI OpenGL sample implementation. */
-
-private int imageSizeInBytes(int format, int type, int w, int h, int d,
-                             boolean pack) {
-  int elements = 0;
-  int esize = 0;
-  
-  if (w < 0) return 0;
-  if (h < 0) return 0;
-  if (d < 0) return 0;
-  switch (format) {
-  case GL_COLOR_INDEX:
-  case GL_STENCIL_INDEX:
-    elements = 1;
-    break;
-  case GL_RED:
-  case GL_GREEN:
-  case GL_BLUE:
-  case GL_ALPHA:
-  case GL_LUMINANCE:
-  case GL_DEPTH_COMPONENT:
-    elements = 1;
-    break;
-  case GL_LUMINANCE_ALPHA:
-    elements = 2;
-    break;
-  case GL_RGB:
-  case GL_BGR:
-    elements = 3;
-    break;
-  case GL_RGBA:
-  case GL_BGRA:
-  case GL_ABGR_EXT:
-    elements = 4;
-    break;
-  /* FIXME ?? 
-   case GL_HILO_NV:
-    elements = 2;
-    break; */
-  default:
-    return 0;
-  }
-  switch (type) {
-  case GL_BITMAP:
-    if (format == GL_COLOR_INDEX) {
-      return (d * (h * ((w+7)/8)));
-    } else {
-      return 0;
-    }
-  case GL_BYTE:
-  case GL_UNSIGNED_BYTE:
-    esize = 1;
-    break;
-  case GL_UNSIGNED_BYTE_3_3_2:
-  case GL_UNSIGNED_BYTE_2_3_3_REV:
-    esize = 1;
-    elements = 1;
-    break;
-  case GL_SHORT:
-  case GL_UNSIGNED_SHORT:
-    esize = 2;
-    break;
-  case GL_UNSIGNED_SHORT_5_6_5:
-  case GL_UNSIGNED_SHORT_5_6_5_REV:
-  case GL_UNSIGNED_SHORT_4_4_4_4:
-  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-  case GL_UNSIGNED_SHORT_5_5_5_1:
-  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-    esize = 2;
-    elements = 1;
-    break;
-  case GL_INT:
-  case GL_UNSIGNED_INT:
-  case GL_FLOAT:
-    esize = 4;
-    break;
-  case GL_UNSIGNED_INT_8_8_8_8:
-  case GL_UNSIGNED_INT_8_8_8_8_REV:
-  case GL_UNSIGNED_INT_10_10_10_2:
-  case GL_UNSIGNED_INT_2_10_10_10_REV:
-    esize = 4;
-    elements = 1;
-    break;
-  default:
-    return 0;
-  }
-  return imageSizeInBytes(elements * esize, w, h, d, pack);
-}
-
-private GLBufferSizeTracker  bufferSizeTracker;
-private GLBufferStateTracker bufferStateTracker;
-private GLStateTracker       glStateTracker;
-
-private boolean bufferObjectExtensionsInitialized = false;
-private boolean haveARBPixelBufferObject;
-private boolean haveEXTPixelBufferObject;
-private boolean haveGL15;
-private boolean haveGL21;
-private boolean haveARBVertexBufferObject;
-
-private void initBufferObjectExtensionChecks() {
-  if (bufferObjectExtensionsInitialized)
-    return;
-  bufferObjectExtensionsInitialized = true;
-  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
-  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
-  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
-  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
-  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
-}
-
-private boolean checkBufferObject(boolean extension1,
-                                  boolean extension2,
-                                  boolean extension3,
-                                  boolean enabled,
-                                  int state,
-                                  String kind, boolean throwException) {
-  if (inBeginEndPair) {
-    throw new GLException("May not call this between glBegin and glEnd");
-  }
-  boolean avail = (extension1 || extension2 || extension3);
-  if (!avail) {
-    if (!enabled)
-      return true;
-    if(throwException) {
-        throw new GLException("Required extensions not available to call this function");
-    }
-    return false;
-  }
-  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
-  if (enabled) {
-    if (buffer == 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be enabled to call this method");
-      }
-      return false;
-    }
-  } else {
-    if (buffer != 0) {
-      if(throwException) {
-          throw new GLException(kind + " must be disabled to call this method");
-      }
-      return false;
-    }
-  }
-  return true;
-}  
-
-private boolean checkArrayVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkArrayVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ARRAY_BUFFER,
-                    "array vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    false,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkElementVBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveGL15,
-                    haveARBVertexBufferObject,
-                    false,
-                    true,
-                    GL.GL_ELEMENT_ARRAY_BUFFER,
-                    "element vertex_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkUnpackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_UNPACK_BUFFER,
-                    "unpack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBODisabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    false,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-private boolean checkPackPBOEnabled(boolean throwException) { 
-  initBufferObjectExtensionChecks();
-  return checkBufferObject(haveARBPixelBufferObject,
-                    haveEXTPixelBufferObject,
-                    haveGL21,
-                    true,
-                    GL2.GL_PIXEL_PACK_BUFFER,
-                    "pack pixel_buffer_object", throwException);
-}
-
-public boolean glIsPBOPackEnabled() {
-    return checkPackPBOEnabled(false);
-}
-
-public boolean glIsPBOUnpackEnabled() {
-    return checkUnpackPBOEnabled(false);
-}
-
-// Attempt to return the same ByteBuffer object from glMapBuffer if
-// the vertex buffer object's base address and size haven't changed
-private static class ARBVBOKey {
-  private long addr;
-  private int  capacity;
-
-  ARBVBOKey(long addr, int capacity) {
-    this.addr = addr;
-    this.capacity = capacity;
-  }
-
-  public int hashCode() {
-    return (int) addr;
-  }
-
-  public boolean equals(Object o) {
-    if ((o == null) || (!(o instanceof ARBVBOKey))) {
-      return false;
-    }
-
-    ARBVBOKey other = (ARBVBOKey) o;
-    return ((addr == other.addr) && (capacity == other.capacity));
-  }
-}
-
-private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
-
-/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-public java.nio.ByteBuffer glMapBuffer(int target, int access) {
-  final long __addr_ = ((GL3bcProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
-  if (__addr_ == 0) {
-    throw new GLException("Method \"glMapBuffer\" not available");
-  }
-  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
-                                           target,
-                                           this);
-  long addr;
-  addr = dispatch_glMapBuffer(target, access, __addr_);
-  if (addr == 0 || sz == 0) {
-    return null;
-  }
-  ARBVBOKey key = new ARBVBOKey(addr, sz);
-  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
-  if (_res == null) {
-    _res = newDirectByteBuffer(addr, sz);
-    InternalBufferUtil.nativeOrder(_res);
-    arbVBOCache.put(key, _res);
-  }
-  _res.position(0);
-  return _res;
-}
-
-/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
-native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
-
-native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
-  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
-    throw new GLException("Method \"glShaderBinary\" not available");
-  }
-
-  public void glReleaseShaderCompiler() {
-    // nothing to do 
-  }
-
-    public void glVertexPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glColorPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-
-    }
-    public void glNormalPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.getComponentNumber()!=3) {
-        throw new GLException("Only 3 components per normal allowed");
-      }
-      if(array.isVBO()) {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-    public void glTexCoordPointer(GLArrayData array) {
-      if(array.getComponentNumber()==0) return;
-      if(array.isVBO()) {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
-      } else {
-          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
-      }
-    }
-
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl4.java b/make/config/jogl/gl-impl-CustomJavaCode-gl4.java
new file mode 100644
index 000000000..a2c70eeee
--- /dev/null
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gl4.java
@@ -0,0 +1,339 @@
+// Tracks glBegin/glEnd calls to determine whether it is legal to
+// query Vertex Buffer Object state
+private boolean inBeginEndPair;
+
+/* FIXME: refactor dependence on Java 2D / JOGL bridge
+
+// Tracks creation and destruction of server-side OpenGL objects when
+// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
+// objects (FBOs) to do its rendering
+private GLObjectTracker tracker;
+
+public void setObjectTracker(GLObjectTracker tracker) {
+  this.tracker = tracker;
+}
+
+*/
+
+public GL3Impl(GLProfile glp, GLContextImpl context) {
+  this._context = context; 
+  this.bufferSizeTracker  = context.getBufferSizeTracker();
+  this.bufferStateTracker = context.getBufferStateTracker();
+  this.glStateTracker     = context.getGLStateTracker();
+  this.glProfile = glp;
+}
+
+/**
+ * Provides platform-independent access to the wglAllocateMemoryNV /
+ * glXAllocateMemoryNV extension.
+ */
+public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
+}
+
+//
+// Helpers for ensuring the correct amount of texture data
+//
+
+/** Returns the number of bytes required to fill in the appropriate
+    texture. This is computed as closely as possible based on the
+    pixel pack or unpack parameters. The logic in this routine is
+    based on code in the SGI OpenGL sample implementation. */
+
+private int imageSizeInBytes(int format, int type, int w, int h, int d,
+                             boolean pack) {
+  int elements = 0;
+  int esize = 0;
+  
+  if (w < 0) return 0;
+  if (h < 0) return 0;
+  if (d < 0) return 0;
+  switch (format) {
+  case GL_STENCIL_INDEX:
+    elements = 1;
+    break;
+  case GL_RED:
+  case GL_GREEN:
+  case GL_BLUE:
+  case GL_ALPHA:
+  case GL_LUMINANCE:
+  case GL_DEPTH_COMPONENT:
+    elements = 1;
+    break;
+  case GL_LUMINANCE_ALPHA:
+    elements = 2;
+    break;
+  case GL_RGB:
+  case GL_BGR:
+    elements = 3;
+    break;
+  case GL_RGBA:
+  case GL_BGRA:
+    elements = 4;
+    break;
+  /* FIXME ?? 
+   case GL_HILO_NV:
+    elements = 2;
+    break; */
+  default:
+    return 0;
+  }
+  switch (type) {
+  case GL_BYTE:
+  case GL_UNSIGNED_BYTE:
+    esize = 1;
+    break;
+  case GL_UNSIGNED_BYTE_3_3_2:
+  case GL_UNSIGNED_BYTE_2_3_3_REV:
+    esize = 1;
+    elements = 1;
+    break;
+  case GL_SHORT:
+  case GL_UNSIGNED_SHORT:
+    esize = 2;
+    break;
+  case GL_UNSIGNED_SHORT_5_6_5:
+  case GL_UNSIGNED_SHORT_5_6_5_REV:
+  case GL_UNSIGNED_SHORT_4_4_4_4:
+  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+  case GL_UNSIGNED_SHORT_5_5_5_1:
+  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+    esize = 2;
+    elements = 1;
+    break;
+  case GL_INT:
+  case GL_UNSIGNED_INT:
+  case GL_FLOAT:
+    esize = 4;
+    break;
+  case GL_UNSIGNED_INT_8_8_8_8:
+  case GL_UNSIGNED_INT_8_8_8_8_REV:
+  case GL_UNSIGNED_INT_10_10_10_2:
+  case GL_UNSIGNED_INT_2_10_10_10_REV:
+    esize = 4;
+    elements = 1;
+    break;
+  default:
+    return 0;
+  }
+  return imageSizeInBytes(elements * esize, w, h, d, pack);
+}
+
+private GLBufferSizeTracker  bufferSizeTracker;
+private GLBufferStateTracker bufferStateTracker;
+private GLStateTracker       glStateTracker;
+
+private boolean bufferObjectExtensionsInitialized = false;
+private boolean haveARBPixelBufferObject;
+private boolean haveEXTPixelBufferObject;
+private boolean haveGL15;
+private boolean haveGL21;
+private boolean haveARBVertexBufferObject;
+
+private void initBufferObjectExtensionChecks() {
+  if (bufferObjectExtensionsInitialized)
+    return;
+  bufferObjectExtensionsInitialized = true;
+  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
+  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
+  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
+  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
+  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
+}
+
+private boolean checkBufferObject(boolean extension1,
+                                  boolean extension2,
+                                  boolean extension3,
+                                  boolean enabled,
+                                  int state,
+                                  String kind, boolean throwException) {
+  if (inBeginEndPair) {
+    throw new GLException("May not call this between glBegin and glEnd");
+  }
+  boolean avail = (extension1 || extension2 || extension3);
+  if (!avail) {
+    if (!enabled)
+      return true;
+    if(throwException) {
+        throw new GLException("Required extensions not available to call this function");
+    }
+    return false;
+  }
+  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
+  if (enabled) {
+    if (buffer == 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be enabled to call this method");
+      }
+      return false;
+    }
+  } else {
+    if (buffer != 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be disabled to call this method");
+      }
+      return false;
+    }
+  }
+  return true;
+}  
+
+private boolean checkArrayVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkArrayVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+public boolean glIsPBOPackEnabled() {
+    return checkPackPBOEnabled(false);
+}
+
+public boolean glIsPBOUnpackEnabled() {
+    return checkUnpackPBOEnabled(false);
+}
+
+// Attempt to return the same ByteBuffer object from glMapBuffer if
+// the vertex buffer object's base address and size haven't changed
+private static class ARBVBOKey {
+  private long addr;
+  private int  capacity;
+
+  ARBVBOKey(long addr, int capacity) {
+    this.addr = addr;
+    this.capacity = capacity;
+  }
+
+  public int hashCode() {
+    return (int) addr;
+  }
+
+  public boolean equals(Object o) {
+    if ((o == null) || (!(o instanceof ARBVBOKey))) {
+      return false;
+    }
+
+    ARBVBOKey other = (ARBVBOKey) o;
+    return ((addr == other.addr) && (capacity == other.capacity));
+  }
+}
+
+private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
+
+/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+public java.nio.ByteBuffer glMapBuffer(int target, int access) {
+  final long __addr_ = ((GL3ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
+  if (__addr_ == 0) {
+    throw new GLException("Method \"glMapBuffer\" not available");
+  }
+  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
+                                           target,
+                                           this);
+  long addr;
+  addr = dispatch_glMapBuffer(target, access, __addr_);
+  if (addr == 0 || sz == 0) {
+    return null;
+  }
+  ARBVBOKey key = new ARBVBOKey(addr, sz);
+  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
+  if (_res == null) {
+    _res = newDirectByteBuffer(addr, sz);
+    InternalBufferUtil.nativeOrder(_res);
+    arbVBOCache.put(key, _res);
+  }
+  _res.position(0);
+  return _res;
+}
+
+/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
+
+native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  public void glReleaseShaderCompiler() {
+    // nothing to do 
+  }
+
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl4bc.java b/make/config/jogl/gl-impl-CustomJavaCode-gl4bc.java
new file mode 100644
index 000000000..bceb12fe5
--- /dev/null
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gl4bc.java
@@ -0,0 +1,385 @@
+// Tracks glBegin/glEnd calls to determine whether it is legal to
+// query Vertex Buffer Object state
+private boolean inBeginEndPair;
+
+/* FIXME: refactor dependence on Java 2D / JOGL bridge
+
+// Tracks creation and destruction of server-side OpenGL objects when
+// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
+// objects (FBOs) to do its rendering
+private GLObjectTracker tracker;
+
+public void setObjectTracker(GLObjectTracker tracker) {
+  this.tracker = tracker;
+}
+
+*/
+
+
+public GL4bcImpl(GLProfile glp, GLContextImpl context) {
+  this._context = context; 
+  this.bufferSizeTracker  = context.getBufferSizeTracker();
+  this.bufferStateTracker = context.getBufferStateTracker();
+  this.glStateTracker     = context.getGLStateTracker();
+  this.glProfile = glp;
+}
+
+/**
+ * Provides platform-independent access to the wglAllocateMemoryNV /
+ * glXAllocateMemoryNV extension.
+ */
+public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
+}
+
+//
+// Helpers for ensuring the correct amount of texture data
+//
+
+/** Returns the number of bytes required to fill in the appropriate
+    texture. This is computed as closely as possible based on the
+    pixel pack or unpack parameters. The logic in this routine is
+    based on code in the SGI OpenGL sample implementation. */
+
+private int imageSizeInBytes(int format, int type, int w, int h, int d,
+                             boolean pack) {
+  int elements = 0;
+  int esize = 0;
+  
+  if (w < 0) return 0;
+  if (h < 0) return 0;
+  if (d < 0) return 0;
+  switch (format) {
+  case GL_COLOR_INDEX:
+  case GL_STENCIL_INDEX:
+    elements = 1;
+    break;
+  case GL_RED:
+  case GL_GREEN:
+  case GL_BLUE:
+  case GL_ALPHA:
+  case GL_LUMINANCE:
+  case GL_DEPTH_COMPONENT:
+    elements = 1;
+    break;
+  case GL_LUMINANCE_ALPHA:
+    elements = 2;
+    break;
+  case GL_RGB:
+  case GL_BGR:
+    elements = 3;
+    break;
+  case GL_RGBA:
+  case GL_BGRA:
+  case GL_ABGR_EXT:
+    elements = 4;
+    break;
+  /* FIXME ?? 
+   case GL_HILO_NV:
+    elements = 2;
+    break; */
+  default:
+    return 0;
+  }
+  switch (type) {
+  case GL_BITMAP:
+    if (format == GL_COLOR_INDEX) {
+      return (d * (h * ((w+7)/8)));
+    } else {
+      return 0;
+    }
+  case GL_BYTE:
+  case GL_UNSIGNED_BYTE:
+    esize = 1;
+    break;
+  case GL_UNSIGNED_BYTE_3_3_2:
+  case GL_UNSIGNED_BYTE_2_3_3_REV:
+    esize = 1;
+    elements = 1;
+    break;
+  case GL_SHORT:
+  case GL_UNSIGNED_SHORT:
+    esize = 2;
+    break;
+  case GL_UNSIGNED_SHORT_5_6_5:
+  case GL_UNSIGNED_SHORT_5_6_5_REV:
+  case GL_UNSIGNED_SHORT_4_4_4_4:
+  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+  case GL_UNSIGNED_SHORT_5_5_5_1:
+  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+    esize = 2;
+    elements = 1;
+    break;
+  case GL_INT:
+  case GL_UNSIGNED_INT:
+  case GL_FLOAT:
+    esize = 4;
+    break;
+  case GL_UNSIGNED_INT_8_8_8_8:
+  case GL_UNSIGNED_INT_8_8_8_8_REV:
+  case GL_UNSIGNED_INT_10_10_10_2:
+  case GL_UNSIGNED_INT_2_10_10_10_REV:
+    esize = 4;
+    elements = 1;
+    break;
+  default:
+    return 0;
+  }
+  return imageSizeInBytes(elements * esize, w, h, d, pack);
+}
+
+private GLBufferSizeTracker  bufferSizeTracker;
+private GLBufferStateTracker bufferStateTracker;
+private GLStateTracker       glStateTracker;
+
+private boolean bufferObjectExtensionsInitialized = false;
+private boolean haveARBPixelBufferObject;
+private boolean haveEXTPixelBufferObject;
+private boolean haveGL15;
+private boolean haveGL21;
+private boolean haveARBVertexBufferObject;
+
+private void initBufferObjectExtensionChecks() {
+  if (bufferObjectExtensionsInitialized)
+    return;
+  bufferObjectExtensionsInitialized = true;
+  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
+  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
+  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
+  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
+  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
+}
+
+private boolean checkBufferObject(boolean extension1,
+                                  boolean extension2,
+                                  boolean extension3,
+                                  boolean enabled,
+                                  int state,
+                                  String kind, boolean throwException) {
+  if (inBeginEndPair) {
+    throw new GLException("May not call this between glBegin and glEnd");
+  }
+  boolean avail = (extension1 || extension2 || extension3);
+  if (!avail) {
+    if (!enabled)
+      return true;
+    if(throwException) {
+        throw new GLException("Required extensions not available to call this function");
+    }
+    return false;
+  }
+  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
+  if (enabled) {
+    if (buffer == 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be enabled to call this method");
+      }
+      return false;
+    }
+  } else {
+    if (buffer != 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be disabled to call this method");
+      }
+      return false;
+    }
+  }
+  return true;
+}  
+
+private boolean checkArrayVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkArrayVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+public boolean glIsPBOPackEnabled() {
+    return checkPackPBOEnabled(false);
+}
+
+public boolean glIsPBOUnpackEnabled() {
+    return checkUnpackPBOEnabled(false);
+}
+
+// Attempt to return the same ByteBuffer object from glMapBuffer if
+// the vertex buffer object's base address and size haven't changed
+private static class ARBVBOKey {
+  private long addr;
+  private int  capacity;
+
+  ARBVBOKey(long addr, int capacity) {
+    this.addr = addr;
+    this.capacity = capacity;
+  }
+
+  public int hashCode() {
+    return (int) addr;
+  }
+
+  public boolean equals(Object o) {
+    if ((o == null) || (!(o instanceof ARBVBOKey))) {
+      return false;
+    }
+
+    ARBVBOKey other = (ARBVBOKey) o;
+    return ((addr == other.addr) && (capacity == other.capacity));
+  }
+}
+
+private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
+
+/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+public java.nio.ByteBuffer glMapBuffer(int target, int access) {
+  final long __addr_ = ((GL4bcProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
+  if (__addr_ == 0) {
+    throw new GLException("Method \"glMapBuffer\" not available");
+  }
+  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
+                                           target,
+                                           this);
+  long addr;
+  addr = dispatch_glMapBuffer(target, access, __addr_);
+  if (addr == 0 || sz == 0) {
+    return null;
+  }
+  ARBVBOKey key = new ARBVBOKey(addr, sz);
+  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
+  if (_res == null) {
+    _res = newDirectByteBuffer(addr, sz);
+    InternalBufferUtil.nativeOrder(_res);
+    arbVBOCache.put(key, _res);
+  }
+  _res.position(0);
+  return _res;
+}
+
+/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
+
+native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  public void glReleaseShaderCompiler() {
+    // nothing to do 
+  }
+
+    public void glVertexPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glColorPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+
+    }
+    public void glNormalPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.getComponentNumber()!=3) {
+        throw new GLException("Only 3 components per normal allowed");
+      }
+      if(array.isVBO()) {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glTexCoordPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gles1.java b/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
index 6fb8a32ef..b4efac8a1 100755
--- a/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
@@ -6,10 +6,6 @@ public GLES1Impl(GLProfile glp, GLContextImpl context) {
   this.glProfile = glp;
 }
 
-public final boolean isGL() {
-    return true;
-}
-  
 public final boolean isGL4bc() {
     return false;
 }
@@ -58,10 +54,6 @@ public final boolean hasGLSL() {
     return false;
 }
 
-public final GL getGL() throws GLException {
-    return this;
-}
-
 public final GL4bc getGL4bc() throws GLException {
     throw new GLException("Not a GL4bc implementation");
 }
@@ -102,39 +94,6 @@ public final GL2GL3 getGL2GL3() throws GLException {
     throw new GLException("Not a GL2GL3 implementation");
 }
 
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
 //
 // Helpers for ensuring the correct amount of texture data
 //
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gles2.java b/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
index 8204bd1ae..bb8ddb7ef 100755
--- a/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
@@ -10,10 +10,6 @@ public GLES2Impl(GLProfile glp, GLContextImpl context) {
   this.glProfile = glp;
 }
 
-public final boolean isGL() {
-    return true;
-}
-  
 public final boolean isGL4bc() {
     return false;
 }
@@ -62,10 +58,6 @@ public final boolean hasGLSL() {
     return true;
 }
 
-public final GL getGL() throws GLException {
-    return this;
-}
-
 public final GL4bc getGL4bc() throws GLException {
     throw new GLException("Not a GL4bc implementation");
 }
@@ -106,39 +98,6 @@ public final GL2GL3 getGL2GL3() throws GLException {
     throw new GLException("Not a GL2GL3 implementation");
 }
 
-public boolean isFunctionAvailable(String glFunctionName) {
-  return _context.isFunctionAvailable(glFunctionName);
-}
-
-public boolean isExtensionAvailable(String glExtensionName) {
-  return _context.isExtensionAvailable(glExtensionName);
-}
-
-public Object getExtension(String extensionName) {
-  // At this point we don't expose any extensions using this mechanism
-  return null;
-}
-
-/** Returns the context this GL object is associated with for better
-    error checking by DebugGL. */
-public GLContext getContext() {
-  return _context;
-}
-
-private GLContextImpl _context;
-
-public void setSwapInterval(int interval) {
-  _context.setSwapInterval(interval);
-}
-
-public int getSwapInterval() {
-  return _context.getSwapInterval();
-}
-
-public Object getPlatformGLExtensions() {
-  return _context.getPlatformGLExtensions();
-}
-
 //
 // Helpers for ensuring the correct amount of texture data
 //
diff --git a/make/config/jogl/gl3-common.cfg b/make/config/jogl/gl3-common.cfg
index fac8323bb..c2cc2968e 100644
--- a/make/config/jogl/gl3-common.cfg
+++ b/make/config/jogl/gl3-common.cfg
@@ -16,6 +16,9 @@ RenameExtensionIntoCore GL_ARB_geometry_shader4
 RenameExtensionIntoCore GL_ARB_sync
 # <<< OpenGL 3.2
 
+# >>> OpenGL 3.3
+# <<< OpenGL 3.3
+
 # Ignore GL functions that deal with explicit pointer values in such a
 # way that we cannot implement the functionality in Java
 Ignore glMultiDrawElementsBaseVertex
diff --git a/make/config/jogl/gl3-desktop-tracker.cfg b/make/config/jogl/gl3-desktop-tracker.cfg
deleted file mode 100644
index 4b9a7edb7..000000000
--- a/make/config/jogl/gl3-desktop-tracker.cfg
+++ /dev/null
@@ -1,38 +0,0 @@
-
-# Track server-side object creation and deletion when necessary
-# Note that this is only necessary when the Java 2D / JOGL bridge is active,
-# so will never be needed for the embedded OpenGL variants
-JavaEpilogue glGenBuffers               if (tracker != null) tracker.addBuffers({0}, {1});
-JavaEpilogue glGenFencesAPPLE           if (tracker != null) tracker.addFencesAPPLE({0}, {1});
-JavaEpilogue glGenFencesNV              if (tracker != null) tracker.addFencesNV({0}, {1});
-JavaEpilogue glGenFragmentShadersATI    if (tracker != null) tracker.addFragmentShadersATI(_res, {0});
-JavaEpilogue glGenFramebuffersEXT       if (tracker != null) tracker.addFramebuffersEXT({0}, {1});
-JavaEpilogue glGenLists                 if (tracker != null) tracker.addLists(_res, {0});
-JavaEpilogue glGenOcclusionQueriesNV    if (tracker != null) tracker.addOcclusionQueriesNV({0}, {1});
-JavaEpilogue glCreateProgram            if (tracker != null) tracker.addProgramObject(_res);
-JavaEpilogue glGenPrograms              if (tracker != null) tracker.addPrograms({0}, {1});
-JavaEpilogue glGenQueries               if (tracker != null) tracker.addQueries({0}, {1});
-JavaEpilogue glGenRenderbuffersEXT      if (tracker != null) tracker.addRenderbuffersEXT({0}, {1});
-JavaEpilogue glCreateShader             if (tracker != null) tracker.addShaderObject(_res);
-JavaEpilogue glGenTextures              if (tracker != null) tracker.addTextures({0}, {1});
-JavaEpilogue glGenVertexArraysAPPLE     if (tracker != null) tracker.addVertexArraysAPPLE({0}, {1});
-JavaEpilogue glGenVertexShadersEXT      if (tracker != null) tracker.addVertexShadersEXT(_res, {0});
-
-JavaEpilogue glDeleteBuffers            if (tracker != null) tracker.removeBuffers({0}, {1});
-JavaEpilogue glDeleteFencesAPPLE        if (tracker != null) tracker.removeFencesAPPLE({0}, {1});
-JavaEpilogue glDeleteFencesNV           if (tracker != null) tracker.removeFencesNV({0}, {1});
-JavaEpilogue glDeleteFragmentShaderATI  if (tracker != null) tracker.removeFragmentShaderATI({0});
-JavaEpilogue glDeleteFramebuffersEXT    if (tracker != null) tracker.removeFramebuffersEXT({0}, {1});
-JavaEpilogue glDeleteLists              if (tracker != null) tracker.removeLists({0}, {1});
-JavaEpilogue glDeleteOcclusionQueriesNV if (tracker != null) tracker.removeOcclusionQueriesNV({0}, {1});
-JavaEpilogue glDeleteProgram            if (tracker != null) tracker.removeProgramObject({0});
-JavaEpilogue glDeleteObject             if (tracker != null) tracker.removeProgramOrShaderObject({0});
-JavaEpilogue glDeletePrograms           if (tracker != null) tracker.removePrograms({0}, {1});
-JavaEpilogue glDeleteProgramsNV         if (tracker != null) tracker.removeProgramsNV({0}, {1});
-JavaEpilogue glDeleteQueries            if (tracker != null) tracker.removeQueries({0}, {1});
-JavaEpilogue glDeleteRenderbuffersEXT   if (tracker != null) tracker.removeRenderbuffersEXT({0}, {1});
-JavaEpilogue glDeleteShader             if (tracker != null) tracker.removeShaderObject({0});
-JavaEpilogue glDeleteTextures           if (tracker != null) tracker.removeTextures({0}, {1});
-JavaEpilogue glDeleteVertexArraysAPPLE  if (tracker != null) tracker.removeVertexArraysAPPLE({0}, {1});
-JavaEpilogue glDeleteVertexShaderEXT    if (tracker != null) tracker.removeVertexShaderEXT({0});
-
diff --git a/make/config/jogl/gl4-common.cfg b/make/config/jogl/gl4-common.cfg
new file mode 100644
index 000000000..2c119da30
--- /dev/null
+++ b/make/config/jogl/gl4-common.cfg
@@ -0,0 +1,5 @@
+
+# >>> OpenGL 4.0
+# <<< OpenGL 4.0
+
+
diff --git a/make/config/jogl/gl4-desktop-tracker.cfg b/make/config/jogl/gl4-desktop-tracker.cfg
new file mode 100644
index 000000000..4b9a7edb7
--- /dev/null
+++ b/make/config/jogl/gl4-desktop-tracker.cfg
@@ -0,0 +1,38 @@
+
+# Track server-side object creation and deletion when necessary
+# Note that this is only necessary when the Java 2D / JOGL bridge is active,
+# so will never be needed for the embedded OpenGL variants
+JavaEpilogue glGenBuffers               if (tracker != null) tracker.addBuffers({0}, {1});
+JavaEpilogue glGenFencesAPPLE           if (tracker != null) tracker.addFencesAPPLE({0}, {1});
+JavaEpilogue glGenFencesNV              if (tracker != null) tracker.addFencesNV({0}, {1});
+JavaEpilogue glGenFragmentShadersATI    if (tracker != null) tracker.addFragmentShadersATI(_res, {0});
+JavaEpilogue glGenFramebuffersEXT       if (tracker != null) tracker.addFramebuffersEXT({0}, {1});
+JavaEpilogue glGenLists                 if (tracker != null) tracker.addLists(_res, {0});
+JavaEpilogue glGenOcclusionQueriesNV    if (tracker != null) tracker.addOcclusionQueriesNV({0}, {1});
+JavaEpilogue glCreateProgram            if (tracker != null) tracker.addProgramObject(_res);
+JavaEpilogue glGenPrograms              if (tracker != null) tracker.addPrograms({0}, {1});
+JavaEpilogue glGenQueries               if (tracker != null) tracker.addQueries({0}, {1});
+JavaEpilogue glGenRenderbuffersEXT      if (tracker != null) tracker.addRenderbuffersEXT({0}, {1});
+JavaEpilogue glCreateShader             if (tracker != null) tracker.addShaderObject(_res);
+JavaEpilogue glGenTextures              if (tracker != null) tracker.addTextures({0}, {1});
+JavaEpilogue glGenVertexArraysAPPLE     if (tracker != null) tracker.addVertexArraysAPPLE({0}, {1});
+JavaEpilogue glGenVertexShadersEXT      if (tracker != null) tracker.addVertexShadersEXT(_res, {0});
+
+JavaEpilogue glDeleteBuffers            if (tracker != null) tracker.removeBuffers({0}, {1});
+JavaEpilogue glDeleteFencesAPPLE        if (tracker != null) tracker.removeFencesAPPLE({0}, {1});
+JavaEpilogue glDeleteFencesNV           if (tracker != null) tracker.removeFencesNV({0}, {1});
+JavaEpilogue glDeleteFragmentShaderATI  if (tracker != null) tracker.removeFragmentShaderATI({0});
+JavaEpilogue glDeleteFramebuffersEXT    if (tracker != null) tracker.removeFramebuffersEXT({0}, {1});
+JavaEpilogue glDeleteLists              if (tracker != null) tracker.removeLists({0}, {1});
+JavaEpilogue glDeleteOcclusionQueriesNV if (tracker != null) tracker.removeOcclusionQueriesNV({0}, {1});
+JavaEpilogue glDeleteProgram            if (tracker != null) tracker.removeProgramObject({0});
+JavaEpilogue glDeleteObject             if (tracker != null) tracker.removeProgramOrShaderObject({0});
+JavaEpilogue glDeletePrograms           if (tracker != null) tracker.removePrograms({0}, {1});
+JavaEpilogue glDeleteProgramsNV         if (tracker != null) tracker.removeProgramsNV({0}, {1});
+JavaEpilogue glDeleteQueries            if (tracker != null) tracker.removeQueries({0}, {1});
+JavaEpilogue glDeleteRenderbuffersEXT   if (tracker != null) tracker.removeRenderbuffersEXT({0}, {1});
+JavaEpilogue glDeleteShader             if (tracker != null) tracker.removeShaderObject({0});
+JavaEpilogue glDeleteTextures           if (tracker != null) tracker.removeTextures({0}, {1});
+JavaEpilogue glDeleteVertexArraysAPPLE  if (tracker != null) tracker.removeVertexArraysAPPLE({0}, {1});
+JavaEpilogue glDeleteVertexShaderEXT    if (tracker != null) tracker.removeVertexShaderEXT({0});
+
diff --git a/make/config/jogl/glu-CustomJavaCode-base.java b/make/config/jogl/glu-CustomJavaCode-base.java
index aeb4f2ef9..480f5d117 100755
--- a/make/config/jogl/glu-CustomJavaCode-base.java
+++ b/make/config/jogl/glu-CustomJavaCode-base.java
@@ -169,7 +169,7 @@ protected static boolean checkedGLUtessellatorImpl = false;
 
 protected static final void validateGLUtessellatorImpl() {
     if(!checkedGLUtessellatorImpl) {
-        availableGLUtessellatorImpl = NWReflection.isClassAvailable("com.jogamp.opengl.impl.glu.tessellator.GLUtessellatorImpl");
+        availableGLUtessellatorImpl = ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.glu.tessellator.GLUtessellatorImpl");
         checkedGLUtessellatorImpl = true;
     }
     if(!availableGLUtessellatorImpl) {
@@ -1220,7 +1220,7 @@ protected static final void validateGLUquadricImpl() {
     if(!checkedGLUquadricImpl) {
         synchronized (syncObject) {
             if(!checkedGLUquadricImpl) {
-                availableGLUquadricImpl = NWReflection.isClassAvailable("com.jogamp.opengl.impl.glu.GLUquadricImpl");
+                availableGLUquadricImpl = ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.glu.GLUquadricImpl");
                 checkedGLUquadricImpl = true;
             }
         }
diff --git a/make/config/jogl/glu-CustomJavaCode-gl2es1.java b/make/config/jogl/glu-CustomJavaCode-gl2es1.java
index b5cb3b2f8..f3b4322d9 100755
--- a/make/config/jogl/glu-CustomJavaCode-gl2es1.java
+++ b/make/config/jogl/glu-CustomJavaCode-gl2es1.java
@@ -86,7 +86,7 @@ protected static boolean checkedMipmap = false;
 
 protected static final void validateMipmap() {
     if(!checkedMipmap) {
-        availableMipmap = NWReflection.isClassAvailable("com.jogamp.opengl.impl.glu.mipmap.Mipmap");
+        availableMipmap = ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.glu.mipmap.Mipmap");
         checkedMipmap = true;
     }
     if(!availableMipmap) {
diff --git a/make/config/jogl/glu-common.cfg b/make/config/jogl/glu-common.cfg
index 937ca0348..f5fc7c1b3 100644
--- a/make/config/jogl/glu-common.cfg
+++ b/make/config/jogl/glu-common.cfg
@@ -14,7 +14,7 @@ Import javax.media.opengl.glu.*
 Import com.jogamp.opengl.impl.*
 Import com.jogamp.opengl.impl.glu.*
 Import com.jogamp.opengl.impl.glu.tessellator.GLUtessellatorImpl
-Import com.jogamp.nativewindow.impl.NWReflection
+Import com.jogamp.common.util.ReflectionUtil
 
 # Raise GLException instead of RuntimeException in glue code
 RuntimeExceptionType GLException
diff --git a/make/config/jogl/obsolete/gl-gl2es12.cfg b/make/config/jogl/obsolete/gl-gl2es12.cfg
new file mode 100644
index 000000000..3942b1419
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-gl2es12.cfg
@@ -0,0 +1,90 @@
+# This .cfg file is used to generate the GL interface and implementing class.
+JavaOutputDir gensrc/classes
+NativeOutputDir gensrc/native/jogl/gl2es12
+
+ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL.java
+ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL2ES1.java
+ExtendedInterfaceSymbolsOnly ../build-temp/gensrc/classes/javax/media/opengl/GL2ES2.java
+ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/GLBase.java
+ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLMatrixFunc.java
+ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLPointerFunc.java
+ExtendedInterfaceSymbolsOnly ../src/jogl/classes/javax/media/opengl/fixedfunc/GLLightingFunc.java
+
+Style ImplOnly
+ImplPackage com.jogamp.opengl.impl.gl2es12
+ImplJavaClass GL2ES12Impl
+Implements GL2ES12Impl GLBase
+Implements GL2ES12Impl GL
+Implements GL2ES12Impl GL2ES1
+Implements GL2ES12Impl GL2ES2
+
+Include gl-common.cfg
+Include gl-common-extensions.cfg
+Include gl-desktop.cfg
+
+# Because we're manually implementing glMapBuffer but only producing
+# the implementing class, GlueGen doesn't notice that it has to emit a
+# proc address table entry for it. Force it to here.
+ForceProcAddressGen glMapBuffer
+
+# Force all of the methods to be emitted using dynamic linking so we
+# don't need to link against any emulation library on the desktop or
+# depend on the presence of an import library for a particular device
+ForceProcAddressGen __ALL__
+
+# Also force the calling conventions of the locally generated function
+# pointer typedefs for these routines to APIENTRY
+LocalProcAddressCallingConvention __ALL__ APIENTRY
+
+EmitProcAddressTable true
+ProcAddressTableClassName GL2ES12ProcAddressTable
+GetProcAddressTableExpr ((GL2ES12ProcAddressTable)_context.getGLProcAddressTable())
+
+# Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
+TagNativeBinding true
+
+# There seem to be some errors in the glue code generation where we are not ignoring
+# enough routines from desktop GL in GL2ES12Impl. For now manually ignore those which
+# we know shouldn't be in there
+Ignore glGetTexImage
+Ignore glPixelStoref
+
+# Add PixelStorei StateTracker
+#
+# Add input validation to glPixelStorei to make sure that, even if we
+# are running on top of desktop OpenGL, parameters not exposed in
+# OpenGL ES can not be changed
+CustomJavaCode GL2ES12Impl private static final int params_offset = 0; // just a helper for JavaPrologue ..
+
+JavaPrologue glPixelStorei if (pname != GL_PACK_ALIGNMENT && pname != GL_UNPACK_ALIGNMENT) {
+JavaPrologue glPixelStorei     throw new GLException("Unsupported pixel store parameter name 0x" + Integer.toHexString(pname));
+JavaPrologue glPixelStorei }
+JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);
+
+JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }
+
+CustomJavaCode GL2ES12Impl public void glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) {
+CustomJavaCode GL2ES12Impl   glFrustum((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
+
+CustomJavaCode GL2ES12Impl public void glOrthof(float left, float right, float bottom, float top, float zNear, float zFar) {
+CustomJavaCode GL2ES12Impl   glOrtho((double)left, (double)right, (double)bottom, (double)top, (double)zNear, (double)zFar); }
+
+CustomJavaCode GL2ES12Impl public void glClearDepthf(float depth) {
+CustomJavaCode GL2ES12Impl   glClearDepth((double)depth); }
+
+CustomJavaCode GL2ES12Impl public void glDepthRangef(float zNear, float zFar) {
+CustomJavaCode GL2ES12Impl    glDepthRange((double)zNear, (double)zFar); }
+
+Include gl-headers.cfg
+Include ../intptr.cfg
+
+IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-common.java
+IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-gl2es12.java
+IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-embedded.java
+IncludeAs CustomJavaCode GL2ES12Impl gl-impl-CustomJavaCode-gl2_es2.java
+IncludeAs CustomCCode gl-impl-CustomCCode-gl2es12.c
+
+Import javax.media.opengl.GLES1
+Import javax.media.opengl.GLES2
+Import com.jogamp.opengl.impl.InternalBufferUtil
+Import java.io.PrintStream
diff --git a/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2.c b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2.c
new file mode 100644
index 000000000..91fd0078b
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2.c
@@ -0,0 +1,24 @@
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl2.GL2Impl
+ *    Java method: long dispatch_glMapBuffer(int target, int access)
+ *     C function: void * glMapBuffer(GLenum target, GLenum access);
+ */
+JNIEXPORT jlong JNICALL 
+Java_com_jogamp_opengl_impl_gl2_GL2Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
+  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
+  void * _res;
+  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
+  assert(ptr_glMapBuffer != NULL);
+  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
+  return (jlong) (intptr_t) _res;
+}
+
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl2.GL2Impl
+ *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
+ *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
+ */
+JNIEXPORT jobject JNICALL
+Java_com_jogamp_opengl_impl_gl2_GL2Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
+  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
+}
diff --git a/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2es12.c b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2es12.c
new file mode 100644
index 000000000..07b821802
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl2es12.c
@@ -0,0 +1,24 @@
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl2es12.GL2ES12Impl
+ *    Java method: long dispatch_glMapBuffer(int target, int access)
+ *     C function: void * glMapBuffer(GLenum target, GLenum access);
+ */
+JNIEXPORT jlong JNICALL 
+Java_com_jogamp_opengl_impl_gl2es12_GL2ES12Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
+  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
+  void * _res;
+  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
+  assert(ptr_glMapBuffer != NULL);
+  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
+  return (jlong) (intptr_t) _res;
+}
+
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl2es12.GL2ES12Impl
+ *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
+ *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
+ */
+JNIEXPORT jobject JNICALL
+Java_com_jogamp_opengl_impl_gl2es12_GL2ES12Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
+  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
+}
diff --git a/make/config/jogl/obsolete/gl-impl-CustomCCode-gl3.c b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl3.c
new file mode 100644
index 000000000..f540a7d4a
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-impl-CustomCCode-gl3.c
@@ -0,0 +1,24 @@
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl3.GL3Impl
+ *    Java method: long dispatch_glMapBuffer(int target, int access)
+ *     C function: void * glMapBuffer(GLenum target, GLenum access);
+ */
+JNIEXPORT jlong JNICALL 
+Java_com_jogamp_opengl_impl_gl3_GL3Impl_dispatch_1glMapBuffer(JNIEnv *env, jobject _unused, jint target, jint access, jlong glProcAddress) {
+  PFNGLMAPBUFFERPROC ptr_glMapBuffer;
+  void * _res;
+  ptr_glMapBuffer = (PFNGLMAPBUFFERPROC) (intptr_t) glProcAddress;
+  assert(ptr_glMapBuffer != NULL);
+  _res = (* ptr_glMapBuffer) ((GLenum) target, (GLenum) access);
+  return (jlong) (intptr_t) _res;
+}
+
+/*   Java->C glue code:
+ *   Java package: com.jogamp.opengl.impl.gl3.GL3Impl
+ *    Java method: ByteBuffer newDirectByteBuffer(long addr, int capacity);
+ *     C function: jobject newDirectByteBuffer(jlong addr, jint capacity);
+ */
+JNIEXPORT jobject JNICALL
+Java_com_jogamp_opengl_impl_gl3_GL3Impl_newDirectByteBuffer(JNIEnv *env, jobject _unused, jlong addr, jint capacity) {
+  return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) addr, capacity);
+}
diff --git a/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2.java b/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2.java
new file mode 100644
index 000000000..a1a6917df
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2.java
@@ -0,0 +1,385 @@
+// Tracks glBegin/glEnd calls to determine whether it is legal to
+// query Vertex Buffer Object state
+private boolean inBeginEndPair;
+
+/* FIXME: refactor dependence on Java 2D / JOGL bridge
+
+// Tracks creation and destruction of server-side OpenGL objects when
+// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
+// objects (FBOs) to do its rendering
+private GLObjectTracker tracker;
+
+public void setObjectTracker(GLObjectTracker tracker) {
+  this.tracker = tracker;
+}
+
+*/
+
+
+public GL2Impl(GLProfile glp, GLContextImpl context) {
+  this._context = context; 
+  this.bufferSizeTracker  = context.getBufferSizeTracker();
+  this.bufferStateTracker = context.getBufferStateTracker();
+  this.glStateTracker     = context.getGLStateTracker();
+  this.glProfile = glp;
+}
+
+/**
+ * Provides platform-independent access to the wglAllocateMemoryNV /
+ * glXAllocateMemoryNV extension.
+ */
+public java.nio.ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+  return _context.glAllocateMemoryNV(arg0, arg1, arg2, arg3);
+}
+
+//
+// Helpers for ensuring the correct amount of texture data
+//
+
+/** Returns the number of bytes required to fill in the appropriate
+    texture. This is computed as closely as possible based on the
+    pixel pack or unpack parameters. The logic in this routine is
+    based on code in the SGI OpenGL sample implementation. */
+
+private int imageSizeInBytes(int format, int type, int w, int h, int d,
+                             boolean pack) {
+  int elements = 0;
+  int esize = 0;
+  
+  if (w < 0) return 0;
+  if (h < 0) return 0;
+  if (d < 0) return 0;
+  switch (format) {
+  case GL_COLOR_INDEX:
+  case GL_STENCIL_INDEX:
+    elements = 1;
+    break;
+  case GL_RED:
+  case GL_GREEN:
+  case GL_BLUE:
+  case GL_ALPHA:
+  case GL_LUMINANCE:
+  case GL_DEPTH_COMPONENT:
+    elements = 1;
+    break;
+  case GL_LUMINANCE_ALPHA:
+    elements = 2;
+    break;
+  case GL_RGB:
+  case GL_BGR:
+    elements = 3;
+    break;
+  case GL_RGBA:
+  case GL_BGRA:
+  case GL_ABGR_EXT:
+    elements = 4;
+    break;
+  /* FIXME ?? 
+   case GL_HILO_NV:
+    elements = 2;
+    break; */
+  default:
+    return 0;
+  }
+  switch (type) {
+  case GL_BITMAP:
+    if (format == GL_COLOR_INDEX) {
+      return (d * (h * ((w+7)/8)));
+    } else {
+      return 0;
+    }
+  case GL_BYTE:
+  case GL_UNSIGNED_BYTE:
+    esize = 1;
+    break;
+  case GL_UNSIGNED_BYTE_3_3_2:
+  case GL_UNSIGNED_BYTE_2_3_3_REV:
+    esize = 1;
+    elements = 1;
+    break;
+  case GL_SHORT:
+  case GL_UNSIGNED_SHORT:
+    esize = 2;
+    break;
+  case GL_UNSIGNED_SHORT_5_6_5:
+  case GL_UNSIGNED_SHORT_5_6_5_REV:
+  case GL_UNSIGNED_SHORT_4_4_4_4:
+  case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+  case GL_UNSIGNED_SHORT_5_5_5_1:
+  case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+    esize = 2;
+    elements = 1;
+    break;
+  case GL_INT:
+  case GL_UNSIGNED_INT:
+  case GL_FLOAT:
+    esize = 4;
+    break;
+  case GL_UNSIGNED_INT_8_8_8_8:
+  case GL_UNSIGNED_INT_8_8_8_8_REV:
+  case GL_UNSIGNED_INT_10_10_10_2:
+  case GL_UNSIGNED_INT_2_10_10_10_REV:
+    esize = 4;
+    elements = 1;
+    break;
+  default:
+    return 0;
+  }
+  return imageSizeInBytes(elements * esize, w, h, d, pack);
+}
+
+private GLBufferSizeTracker  bufferSizeTracker;
+private GLBufferStateTracker bufferStateTracker;
+private GLStateTracker       glStateTracker;
+
+private boolean bufferObjectExtensionsInitialized = false;
+private boolean haveARBPixelBufferObject;
+private boolean haveEXTPixelBufferObject;
+private boolean haveGL15;
+private boolean haveGL21;
+private boolean haveARBVertexBufferObject;
+
+private void initBufferObjectExtensionChecks() {
+  if (bufferObjectExtensionsInitialized)
+    return;
+  bufferObjectExtensionsInitialized = true;
+  haveARBPixelBufferObject  = isExtensionAvailable("GL_ARB_pixel_buffer_object");
+  haveEXTPixelBufferObject  = isExtensionAvailable("GL_EXT_pixel_buffer_object");
+  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
+  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
+  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
+}
+
+private boolean checkBufferObject(boolean extension1,
+                                  boolean extension2,
+                                  boolean extension3,
+                                  boolean enabled,
+                                  int state,
+                                  String kind, boolean throwException) {
+  if (inBeginEndPair) {
+    throw new GLException("May not call this between glBegin and glEnd");
+  }
+  boolean avail = (extension1 || extension2 || extension3);
+  if (!avail) {
+    if (!enabled)
+      return true;
+    if(throwException) {
+        throw new GLException("Required extensions not available to call this function");
+    }
+    return false;
+  }
+  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
+  if (enabled) {
+    if (buffer == 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be enabled to call this method");
+      }
+      return false;
+    }
+  } else {
+    if (buffer != 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be disabled to call this method");
+      }
+      return false;
+    }
+  }
+  return true;
+}  
+
+private boolean checkArrayVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkArrayVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_UNPACK_BUFFER,
+                    "unpack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    false,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+private boolean checkPackPBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveARBPixelBufferObject,
+                    haveEXTPixelBufferObject,
+                    haveGL21,
+                    true,
+                    GL2.GL_PIXEL_PACK_BUFFER,
+                    "pack pixel_buffer_object", throwException);
+}
+
+public boolean glIsPBOPackEnabled() {
+    return checkPackPBOEnabled(false);
+}
+
+public boolean glIsPBOUnpackEnabled() {
+    return checkUnpackPBOEnabled(false);
+}
+
+// Attempt to return the same ByteBuffer object from glMapBuffer if
+// the vertex buffer object's base address and size haven't changed
+private static class ARBVBOKey {
+  private long addr;
+  private int  capacity;
+
+  ARBVBOKey(long addr, int capacity) {
+    this.addr = addr;
+    this.capacity = capacity;
+  }
+
+  public int hashCode() {
+    return (int) addr;
+  }
+
+  public boolean equals(Object o) {
+    if ((o == null) || (!(o instanceof ARBVBOKey))) {
+      return false;
+    }
+
+    ARBVBOKey other = (ARBVBOKey) o;
+    return ((addr == other.addr) && (capacity == other.capacity));
+  }
+}
+
+private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
+
+/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+public java.nio.ByteBuffer glMapBuffer(int target, int access) {
+  final long __addr_ = ((GL2ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
+  if (__addr_ == 0) {
+    throw new GLException("Method \"glMapBuffer\" not available");
+  }
+  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
+                                           target,
+                                           this);
+  long addr;
+  addr = dispatch_glMapBuffer(target, access, __addr_);
+  if (addr == 0 || sz == 0) {
+    return null;
+  }
+  ARBVBOKey key = new ARBVBOKey(addr, sz);
+  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
+  if (_res == null) {
+    _res = newDirectByteBuffer(addr, sz);
+    InternalBufferUtil.nativeOrder(_res);
+    arbVBOCache.put(key, _res);
+  }
+  _res.position(0);
+  return _res;
+}
+
+/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
+
+native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  public void glReleaseShaderCompiler() {
+    // nothing to do 
+  }
+
+    public void glVertexPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glColorPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+
+    }
+    public void glNormalPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.getComponentNumber()!=3) {
+        throw new GLException("Only 3 components per normal allowed");
+      }
+      if(array.isVBO()) {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glTexCoordPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+
diff --git a/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2es12.java b/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2es12.java
new file mode 100644
index 000000000..aed442da3
--- /dev/null
+++ b/make/config/jogl/obsolete/gl-impl-CustomJavaCode-gl2es12.java
@@ -0,0 +1,353 @@
+// Tracks glBegin/glEnd calls to determine whether it is legal to
+// query Vertex Buffer Object state
+private boolean inBeginEndPair;
+
+/* FIXME: refactor dependence on Java 2D / JOGL bridge
+
+// Tracks creation and destruction of server-side OpenGL objects when
+// the Java2D/OpenGL pipeline is enabled and it is using frame buffer
+// objects (FBOs) to do its rendering
+private GLObjectTracker tracker;
+
+public void setObjectTracker(GLObjectTracker tracker) {
+  this.tracker = tracker;
+}
+
+*/
+
+public GL2ES12Impl(GLProfile glp, GLContextImpl context) {
+  this._context = context; 
+  this.bufferSizeTracker  = context.getBufferSizeTracker();
+  this.bufferStateTracker = context.getBufferStateTracker();
+  this.glStateTracker     = context.getGLStateTracker();
+  this.isGL2ES2 = glp.isGL2ES2();
+  this.glProfile = glp;
+}
+
+private boolean isGL2ES2;
+
+public boolean isFunctionAvailable(String glFunctionName) {
+  return _context.isFunctionAvailable(glFunctionName);
+}
+
+public boolean isExtensionAvailable(String glExtensionName) {
+  return _context.isExtensionAvailable(glExtensionName);
+}
+
+public Object getExtension(String extensionName) {
+  // At this point we don't expose any extensions using this mechanism
+  return null;
+}
+
+/** Returns the context this GL object is associated with for better
+    error checking by DebugGL. */
+public GLContext getContext() {
+  return _context;
+}
+
+private GLContextImpl _context;
+
+public void setSwapInterval(int interval) {
+  _context.setSwapInterval(interval);
+}
+
+public int getSwapInterval() {
+  return _context.getSwapInterval();
+}
+
+public Object getPlatformGLExtensions() {
+  return _context.getPlatformGLExtensions();
+}
+
+//
+// Helpers for ensuring the correct amount of texture data
+//
+
+/** Returns the number of bytes required to fill in the appropriate
+    texture. This is computed as closely as possible based on the
+    pixel pack or unpack parameters. The logic in this routine is
+    based on code in the SGI OpenGL sample implementation. */
+
+private int imageSizeInBytes(int format, int type, int w, int h, int d,
+                             boolean pack) {
+  int elements = 0;
+  int esize = 0;
+  
+  if (w < 0) return 0;
+  if (h < 0) return 0;
+  if (d < 0) return 0;
+  switch (format) {
+  case GL_STENCIL_INDEX:
+    elements = 1;
+    break;
+  case GL_ALPHA:
+  case GL_LUMINANCE:
+  case GL_DEPTH_COMPONENT:
+    elements = 1;
+    break;
+  case GL_LUMINANCE_ALPHA:
+    elements = 2;
+    break;
+  case GL_RGB:
+    elements = 3;
+    break;
+  case GL_RGBA:
+    elements = 4;
+    break;
+  /* FIXME ?? 
+   case GL_HILO_NV:
+    elements = 2;
+    break; */
+  default:
+    return 0;
+  }
+  switch (type) {
+  case GL_BYTE:
+  case GL_UNSIGNED_BYTE:
+    esize = 1;
+    break;
+  case GL_SHORT:
+  case GL_UNSIGNED_SHORT:
+    esize = 2;
+    break;
+  case GL_UNSIGNED_SHORT_5_6_5:
+  case GL_UNSIGNED_SHORT_4_4_4_4:
+  case GL_UNSIGNED_SHORT_5_5_5_1:
+    esize = 2;
+    elements = 1;
+    break;
+  case GL_INT:
+  case GL_UNSIGNED_INT:
+  case GL_FLOAT:
+    esize = 4;
+    break;
+  default:
+    return 0;
+  }
+  return imageSizeInBytes(elements * esize, w, h, d, pack);
+}
+
+private GLBufferSizeTracker  bufferSizeTracker;
+private GLBufferStateTracker bufferStateTracker;
+private GLStateTracker       glStateTracker;
+
+private boolean bufferObjectExtensionsInitialized = false;
+private boolean haveGL15;
+private boolean haveGL21;
+private boolean haveARBVertexBufferObject;
+
+private void initBufferObjectExtensionChecks() {
+  if (bufferObjectExtensionsInitialized)
+    return;
+  bufferObjectExtensionsInitialized = true;
+  haveGL15                  = isExtensionAvailable("GL_VERSION_1_5");
+  haveGL21                  = isExtensionAvailable("GL_VERSION_2_1");
+  haveARBVertexBufferObject = isExtensionAvailable("GL_ARB_vertex_buffer_object");
+}
+
+private boolean checkBufferObject(boolean extension1,
+                                  boolean extension2,
+                                  boolean extension3,
+                                  boolean enabled,
+                                  int state,
+                                  String kind, boolean throwException) {
+  if (inBeginEndPair) {
+    throw new GLException("May not call this between glBegin and glEnd");
+  }
+  boolean avail = (extension1 || extension2 || extension3);
+  if (!avail) {
+    if (!enabled)
+      return true;
+    if(throwException) {
+        throw new GLException("Required extensions not available to call this function");
+    }
+    return false;
+  }
+  int buffer = bufferStateTracker.getBoundBufferObject(state, this);
+  if (enabled) {
+    if (buffer == 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be enabled to call this method");
+      }
+      return false;
+    }
+  } else {
+    if (buffer != 0) {
+      if(throwException) {
+          throw new GLException(kind + " must be disabled to call this method");
+      }
+      return false;
+    }
+  }
+  return true;
+}  
+
+private boolean checkArrayVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkArrayVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ARRAY_BUFFER,
+                    "array vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBODisabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    false,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkElementVBOEnabled(boolean throwException) { 
+  initBufferObjectExtensionChecks();
+  return checkBufferObject(haveGL15,
+                    haveARBVertexBufferObject,
+                    false,
+                    true,
+                    GL.GL_ELEMENT_ARRAY_BUFFER,
+                    "element vertex_buffer_object", throwException);
+}
+
+private boolean checkUnpackPBODisabled(boolean throwException) { 
+  // PBO n/a for ES 1.1 or ES 2.0
+  return true;
+}
+
+private boolean checkUnpackPBOEnabled(boolean throwException) { 
+  // PBO n/a for ES 1.1 or ES 2.0
+  return false;
+}
+
+private boolean checkPackPBODisabled(boolean throwException) { 
+  // PBO n/a for ES 1.1 or ES 2.0
+  return true;
+}
+
+private boolean checkPackPBOEnabled(boolean throwException) { 
+  // PBO n/a for ES 1.1 or ES 2.0
+  return false;
+}
+
+// Attempt to return the same ByteBuffer object from glMapBuffer if
+// the vertex buffer object's base address and size haven't changed
+private static class ARBVBOKey {
+  private long addr;
+  private int  capacity;
+
+  ARBVBOKey(long addr, int capacity) {
+    this.addr = addr;
+    this.capacity = capacity;
+  }
+
+  public int hashCode() {
+    return (int) addr;
+  }
+
+  public boolean equals(Object o) {
+    if ((o == null) || (!(o instanceof ARBVBOKey))) {
+      return false;
+    }
+
+    ARBVBOKey other = (ARBVBOKey) o;
+    return ((addr == other.addr) && (capacity == other.capacity));
+  }
+}
+
+private Map/*<ARBVBOKey, ByteBuffer>*/ arbVBOCache = new HashMap();
+
+/** Entry point to C language function: <br> <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+public java.nio.ByteBuffer glMapBuffer(int target, int access) {
+  final long __addr_ = ((GL2ES12ProcAddressTable)_context.getGLProcAddressTable())._addressof_glMapBuffer;
+  if (__addr_ == 0) {
+    throw new GLException("Method \"glMapBuffer\" not available");
+  }
+  int sz = bufferSizeTracker.getBufferSize(bufferStateTracker,
+                                           target,
+                                           this);
+  long addr;
+  addr = dispatch_glMapBuffer(target, access, __addr_);
+  if (addr == 0 || sz == 0) {
+    return null;
+  }
+  ARBVBOKey key = new ARBVBOKey(addr, sz);
+  ByteBuffer _res = (ByteBuffer) arbVBOCache.get(key);
+  if (_res == null) {
+    _res = newDirectByteBuffer(addr, sz);
+    InternalBufferUtil.nativeOrder(_res);
+    arbVBOCache.put(key, _res);
+  }
+  _res.position(0);
+  return _res;
+}
+
+/** Encapsulates function pointer for OpenGL function <br>: <code> LPVOID glMapBuffer(GLenum target, GLenum access); </code>    */
+native private long dispatch_glMapBuffer(int target, int access, long glProcAddress);
+
+native private ByteBuffer newDirectByteBuffer(long addr, int capacity);
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, java.nio.IntBuffer shaders, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  /** Dummy implementation for the ES 2.0 function: <br> <code> void {@native glShaderBinary}(GLint n, const GLuint *  shaders, GLenum binaryformat, const void *  binary, GLint length); </code>  <br> Always throws a GLException!  */
+  public void glShaderBinary(int n, int[] shaders, int shaders_offset, int binaryformat, java.nio.Buffer binary, int length) {
+    throw new GLException("Method \"glShaderBinary\" not available");
+  }
+
+  public void glReleaseShaderCompiler() {
+    // nothing to do 
+  }
+
+    public void glVertexPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glVertexPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glColorPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glColorPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+
+    }
+    public void glNormalPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.getComponentNumber()!=3) {
+        throw new GLException("Only 3 components per normal allowed");
+      }
+      if(array.isVBO()) {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glNormalPointer(array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+    public void glTexCoordPointer(GLArrayData array) {
+      if(array.getComponentNumber()==0) return;
+      if(array.isVBO()) {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getOffset());
+      } else {
+          glTexCoordPointer(array.getComponentNumber(), array.getComponentType(), array.getStride(), array.getBuffer());
+      }
+    }
+
+
diff --git a/make/config/nativewindow/x11-CustomJavaCode.java b/make/config/nativewindow/x11-CustomJavaCode.java
index 57f37bee7..44bb1e8d0 100644
--- a/make/config/nativewindow/x11-CustomJavaCode.java
+++ b/make/config/nativewindow/x11-CustomJavaCode.java
@@ -26,9 +26,8 @@
 
   public static native long DefaultVisualID(long display, int screen);
 
-  /**
   public static native long CreateDummyWindow(long display, int screen_index, long visualID);
-  public static native void DestroyDummyWindow(long display, long window); */
+  public static native void DestroyDummyWindow(long display, long window);
 
   public static native long dlopen(String name);
   public static native long dlsym(String name);
diff --git a/make/stub_includes/opengl/gl4.c b/make/stub_includes/opengl/gl4.c
index cf8a709f7..5e9d87ccd 100644
--- a/make/stub_includes/opengl/gl4.c
+++ b/make/stub_includes/opengl/gl4.c
@@ -1,11 +1,11 @@
 #define GLAPI
 
-// Define GL4_PROTOTYPES so that the OpenGL prototypes in
+// Define GL3_PROTOTYPES so that the OpenGL prototypes in
 // "gl3.h" are parsed.
-#define GL4_PROTOTYPES
+#define GL3_PROTOTYPES
 
-// Define GL_GL4EXT_PROTOTYPES so that the OpenGL extension prototypes in
+// Define GL_GL3EXT_PROTOTYPES so that the OpenGL extension prototypes in
 // "gl3ext.h" are parsed.
-#define GL_GL4EXT_PROTOTYPES
+#define GL_GL3EXT_PROTOTYPES
 
-#include <GL4/gl3.h>
+#include <GL3/gl3.h>
diff --git a/make/stub_includes/opengl/gl4bc.c b/make/stub_includes/opengl/gl4bc.c
new file mode 100644
index 000000000..262e005f7
--- /dev/null
+++ b/make/stub_includes/opengl/gl4bc.c
@@ -0,0 +1,18 @@
+#define GLAPI
+
+// Define GL_GLEXT_PROTOTYPES so that the OpenGL extension prototypes in
+// "glext.h" are parsed.
+#define GL_GLEXT_PROTOTYPES
+
+#include <GL/gl.h>
+
+// Define GL3_PROTOTYPES so that the OpenGL prototypes in
+// "gl3.h" are parsed.
+#define GL3_PROTOTYPES
+
+// Define GL_GL3EXT_PROTOTYPES so that the OpenGL extension prototypes in
+// "gl3ext.h" are parsed.
+#define GL_GL3EXT_PROTOTYPES
+
+#include <GL3/gl3ext.h>
+
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/ExtensionAvailabilityCache.java b/src/jogl/classes/com/jogamp/opengl/impl/ExtensionAvailabilityCache.java
index 082f006e8..1ed0396a9 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/ExtensionAvailabilityCache.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/ExtensionAvailabilityCache.java
@@ -174,12 +174,12 @@ public final class ExtensionAvailabilityCache {
             major[0] = 3;
             minor[0] = 0;
       }
-      while (GLProfile.isValidGLVersion(major[0], minor[0])) {
+      while (GLContext.isValidGLVersion(major[0], minor[0])) {
         availableExtensionCache.add("GL_VERSION_" + major[0] + "_" + minor[0]);
         if (DEBUG) {
             System.err.println("ExtensionAvailabilityCache: Added GL_VERSION_" + major[0] + "_" + minor[0] + " to known extensions");
         }
-        if(!GLProfile.decrementGLVersion(major, minor)) break;
+        if(!GLContext.decrementGLVersion(major, minor)) break;
       }
 
       // put a dummy var in here so that the cache is no longer empty even if
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
index 8c5890d1e..3abb69a7f 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java
@@ -45,9 +45,10 @@ import java.util.*;
 
 import javax.media.opengl.*;
 import javax.media.nativewindow.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 import com.jogamp.gluegen.runtime.*;
 import com.jogamp.gluegen.runtime.opengl.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.ReflectionUtil;
 
 public abstract class GLContextImpl extends GLContext {
   protected GLContextLock lock = new GLContextLock();
@@ -123,108 +124,137 @@ public abstract class GLContextImpl extends GLContext {
     return (GLDrawableImpl) getGLDrawable();
   }
 
-  /** 
-   * Platform dependent but harmonized implementation of the <code>ARB_create_context</code>
-   * mechanism to create a context.<br>
-   * The implementation shall verify this context, ie issue a
-   * <code>MakeCurrent</code> call if necessary.<br>
-   *
-   * @param share the shared context or null
-   * @param direct flag if direct is requested
-   * @param ctxOptionFlags <code>ARB_create_context</code> related, see references below
-   * @param major major number
-   * @param minor minor number
-   * @return the valid context if successfull, or null
-   *
-   * @see #CTX_PROFILE_COMPAT
-   * @see #CTX_OPTION_FORWARD
-   * @see #CTX_OPTION_DEBUG
-   */
-  protected abstract long createContextARBImpl(long share, boolean direct, int ctxOptionFlags, 
-                                               int major, int minor);
+  public final GL getGL() {
+    return gl;
+  }
 
-  private long createContextARB(long share, boolean direct, int ctxOptionFlags, 
-                                int majorMax, int minorMax, 
-                                int majorMin, int minorMin, 
-                                int major[], int minor[]) {
-    major[0]=majorMax;
-    minor[0]=minorMax;
-    long _context=0;
+  public GL setGL(GL gl) {
+    if(DEBUG) {
+        String sgl1 = (null!=this.gl)?this.gl.getClass().toString()+", "+this.gl.toString():new String("<null>");
+        String sgl2 = (null!=gl)?gl.getClass().toString()+", "+gl.toString():new String("<null>");
+        Exception e = new Exception("setGL (OpenGL "+getGLVersion()+"): "+Thread.currentThread()+", "+sgl1+" -> "+sgl2);
+        e.printStackTrace();
+    }
+    this.gl = gl;
+    return gl;
+  }
 
-    while ( 0==_context &&
-            GLProfile.isValidGLVersion(major[0], minor[0]) &&
-            ( major[0]>majorMin || major[0]==majorMin && minor[0] >=minorMin ) ) {
+  // This is only needed for Mac OS X on-screen contexts
+  protected void update() throws GLException { }
 
-        _context = createContextARBImpl(share, direct, ctxOptionFlags, major[0], minor[0]);
+  public boolean isSynchronized() {
+    return !lock.getFailFastMode();
+  }
 
-        if(0==_context) {
-            if(!GLProfile.decrementGLVersion(major, minor)) break;
-        }
+  public void setSynchronized(boolean isSynchronized) {
+    lock.setFailFastMode(!isSynchronized);
+  }
+
+  public abstract Object getPlatformGLExtensions();
+
+  public void release() throws GLException {
+    if (!lock.isHeld()) {
+      throw new GLException("Context not current on current thread");
+    }
+    setCurrent(null);
+    try {
+      releaseImpl();
+    } finally {
+      lock.unlock();
     }
-    return _context;
   }
 
-  /**
-   * Platform independent part of using the <code>ARB_create_context</code>
-   * mechanism to create a context.<br>
-   */
-  protected long createContextARB(long share, boolean direct,
-                                  int major[], int minor[], int ctp[]) 
-  {
-    AbstractGraphicsConfiguration config = drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
-    GLCapabilities glCaps = (GLCapabilities) config.getChosenCapabilities();
-    GLProfile glp = glCaps.getGLProfile();
-    long _context = 0;
+  protected abstract void releaseImpl() throws GLException;
 
-    ctp[0] = CTX_IS_ARB_CREATED | CTX_PROFILE_CORE | CTX_OPTION_ANY; // default
-    boolean isBackwardCompatibility = glp.isGL2() || glp.isGL3bc() || glp.isGL4bc() ;
-    int majorMin, minorMin;
-    int majorMax, minorMax;
-    if( glp.isGL4() ) {
-        // ?? majorMax=GLProfile.getMaxMajor(); minorMax=GLProfile.getMaxMinor(majorMax);
-        majorMax=4; minorMax=GLProfile.getMaxMinor(majorMax);
-        majorMin=4; minorMin=0;
-    } else if( glp.isGL3() ) {
-        majorMax=3; minorMax=GLProfile.getMaxMinor(majorMax);
-        majorMin=3; minorMin=1;
-    } else /* if( glp.isGL2() ) */ {
-        majorMax=3; minorMax=0;
-        majorMin=1; minorMin=1; // our minimum desktop OpenGL runtime requirements
+  public void destroy() {
+    if (lock.isHeld()) {
+        // release current context 
+        release();
     }
-    // Try the requested ..
-    if(isBackwardCompatibility) {
-        ctp[0] &= ~CTX_PROFILE_CORE ;
-        ctp[0] |=  CTX_PROFILE_COMPAT ;
-    }
-    _context = createContextARB(share, direct, ctp[0], 
-                               /* max */ majorMax, minorMax,
-                               /* min */ majorMin, minorMin,
-                               /* res */ major, minor);
-
-    if(0==_context && !isBackwardCompatibility) {
-        ctp[0] &= ~CTX_PROFILE_COMPAT ;
-        ctp[0] |=  CTX_PROFILE_CORE ;
-        ctp[0] &= ~CTX_OPTION_ANY ;
-        ctp[0] |=  CTX_OPTION_FORWARD ;
-        _context = createContextARB(share, direct, ctp[0], 
-                                   /* max */ majorMax, minorMax,
-                                   /* min */ majorMin, minorMin,
-                                   /* res */ major, minor);
-       if(0==_context) {
-            // Try a compatible one .. even though not requested .. last resort
-            ctp[0] &= ~CTX_PROFILE_CORE ;
-            ctp[0] |=  CTX_PROFILE_COMPAT ;
-            ctp[0] &= ~CTX_OPTION_FORWARD ;
-            ctp[0] |=  CTX_OPTION_ANY ;
-            _context = createContextARB(share, direct, ctp[0], 
-                                       /* max */ majorMax, minorMax,
-                                       /* min */ majorMin, minorMin,
-                                       /* res */ major, minor);
-       }
+
+    // Must hold the lock around the destroy operation to make sure we
+    // don't destroy the context out from under another thread rendering to it
+    lock.lock();
+    try {
+      /* FIXME: refactor dependence on Java 2D / JOGL bridge
+      if (tracker != null) {
+        // Don't need to do anything for contexts that haven't been
+        // created yet
+        if (isCreated()) {
+          // If we are tracking creation and destruction of server-side
+          // OpenGL objects, we must decrement the reference count of the
+          // GLObjectTracker upon context destruction.
+          //
+          // Note that we can only eagerly delete these server-side
+          // objects if there is another context currrent right now
+          // which shares textures and display lists with this one.
+          tracker.unref(deletedObjectTracker);
+        }
+      }
+      */
+  
+      // Because we don't know how many other contexts we might be
+      // sharing with (and it seems too complicated to implement the
+      // GLObjectTracker's ref/unref scheme for the buffer-related
+      // optimizations), simply clear the cache of known buffers' sizes
+      // when we destroy contexts
+      if (bufferSizeTracker != null) {
+          bufferSizeTracker.clearCachedBufferSizes();
+      }
+
+      if (bufferStateTracker != null) {
+          bufferStateTracker.clearBufferObjectState();
+      }
+  
+      if (glStateTracker != null) {
+          glStateTracker.clearStates(false);
+      }
+  
+      destroyImpl();
+    } finally {
+      lock.unlock();
     }
-    return _context;
   }
 
+  protected abstract void destroyImpl() throws GLException;
+
+  //----------------------------------------------------------------------
+  //
+
+  /**
+   * MakeCurrent functionality, which also issues the creation of the actual OpenGL context.<br>
+   * The complete callgraph for general OpenGL context creation is:<br>
+   * <ul>
+   *    <li> {@link #makeCurrent} <i>GLContextImpl</i>
+   *    <li> {@link #makeCurrentImpl} <i>Platform Implementation</i>
+   *    <li> {@link #create} <i>Platform Implementation</i>
+   *    <li> If <code>ARB_create_context</code> is supported:
+   *    <ul>
+   *        <li> {@link #createContextARB} <i>GLContextImpl</i>
+   *        <li> {@link #createContextARBImpl} <i>Platform Implementation</i>
+   *    </ul>
+   * </ul><br>
+   *
+   * Once at startup, ie triggered by the singleton {@link GLDrawableImpl} constructor,
+   * calling {@link #createContextARB} will query all available OpenGL versions:<br>
+   * <ul>
+   *    <li> <code>FOR ALL GL* DO</code>:
+   *    <ul>
+   *        <li> {@link #createContextARBMapVersionsAvailable}
+   *        <ul>
+   *            <li> {@link #createContextARBVersions}
+   *        </ul>
+   *        <li> {@link #mapVersionAvailable}
+   *    </ul>
+   * </ul><br>
+   *
+   * @see #makeCurrentImpl
+   * @see #create
+   * @see #createContextARB
+   * @see #createContextARBImpl
+   * @see #mapVersionAvailable
+   * @see #destroyContextARBImpl
+   */
   public int makeCurrent() throws GLException {
     // Support calls to makeCurrent() over and over again with
     // different contexts without releasing them
@@ -287,103 +317,206 @@ public abstract class GLContextImpl extends GLContext {
     return res;
   }
 
+  /**
+   * @see #makeCurrent
+   */
   protected abstract int makeCurrentImpl() throws GLException;
 
-  public void release() throws GLException {
-    if (!lock.isHeld()) {
-      throw new GLException("Context not current on current thread");
-    }
-    setCurrent(null);
-    try {
-      releaseImpl();
-    } finally {
-      lock.unlock();
-    }
-  }
+  /**
+   * @see #makeCurrent
+   */
+  protected abstract void create() throws GLException ;
 
-  protected abstract void releaseImpl() throws GLException;
+  /** 
+   * Platform dependent but harmonized implementation of the <code>ARB_create_context</code>
+   * mechanism to create a context.<br>
+   *
+   * This method is called from {@link #createContextARB}.<br>
+   *
+   * The implementation shall verify this context with a 
+   * <code>MakeContextCurrent</code> call.<br>
+   *
+   * @param share the shared context or null
+   * @param direct flag if direct is requested
+   * @param ctxOptionFlags <code>ARB_create_context</code> related, see references below
+   * @param major major number
+   * @param minor minor number
+   * @return the valid context if successfull, or null
+   *
+   * @see #makeCurrent
+   * @see #CTX_PROFILE_COMPAT
+   * @see #CTX_OPTION_FORWARD
+   * @see #CTX_OPTION_DEBUG
+   * @see #makeCurrentImpl
+   * @see #create
+   * @see #createContextARB
+   * @see #createContextARBImpl
+   * @see #destroyContextARBImpl
+   */
+  protected abstract long createContextARBImpl(long share, boolean direct, int ctxOptionFlags, 
+                                               int major, int minor);
 
-  public void destroy() {
-    if (lock.isHeld()) {
-        // release current context 
-        release();
-    }
+  /**
+   * Destroy the context created by {@link #createContextARBImpl}.
+   *
+   * @see #makeCurrent
+   * @see #makeCurrentImpl
+   * @see #create
+   * @see #createContextARB
+   * @see #createContextARBImpl
+   * @see #destroyContextARBImpl
+   */
+  protected abstract void destroyContextARBImpl(long context);
 
-    // Must hold the lock around the destroy operation to make sure we
-    // don't destroy the context out from under another thread rendering to it
-    lock.lock();
-    try {
-      /* FIXME: refactor dependence on Java 2D / JOGL bridge
-      if (tracker != null) {
-        // Don't need to do anything for contexts that haven't been
-        // created yet
-        if (isCreated()) {
-          // If we are tracking creation and destruction of server-side
-          // OpenGL objects, we must decrement the reference count of the
-          // GLObjectTracker upon context destruction.
-          //
-          // Note that we can only eagerly delete these server-side
-          // objects if there is another context currrent right now
-          // which shares textures and display lists with this one.
-          tracker.unref(deletedObjectTracker);
+  /**
+   * Platform independent part of using the <code>ARB_create_context</code>
+   * mechanism to create a context.<br>
+   *
+   * The implementation of {@link #create} shall use this protocol in case the platform supports <code>ARB_create_context</code>.<br>
+   *
+   * This method may call {@link #createContextARBImpl} and {@link #destroyContextARBImpl}. <br>
+   *
+   * This method will also query all available native OpenGL context when first called,<br>
+   * usually the first call should happen with the shared GLContext of the DrawableFactory.<br>
+   *
+   * @see #makeCurrentImpl
+   * @see #create
+   * @see #createContextARB
+   * @see #createContextARBImpl
+   * @see #destroyContextARBImpl
+   */
+  protected long createContextARB(long share, boolean direct,
+                                  int major[], int minor[], int ctp[]) 
+  {
+    AbstractGraphicsConfiguration config = drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
+    GLCapabilities glCaps = (GLCapabilities) config.getChosenCapabilities();
+    GLProfile glp = glCaps.getGLProfile();
+    long _context = 0;
+
+    if( !mappedVersionsAvailableSet ) {
+        synchronized(mappedVersionsAvailableLock) {
+            if( !mappedVersionsAvailableSet ) {
+                createContextARBMapVersionsAvailable(4, false /* compat */); // GL4
+                createContextARBMapVersionsAvailable(4, true /* compat */);  // GL4bc
+                createContextARBMapVersionsAvailable(3, false /* compat */); // GL3
+                createContextARBMapVersionsAvailable(3, true /* compat */);  // GL3bc
+                createContextARBMapVersionsAvailable(2, true /* compat */);  // GL2
+                mappedVersionsAvailableSet=true;
+            }
         }
-      }
-      */
-  
-      // Because we don't know how many other contexts we might be
-      // sharing with (and it seems too complicated to implement the
-      // GLObjectTracker's ref/unref scheme for the buffer-related
-      // optimizations), simply clear the cache of known buffers' sizes
-      // when we destroy contexts
-      if (bufferSizeTracker != null) {
-          bufferSizeTracker.clearCachedBufferSizes();
-      }
+    }
 
-      if (bufferStateTracker != null) {
-          bufferStateTracker.clearBufferObjectState();
-      }
-  
-      if (glStateTracker != null) {
-          glStateTracker.clearStates(false);
-      }
-  
-      destroyImpl();
-    } finally {
-      lock.unlock();
+    int reqMajor;
+    if(glp.isGL4()) {
+        reqMajor=4;
+    } else if (glp.isGL3()) {
+        reqMajor=3;
+    } else /* if (glp.isGL2()) */ {
+        reqMajor=2;
     }
+    boolean compat = glp.isGL2(); // incl GL3bc and GL4bc
+    
+    int key = compose8bit(reqMajor, compat?CTX_PROFILE_COMPAT:CTX_PROFILE_CORE, 0, 0);
+    int val = mappedVersionsAvailable.get( key );
+    long _ctx = 0;
+    if(val>0) {
+        int _major = getComposed8bit(val, 1);
+        int _minor = getComposed8bit(val, 2);
+        int _ctp   = getComposed8bit(val, 3);
+
+        _ctx = createContextARBImpl(share, direct, _ctp, _major, _minor);
+        if(0!=_ctx) {
+            setGLFunctionAvailability(true, _major, _minor, _ctp);
+        }
+    }
+    return _ctx;
   }
 
-  protected abstract void destroyImpl() throws GLException;
+  private void createContextARBMapVersionsAvailable(int reqMajor, boolean compat)
+  {
+    long _context;
+    int ctp = CTX_IS_ARB_CREATED | CTX_PROFILE_CORE | CTX_OPTION_ANY; // default
+    if(compat) {
+        ctp &= ~CTX_PROFILE_CORE ;
+        ctp |=  CTX_PROFILE_COMPAT ;
+    }
 
-  // This is only needed for Mac OS X on-screen contexts
-  protected void update() throws GLException {
+    // FIXME GL3GL4:
+    // To avoid OpenGL implementation bugs and raise compatibility
+    // within JOGL, we map to the proper GL version.
+    // This may change later when GL3 and GL4 drivers become more mature!
+    // Bug: To ensure GL profile compatibility within the JOGL application
+    // Bug: we always try to map against the highest GL version,
+    // Bug: so the use can always cast to a higher one
+    // Bug: int majorMax=GLContext.getMaxMajor(); 
+    // Bug: int minorMax=GLContext.getMaxMinor(majorMax);
+    int majorMax, minorMax;
+    int majorMin, minorMin;
+    int major[] = new int[1];
+    int minor[] = new int[1];
+    if( 4 == reqMajor ) {
+        majorMax=4; minorMax=GLContext.getMaxMinor(majorMax);
+        majorMin=4; minorMin=0;
+    } else if( 3 == reqMajor ) {
+        majorMax=3; minorMax=GLContext.getMaxMinor(majorMax);
+        majorMin=3; minorMin=1;
+    } else /* if( glp.isGL2() ) */ {
+        majorMax=3; minorMax=0;
+        majorMin=1; minorMin=1; // our minimum desktop OpenGL runtime requirements
+    }
+    _context = createContextARBVersions(0, true, ctp, 
+                                        /* max */ majorMax, minorMax,
+                                        /* min */ majorMin, minorMin,
+                                        /* res */ major, minor);
+
+    if(0==_context && !compat) {
+        ctp &= ~CTX_PROFILE_COMPAT ;
+        ctp |=  CTX_PROFILE_CORE ;
+        ctp &= ~CTX_OPTION_ANY ;
+        ctp |=  CTX_OPTION_FORWARD ;
+        _context = createContextARBVersions(0, true, ctp, 
+                                            /* max */ majorMax, minorMax,
+                                            /* min */ majorMin, minorMin,
+                                            /* res */ major, minor);
+       if(0==_context) {
+            // Try a compatible one .. even though not requested .. last resort
+            ctp &= ~CTX_PROFILE_CORE ;
+            ctp |=  CTX_PROFILE_COMPAT ;
+            ctp &= ~CTX_OPTION_FORWARD ;
+            ctp |=  CTX_OPTION_ANY ;
+            _context = createContextARBVersions(0, true, ctp, 
+                                       /* max */ majorMax, minorMax,
+                                       /* min */ majorMin, minorMin,
+                                       /* res */ major, minor);
+       }
+    }
+    if(0!=_context) {
+        destroyContextARBImpl(_context);
+        mapVersionAvailable(reqMajor, compat, major[0], minor[0], ctp);
+    }
   }
 
-  public boolean isSynchronized() {
-    return !lock.getFailFastMode();
-  }
+  private long createContextARBVersions(long share, boolean direct, int ctxOptionFlags, 
+                                        int majorMax, int minorMax, 
+                                        int majorMin, int minorMin, 
+                                        int major[], int minor[]) {
+    major[0]=majorMax;
+    minor[0]=minorMax;
+    long _context=0;
 
-  public void setSynchronized(boolean isSynchronized) {
-    lock.setFailFastMode(!isSynchronized);
-  }
+    while ( 0==_context &&
+            GLContext.isValidGLVersion(major[0], minor[0]) &&
+            ( major[0]>majorMin || major[0]==majorMin && minor[0] >=minorMin ) ) {
 
-  public final GL getGL() {
-    return gl;
-  }
+        _context = createContextARBImpl(share, direct, ctxOptionFlags, major[0], minor[0]);
 
-  public GL setGL(GL gl) {
-    if(DEBUG) {
-        String sgl1 = (null!=this.gl)?this.gl.getClass().toString()+", "+this.gl.toString():new String("<null>");
-        String sgl2 = (null!=gl)?gl.getClass().toString()+", "+gl.toString():new String("<null>");
-        Exception e = new Exception("setGL (OpenGL "+getGLVersion()+"): "+Thread.currentThread()+", "+sgl1+" -> "+sgl2);
-        e.printStackTrace();
+        if(0==_context) {
+            if(!GLContext.decrementGLVersion(major, minor)) break;
+        }
     }
-    this.gl = gl;
-    return gl;
+    return _context;
   }
 
-  public abstract Object getPlatformGLExtensions();
-
   //----------------------------------------------------------------------
   // Managing the actual OpenGL version, usually figured at creation time.
   // As a last resort, the GL_VERSION string may be used ..
@@ -395,7 +528,15 @@ public abstract class GLContextImpl extends GLContext {
    * Otherwise .. don't touch ..
    */
   protected void setContextVersion(int major, int minor, int ctp) {
+      if (0==ctp) {
+        GLException e = new GLException("Invalid GL Version "+major+"."+minor+", ctp "+toHexString(ctp));
+        throw e;
+      }
       if(major>0 || minor>0) {
+          if (!GLContext.isValidGLVersion(major, minor)) {
+            GLException e = new GLException("Invalid GL Version "+major+"."+minor+", ctp "+toHexString(ctp));
+            throw e;
+          }
           ctxMajorVersion = major;
           ctxMinorVersion = minor;
           ctxOptions = ctp;
@@ -408,6 +549,7 @@ public abstract class GLContextImpl extends GLContext {
           if(null==versionStr) {
             throw new GLException("GL_VERSION is NULL: "+this);
           }
+          ctxOptions = ctp;
 
           // Set version
           Version version = new Version(versionStr);
@@ -460,7 +602,10 @@ public abstract class GLContextImpl extends GLContext {
   //
 
   private Object createInstance(GLProfile glp, String suffix, Class[] cstrArgTypes, Object[] cstrArgs) {
-    return NWReflection.createInstance(glp.getGLImplBaseClassName()+suffix, cstrArgTypes, cstrArgs);
+    try {
+        return ReflectionUtil.createInstance(glp.getGLImplBaseClassName()+suffix, cstrArgTypes, cstrArgs);
+    } catch (JogampRuntimeException jre) { /* n/a .. */ }
+    return null;
   }
 
   /** Create the GL for this context. */
@@ -697,10 +842,6 @@ public abstract class GLContextImpl extends GLContext {
     return Thread.currentThread().getName();
   }
 
-  public static String toHexString(long hex) {
-    return "0x" + Long.toHexString(hex);
-  }
-
   //----------------------------------------------------------------------
   // Helpers for buffer object optimizations
   
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableFactoryImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableFactoryImpl.java
index 0cc10b35e..cdf5beb24 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableFactoryImpl.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableFactoryImpl.java
@@ -42,8 +42,8 @@ package com.jogamp.opengl.impl;
 import java.nio.*;
 import javax.media.nativewindow.*;
 import javax.media.opengl.*;
+import com.jogamp.common.util.*;
 import com.jogamp.gluegen.runtime.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 import java.lang.reflect.*;
 
 /** Extends GLDrawableFactory with a few methods for handling
@@ -183,6 +183,9 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
   protected abstract NativeWindow createOffscreenWindow(GLCapabilities capabilities, GLCapabilitiesChooser chooser, 
                                                         int width, int height);
 
+  protected abstract GLDrawableImpl getSharedDrawable();
+  protected abstract GLContextImpl getSharedContext();
+
   protected GLDrawableFactoryImpl() {
     super();
     isValid = true;
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableImpl.java
index 04114a445..2fef8fd80 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableImpl.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableImpl.java
@@ -88,7 +88,7 @@ public abstract class GLDrawableImpl implements GLDrawable {
   protected abstract void swapBuffersImpl();
 
   public static String toHexString(long hex) {
-    return GLContextImpl.toHexString(hex);
+    return "0x" + Long.toHexString(hex);
   }
 
   public GLProfile getGLProfile() {
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLJNILibLoader.java b/src/jogl/classes/com/jogamp/opengl/impl/GLJNILibLoader.java
new file mode 100644
index 000000000..7747b014b
--- /dev/null
+++ b/src/jogl/classes/com/jogamp/opengl/impl/GLJNILibLoader.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * - Redistribution of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * 
+ * - Redistribution in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ * 
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ * 
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.jogamp.opengl.impl;
+
+// FIXME: refactor Java SE dependencies
+//import java.awt.Toolkit;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.HashSet;
+import com.jogamp.common.jvm.JNILibLoaderBase;
+
+public class GLJNILibLoader extends JNILibLoaderBase {
+  public static void loadNEWT() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("newt", nativeOSPreload, true);
+        return null;
+      }
+    });
+  }
+
+  public static void loadGLDesktop() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("jogl_desktop", nativeOSPreload, true);
+        return null;
+      }
+    });
+  }
+
+  public static void loadES2() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("jogl_es2", nativeOSPreload, true);
+        return null;
+      }
+    });
+  }
+
+  public static void loadES1() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("jogl_es1", nativeOSPreload, true);
+        return null;
+      }
+    });
+  }
+
+  public static void loadCgImpl() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        String[] preload = { "nativewindow", "cg", "cgGL" };
+        loadLibrary("jogl_cg", preload, true);
+        return null;
+      }
+    });
+  }
+
+  private static final String[] nativeOSPreload = { "nativewindow_x11" };
+}
+
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/NativeLibLoader.java b/src/jogl/classes/com/jogamp/opengl/impl/NativeLibLoader.java
deleted file mode 100644
index b6024f240..000000000
--- a/src/jogl/classes/com/jogamp/opengl/impl/NativeLibLoader.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- * 
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.jogamp.opengl.impl;
-
-// FIXME: refactor Java SE dependencies
-//import java.awt.Toolkit;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.HashSet;
-import com.jogamp.nativewindow.impl.NativeLibLoaderBase;
-
-public class NativeLibLoader extends NativeLibLoaderBase {
-  public static void loadNEWT() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("newt", nativeOSPreload, true);
-        return null;
-      }
-    });
-  }
-
-  public static void loadGLDesktop() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("jogl_desktop", nativeOSPreload, true);
-        return null;
-      }
-    });
-  }
-
-  public static void loadGLDesktopES12() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("jogl_gl2es12", nativeOSPreload, true);
-        return null;
-      }
-    });
-  }
-
-  public static void loadES2() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("jogl_es2", nativeOSPreload, true);
-        return null;
-      }
-    });
-  }
-
-  public static void loadES1() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("jogl_es1", nativeOSPreload, true);
-        return null;
-      }
-    });
-  }
-
-  public static void loadCgImpl() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        String[] preload = { "nativewindow", "cg", "cgGL" };
-        loadLibrary("jogl_cg", preload, true);
-        return null;
-      }
-    });
-  }
-
-  private static final String[] nativeOSPreload = { "nativewindow_x11" };
-}
-
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/ThreadingImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/ThreadingImpl.java
index b32ed51b6..1a68f38d4 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/ThreadingImpl.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/ThreadingImpl.java
@@ -37,8 +37,9 @@ import java.lang.reflect.InvocationTargetException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import javax.media.nativewindow.NativeWindowFactory;
-import com.jogamp.nativewindow.impl.NWReflection;
 import javax.media.opengl.GLException;
 
 /** Implementation of the {@link javax.media.opengl.Threading} class. */
@@ -71,8 +72,8 @@ public class ThreadingImpl {
                         // while holding the AWT lock. The optimization of
                         // makeCurrent / release calls isn't worth these stability
                         // problems.
-                        hasAWT = NWReflection.isClassAvailable("java.awt.Canvas") &&
-                            NWReflection.isClassAvailable("javax.media.opengl.awt.GLCanvas");
+                        hasAWT = ReflectionUtil.isClassAvailable("java.awt.Canvas") &&
+                                 ReflectionUtil.isClassAvailable("javax.media.opengl.awt.GLCanvas");
 
                         String osType = NativeWindowFactory.getNativeWindowType(false);
                         _isX11 = NativeWindowFactory.TYPE_X11.equals(osType);
@@ -102,8 +103,8 @@ public class ThreadingImpl {
                         Object threadingPluginObj=null;
                         // try to fetch the AWTThreadingPlugin
                         try {
-                            threadingPluginObj = NWReflection.createInstance("com.jogamp.opengl.impl.awt.AWTThreadingPlugin");
-                        } catch (Throwable t) { }
+                            threadingPluginObj = ReflectionUtil.createInstance("com.jogamp.opengl.impl.awt.AWTThreadingPlugin");
+                        } catch (JogampRuntimeException jre) { /* n/a .. */ }
                         return threadingPluginObj;
                     }
                 });
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLContext.java
index 8c3e9a1c4..48f80977c 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLContext.java
@@ -95,11 +95,11 @@ public abstract class EGLContext extends GLContextImpl {
         boolean created = false;
         if (eglContext == 0) {
             create();
+            created = true;
             if (DEBUG) {
                 System.err.println(getThreadName() + ": !!! Created GL context 0x" +
                                    Long.toHexString(eglContext) + " for " + getClass().getName());
             }
-            created = true;
         }
         if (EGL.eglGetCurrentContext() != eglContext) {
             if (!EGL.eglMakeCurrent(((EGLDrawable)drawable).getDisplay(),
@@ -112,7 +112,7 @@ public abstract class EGLContext extends GLContextImpl {
         }
 
         if (created) {
-            setGLFunctionAvailability(false, -1, -1, -1);
+            setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_ES|CTX_PROFILE_CORE|CTX_OPTION_ANY);
             return CONTEXT_CURRENT_NEW;
         }
         return CONTEXT_CURRENT;
@@ -153,6 +153,10 @@ public abstract class EGLContext extends GLContextImpl {
         return 0; // FIXME
     }
 
+    protected void destroyContextARBImpl(long _context) {
+        // FIXME
+    }
+
     protected void create() throws GLException {
         long eglDisplay = ((EGLDrawable)drawable).getDisplay();
         EGLGraphicsConfiguration config = ((EGLDrawable)drawable).getGraphicsConfiguration();
@@ -218,7 +222,7 @@ public abstract class EGLContext extends GLContextImpl {
             throw new GLException("Error making context 0x" +
                                   Long.toHexString(eglContext) + " current: error code " + EGL.eglGetError());
         }
-        setGLFunctionAvailability(true, contextAttrs[1], 0, CTX_IS_ARB_CREATED|CTX_PROFILE_CORE|CTX_OPTION_ANY);
+        setGLFunctionAvailability(true, glProfile.usesNativeGLES2()?2:1, 0, CTX_PROFILE_ES|CTX_PROFILE_CORE|CTX_OPTION_ANY);
     }
 
     public boolean isCreated() {
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDrawableFactory.java
index 5a193b2ff..4fccf22f8 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDrawableFactory.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDrawableFactory.java
@@ -37,8 +37,10 @@ package com.jogamp.opengl.impl.egl;
 
 import javax.media.nativewindow.*;
 import javax.media.opengl.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import com.jogamp.opengl.impl.*;
-import com.jogamp.nativewindow.impl.*;
+import com.jogamp.nativewindow.impl.NullWindow;
 
 public class EGLDrawableFactory extends GLDrawableFactoryImpl {
   
@@ -50,8 +52,8 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
         // Check for other underlying stuff ..
         if(NativeWindowFactory.TYPE_X11.equals(NativeWindowFactory.getNativeWindowType(true))) {
             try {
-                NWReflection.createInstance("com.jogamp.opengl.impl.x11.glx.X11GLXGraphicsConfigurationFactory");
-            } catch (Throwable t) {}
+                ReflectionUtil.createInstance("com.jogamp.opengl.impl.x11.glx.X11GLXGraphicsConfigurationFactory");
+            } catch (JogampRuntimeException jre) { /* n/a .. */ }
         }
     }
 
@@ -59,6 +61,10 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
         super();
     }
 
+   
+    protected final GLDrawableImpl getSharedDrawable() { return null; }
+    protected final GLContextImpl getSharedContext() { return null; }
+
     public GLDrawableImpl createOnscreenDrawable(NativeWindow target) {
         if (target == null) {
           throw new IllegalArgumentException("Null target");
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDynamicLookupHelper.java b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDynamicLookupHelper.java
index 70f0540bf..9e34dc9e9 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDynamicLookupHelper.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLDynamicLookupHelper.java
@@ -64,9 +64,9 @@ public abstract class EGLDynamicLookupHelper implements DynamicLookupHelper {
         EGLDynamicLookupHelper tmp=null;
         try {
             tmp = new EGLES1DynamicLookupHelper();
-        } catch (Throwable t) {
+        } catch (GLException gle) {
             if(DEBUG) {
-                t.printStackTrace();
+                gle.printStackTrace();
             }
         }
         eglES1DynamicLookupHelper = tmp;
@@ -74,9 +74,9 @@ public abstract class EGLDynamicLookupHelper implements DynamicLookupHelper {
         tmp=null;
         try {
             tmp = new EGLES2DynamicLookupHelper();
-        } catch (Throwable t) {
+        } catch (GLException gle) {
             if(DEBUG) {
-                t.printStackTrace();
+                gle.printStackTrace();
             }
         }
         eglES2DynamicLookupHelper = tmp;
@@ -191,9 +191,9 @@ public abstract class EGLDynamicLookupHelper implements DynamicLookupHelper {
         }
 
         if (esProfile==2) {
-            NativeLibLoader.loadES2();
+            GLJNILibLoader.loadES2();
         } else if (esProfile==1) {
-            NativeLibLoader.loadES1();
+            GLJNILibLoader.loadES1();
         } else {
             throw new GLException("Unsupported: ES"+esProfile);
         }
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLExternalContext.java b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLExternalContext.java
index 0adede4ea..5a8454ea7 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLExternalContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/egl/EGLExternalContext.java
@@ -47,7 +47,7 @@ public class EGLExternalContext extends EGLContext {
     public EGLExternalContext(AbstractGraphicsScreen screen) {
         super(null, null);
         GLContextShareSet.contextCreated(this);
-        setGLFunctionAvailability(false, 0, 0, 0);
+        setGLFunctionAvailability(false, 0, 0, CTX_IS_ARB_CREATED|CTX_PROFILE_ES|CTX_PROFILE_CORE|CTX_OPTION_ANY);
         getGLStateTracker().setEnabled(false); // external context usage can't track state in Java
     }
 
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLContext.java
index 9182a71de..ebefaf466 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLContext.java
@@ -88,11 +88,13 @@ public abstract class MacOSXCGLContext extends GLContextImpl
 
   protected Map/*<String, String>*/ getExtensionNameMap() { return null; }
 
-  protected abstract boolean create();
+  protected long createContextARBImpl(long share, boolean direct, int ctp, int major, int minor) {
+      return 0; // FIXME
+  }
 
-    protected long createContextARBImpl(long share, boolean direct, int ctp, int major, int minor) {
-        return 0; // FIXME
-    }
+  protected void destroyContextARBImpl(long _context) {
+      // FIXME
+  }
 
   /**
    * Creates and initializes an appropriate OpenGl nsContext. Should only be
@@ -154,7 +156,7 @@ public abstract class MacOSXCGLContext extends GLContextImpl
     if (!CGL.makeCurrentContext(nsContext)) {
       throw new GLException("Error making nsContext current");
     }
-    setGLFunctionAvailability(true, 0, 0, 0);
+    setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
     GLContextShareSet.contextCreated(this);
     return true;
   }    
@@ -165,13 +167,14 @@ public abstract class MacOSXCGLContext extends GLContextImpl
     }
     boolean created = false;
     if ( 0 == cglContext && 0 == nsContext) {
-      if (!create()) {
+      create();
+      created = 0 != cglContext || 0 != nsContext ;
+      if(!created) {
         return CONTEXT_NOT_CURRENT;
       }
       if (DEBUG) {
         System.err.println("!!! Created OpenGL context " + toHexString(nsContext) + " for " + getClass().getName());
       }
-      created = true;
     }
             
     if ( 0 != cglContext ) {
@@ -185,7 +188,7 @@ public abstract class MacOSXCGLContext extends GLContextImpl
     }
             
     if (created) {
-      setGLFunctionAvailability(false, -1, -1, -1);
+      setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
       return CONTEXT_CURRENT_NEW;
     }
     return CONTEXT_CURRENT;
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLDrawableFactory.java
index 906088642..d10434252 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLDrawableFactory.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLDrawableFactory.java
@@ -43,8 +43,10 @@ import com.jogamp.common.os.DynamicLookupHelper;
 import java.nio.*;
 import javax.media.nativewindow.*;
 import javax.media.opengl.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import com.jogamp.opengl.impl.*;
-import com.jogamp.nativewindow.impl.*;
+import com.jogamp.nativewindow.impl.NullWindow;
 
 public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl implements DynamicLookupHelper {
   public MacOSXCGLDrawableFactory() {
@@ -55,11 +57,14 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl implements D
     new MacOSXCGLGraphicsConfigurationFactory();
 
     try {
-      NWReflection.createInstance("com.jogamp.opengl.impl.macosx.cgl.awt.MacOSXAWTCGLGraphicsConfigurationFactory",
+      ReflectionUtil.createInstance("com.jogamp.opengl.impl.macosx.cgl.awt.MacOSXAWTCGLGraphicsConfigurationFactory",
                                   new Object[] {});
-    } catch (Throwable t) { }
+    } catch (JogampRuntimeException jre) { /* n/a .. */ }
   }
 
+  protected final GLDrawableImpl getSharedDrawable() { return null; }
+  protected final GLContextImpl getSharedContext() { return null; }
+
   public GLDrawableImpl createOnscreenDrawable(NativeWindow target) {
     if (target == null) {
       throw new IllegalArgumentException("Null target");
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXExternalCGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXExternalCGLContext.java
index 248bbb4d6..eba3cf50e 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXExternalCGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXExternalCGLContext.java
@@ -56,7 +56,7 @@ public class MacOSXExternalCGLContext extends MacOSXCGLContext {
     this.cglContext = cglContext;
     this.nsContext = nsContext;
     GLContextShareSet.contextCreated(this);
-    setGLFunctionAvailability(false, 0, 0, 0);
+    setGLFunctionAvailability(false, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
     getGLStateTracker().setEnabled(false); // external context usage can't track state in Java
   }
 
@@ -110,8 +110,7 @@ public class MacOSXExternalCGLContext extends MacOSXCGLContext {
     }
   }
 
-  protected boolean create() {
-    return true;
+  protected void create() {
   }
 
   public int makeCurrent() throws GLException {
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXOnscreenCGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXOnscreenCGLContext.java
index 4c64864fa..c4eaee489 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXOnscreenCGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXOnscreenCGLContext.java
@@ -115,8 +115,8 @@ public class MacOSXOnscreenCGLContext extends MacOSXCGLContext {
     CGL.updateContext(nsContext);
   }
 
-  protected boolean create() {
-    return create(false, false);
+  protected void create() {
+    create(false, false);
   }
 
   public void setOpenGLMode(int mode) {
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
index 5844b8edd..e90672a1d 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
@@ -59,13 +59,14 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
 
     boolean created = false;
     if (nsContext == 0) {
-      if (!create()) {
+      create();
+      created = 0 != nsContext ;
+      if(!created) {
         return CONTEXT_NOT_CURRENT;
       }
       if (DEBUG) {
         System.err.println("!!! Created OpenGL context " + toHexString(nsContext) + " for " + getClass().getName());
       }
-      created = true;
     }
     
     if (!impl.makeCurrent(nsContext)) {
@@ -73,7 +74,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
     }
             
     if (created) {
-      setGLFunctionAvailability(false, -1, -1, -1);
+      setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
 
       // Initialize render-to-texture support if requested
       DefaultGraphicsConfiguration config = (DefaultGraphicsConfiguration) drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
@@ -134,7 +135,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
     return GLPbuffer.APPLE_FLOAT;
   }
 
-  protected boolean create() {
+  protected void create() {
     DefaultGraphicsConfiguration config = (DefaultGraphicsConfiguration) drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
     GLCapabilities capabilities = (GLCapabilities)config.getChosenCapabilities();
     if (capabilities.getPbufferFloatingPointBuffers() &&
@@ -152,9 +153,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
     if (!impl.makeCurrent(nsContext)) {
       throw new GLException("Error making nsContext current");
     }
-    setGLFunctionAvailability(true, 0, 0, 0);
-            
-    return true;
+    setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
   }
 
   //---------------------------------------------------------------------------
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
index 9189b41f3..97a1435bc 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
@@ -73,7 +73,9 @@ public class MacOSXJava2DCGLContext extends MacOSXCGLContext implements Java2DGL
   protected int makeCurrentImpl() throws GLException {
     boolean created = false;
     if (nsContext == 0) {
-      if (!create()) {
+      create();
+      created = 0 != nsContext ;
+      if(!created) {
         return CONTEXT_NOT_CURRENT;
       }
       if (DEBUG) {
@@ -87,13 +89,13 @@ public class MacOSXJava2DCGLContext extends MacOSXCGLContext implements Java2DGL
     }
             
     if (created) {
-      setGLFunctionAvailability(false, -1, -1, -1);
+      setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
       return CONTEXT_CURRENT_NEW;
     }
     return CONTEXT_CURRENT;
   }
 
-  protected boolean create() {
+  protected void create() {
     // Find and configure share context
     MacOSXCGLContext other = (MacOSXCGLContext) GLContextShareSet.getShareContext(this);
     long share = 0;
@@ -119,11 +121,10 @@ public class MacOSXJava2DCGLContext extends MacOSXCGLContext implements Java2DGL
 
     long ctx = Java2D.createOGLContextOnSurface(graphics, share);
     if (ctx == 0) {
-      return false;
+      return;
     }
     // FIXME: think about GLContext sharing
     nsContext = ctx;
-    return true;
   }
 
   protected void releaseImpl() throws GLException {
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsExternalWGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsExternalWGLContext.java
index aae376a6c..e712d8568 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsExternalWGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsExternalWGLContext.java
@@ -56,7 +56,7 @@ public class WindowsExternalWGLContext extends WindowsWGLContext {
       System.err.println(getThreadName() + ": !!! Created external OpenGL context " + toHexString(hglrc) + " for " + this);
     }
     GLContextShareSet.contextCreated(this);
-    setGLFunctionAvailability(false, 0, 0, 0);
+    setGLFunctionAvailability(false, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
     cfg.updateCapabilitiesByWGL(this);
     getGLStateTracker().setEnabled(false); // external context usage can't track state in Java
   }
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
index 95706a7a1..0f1f9813f 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLContext.java
@@ -122,13 +122,18 @@ public class WindowsWGLContext extends GLContextImpl {
 
   protected Map/*<String, String>*/ getExtensionNameMap() { return extensionNameMap; }
 
+  protected void destroyContextARBImpl(long context) {
+    WGL.wglMakeCurrent(0, 0);
+    WGL.wglDeleteContext(context);
+  }
+
   protected long createContextARBImpl(long share, boolean direct, int ctp, int major, int minor) {
     WindowsWGLDrawableFactory factory = (WindowsWGLDrawableFactory)drawable.getFactoryImpl();
     WGLExt wglExt;
     if(null==factory.getSharedContext()) {
         wglExt = getWGLExt();
     } else {
-        wglExt = factory.getSharedContext().getWGLExt();
+        wglExt = ((WindowsWGLContext)factory.getSharedContext()).getWGLExt();
     }
 
     boolean ctBwdCompat = 0 != ( CTX_PROFILE_COMPAT & ctp ) ;
@@ -235,7 +240,7 @@ public class WindowsWGLContext extends GLContextImpl {
         if (!WGL.wglMakeCurrent(drawable.getNativeWindow().getSurfaceHandle(), temp_hglrc)) {
             throw new GLException("Error making temp context current: 0x" + Integer.toHexString(WGL.GetLastError()));
         }
-        setGLFunctionAvailability(true, 0, 0, 0);
+        setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
 
         if( createContextARBTried ||
             !isFunctionAvailable("wglCreateContextAttribsARB") ||
@@ -257,9 +262,6 @@ public class WindowsWGLContext extends GLContextImpl {
     if(0!=hglrc) {
         share = 0; // mark as shared ..
 
-        // need to update the GL func table ..
-        setGLFunctionAvailability(true, major[0], minor[0], ctp[0]);
-
         WGL.wglMakeCurrent(0, 0);
         WGL.wglDeleteContext(temp_hglrc);
 
@@ -302,10 +304,10 @@ public class WindowsWGLContext extends GLContextImpl {
     boolean created = false;
     if (hglrc == 0) {
       create();
+      created = true;
       if (DEBUG) {
         System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
       }
-      created = true;
     }
 
     if (WGL.wglGetCurrentContext() != hglrc) {
@@ -320,7 +322,7 @@ public class WindowsWGLContext extends GLContextImpl {
     }
 
     if (created) {
-      setGLFunctionAvailability(false, -1, -1, -1);
+      setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
 
       WindowsWGLGraphicsConfiguration config = 
         (WindowsWGLGraphicsConfiguration)drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java
index bc99338ab..a4bf89b81 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java
@@ -45,8 +45,9 @@ import java.util.*;
 import javax.media.nativewindow.*;
 import javax.media.nativewindow.windows.*;
 import javax.media.opengl.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import com.jogamp.opengl.impl.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 import com.jogamp.nativewindow.impl.NullWindow;
 
 public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements DynamicLookupHelper {
@@ -66,40 +67,38 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
     // The act of constructing them causes them to be registered
     new WindowsWGLGraphicsConfigurationFactory();
     try {
-      NWReflection.createInstance("com.jogamp.opengl.impl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory",
+      ReflectionUtil.createInstance("com.jogamp.opengl.impl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory",
                                   new Object[] {});
-    } catch (Throwable t) { }
+    } catch (JogampRuntimeException jre) { /* n/a .. */ }
 
     loadOpenGL32Library();
+
+    sharedDrawable = new WindowsDummyWGLDrawable(this, null);
+    WindowsWGLContext ctx  = (WindowsWGLContext) sharedDrawable.createContext(null);
+    ctx.makeCurrent();
+    canCreateGLPbuffer = ctx.getGL().isExtensionAvailable("GL_ARB_pbuffer");
+    ctx.release();
+    sharedContext = ctx;
+    if(null==sharedContext) {
+        throw new GLException("Couldn't init shared resources");
+    }
+    if (DEBUG) {
+      System.err.println("!!! SharedContext: "+sharedContext+", pbuffer supported "+canCreateGLPbuffer);
+    }
   }
 
   WindowsDummyWGLDrawable sharedDrawable=null;
   WindowsWGLContext sharedContext=null;
   boolean canCreateGLPbuffer = false;
 
-  // package private ..
-  final WindowsWGLContext getSharedContext() {
+  protected final GLDrawableImpl getSharedDrawable() {
     validate();
-    return sharedContext; 
+    return sharedDrawable; 
   }
 
-  void initShared() {
-    if(null==sharedDrawable) {
-        sharedDrawable = new WindowsDummyWGLDrawable(this, null);
-        WindowsWGLContext _sharedContext  = (WindowsWGLContext) sharedDrawable.createContext(null);
-        {
-            _sharedContext.makeCurrent();
-            canCreateGLPbuffer = _sharedContext.getGL().isExtensionAvailable("GL_ARB_pbuffer");
-            _sharedContext.release();
-        }
-        _sharedContext = _sharedContext;
-        if (DEBUG) {
-          System.err.println("!!! SharedContext: "+sharedContext+", pbuffer supported "+canCreateGLPbuffer);
-        }
-        if(null==sharedContext) {
-            throw new GLException("Couldn't init shared resources");
-        }
-    }
+  protected final GLContextImpl getSharedContext() {
+    validate();
+    return sharedContext; 
   }
 
   public void shutdown() {
@@ -124,7 +123,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
     return new WindowsOnscreenWGLDrawable(this, target);
   }
 
@@ -133,13 +131,11 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
     return new WindowsOffscreenWGLDrawable(this, target);
   }
 
   public boolean canCreateGLPbuffer(AbstractGraphicsDevice device) {
     validate();
-    initShared(); // setup canCreateGLPBuffer
     return canCreateGLPbuffer;
   }
 
@@ -148,7 +144,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
     final List returnList = new ArrayList();
     final GLDrawableFactory factory = this;
     final WindowsWGLContext _sharedContext = sharedContext;
@@ -180,7 +175,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
 
   protected NativeWindow createOffscreenWindow(GLCapabilities capabilities, GLCapabilitiesChooser chooser, int width, int height) {
     validate();
-    initShared();
     AbstractGraphicsScreen screen = DefaultGraphicsScreen.createDefault();
     NullWindow nw = new NullWindow(WindowsWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationStatic(
                                    capabilities, chooser, screen) );
@@ -190,7 +184,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
  
   public GLContext createExternalGLContext() {
     validate();
-    initShared();
     return WindowsExternalWGLContext.create(this, null);
   }
 
@@ -201,7 +194,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl implements
 
   public GLDrawable createExternalGLDrawable() {
     validate();
-    initShared();
     return WindowsExternalWGLDrawable.create(this, null);
   }
 
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
index c9805fef1..ab3227257 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
@@ -135,7 +135,6 @@ public class WindowsWGLGraphicsConfigurationFactory extends GraphicsConfiguratio
           pfd = WindowsWGLGraphicsConfiguration.createPixelFormatDescriptor();
           // Produce a recommended pixel format selection for the GLCapabilitiesChooser.
           // Use wglChoosePixelFormatARB if user requested multisampling and if we have it available
-          factory.initShared();
           factory.sharedContext.makeCurrent();
           WGLExt wglExt = factory.sharedContext.getWGLExt();
 
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java
index a865e91e8..1f148bead 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java
@@ -42,7 +42,7 @@ import com.jogamp.nativewindow.impl.x11.*;
 
 public class X11DummyGLXDrawable extends X11OnscreenGLXDrawable {
 
-  // private long dummyWindow = 0;
+  private long dummyWindow = 0;
 
   /** 
    * Due to the ATI Bug https://bugzilla.mozilla.org/show_bug.cgi?id=486277,
@@ -62,17 +62,15 @@ public class X11DummyGLXDrawable extends X11OnscreenGLXDrawable {
     X11GraphicsDevice device = (X11GraphicsDevice) screen.getDevice();
     long dpy = device.getHandle();
     int scrn = screen.getIndex();
-    // long visualID = config.getVisualID();
-    // System.out.println("X11DummyGLXDrawable: dpy "+toHexString(dpy)+", scrn "+scrn+", visualID "+toHexString(visualID));
+    long visualID = config.getVisualID();
 
     X11Lib.XLockDisplay(dpy);
     try{
-        nw.setSurfaceHandle( X11Lib.RootWindow(dpy, scrn) );
-        // dummyWindow = X11Lib.CreateDummyWindow(dpy, scrn, visualID);
-        // nw.setSurfaceHandle( dummyWindow );
+        dummyWindow = X11Lib.CreateDummyWindow(dpy, scrn, visualID);
     } finally {
         X11Lib.XUnlockDisplay(dpy);
     }
+    nw.setSurfaceHandle( dummyWindow );
   }
 
   public void setSize(int width, int height) {
@@ -87,11 +85,10 @@ public class X11DummyGLXDrawable extends X11OnscreenGLXDrawable {
   }
 
   public void destroy() {
-    /**
     if(0!=dummyWindow) {
         X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
         long dpy = config.getScreen().getDevice().getHandle();
         X11Lib.DestroyDummyWindow(dpy, dummyWindow);
-    } */
+    }
   }
 }
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXContext.java
index b8f25aad7..139c0deed 100755
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11ExternalGLXContext.java
@@ -55,7 +55,7 @@ public class X11ExternalGLXContext extends X11GLXContext {
     super(drawable, null);
     this.context = context;
     GLContextShareSet.contextCreated(this);
-    setGLFunctionAvailability(false, 0, 0, 0);
+    setGLFunctionAvailability(false, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
     getGLStateTracker().setEnabled(false); // external context usage can't track state in Java
   }
 
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
index f5e291c5f..7d907bf28 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXContext.java
@@ -103,12 +103,31 @@ public abstract class X11GLXContext extends GLContextImpl {
 
   protected Map/*<String, String>*/ getExtensionNameMap() { return extensionNameMap; }
 
-  /** Helper routine which usually just turns around and calls
-   * createContext (except for pbuffers, which use a different context
-   * creation mechanism). Should only be called by {@link
-   * makeCurrentImpl()}.
-   */
-  protected abstract void create();
+  protected boolean glXMakeContextCurrent(long dpy, long writeDrawable, long readDrawable, long ctx) {
+    boolean res = false;
+
+    try {
+        res = GLX.glXMakeContextCurrent(dpy, writeDrawable, readDrawable, ctx);
+    } catch (RuntimeException re) {
+        if(DEBUG) {
+          System.err.println("X11GLXContext.glXMakeContextCurrent failed: "+re+", with "+
+            "dpy "+toHexString(dpy)+
+            ", write "+toHexString(writeDrawable)+
+            ", read "+toHexString(readDrawable)+
+            ", ctx "+toHexString(ctx));
+          re.printStackTrace();
+        }
+    }
+    return res;
+  }
+
+  protected void destroyContextARBImpl(long _context) {
+    X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
+    long display = config.getScreen().getDevice().getHandle();
+
+    glXMakeContextCurrent(display, 0, 0, 0);
+    GLX.glXDestroyContext(display, _context);
+  }
 
   protected long createContextARBImpl(long share, boolean direct, int ctp, int major, int minor) {
     X11GLXDrawableFactory factory = (X11GLXDrawableFactory)drawable.getFactoryImpl();
@@ -119,7 +138,7 @@ public abstract class X11GLXContext extends GLContextImpl {
     if(null==factory.getSharedContext()) {
         glXExt = getGLXExt();
     } else {
-        glXExt = factory.getSharedContext().getGLXExt();
+        glXExt = ((X11GLXContext)factory.getSharedContext()).getGLXExt();
     }
 
     boolean ctBwdCompat = 0 != ( CTX_PROFILE_COMPAT & ctp ) ;
@@ -156,20 +175,27 @@ public abstract class X11GLXContext extends GLContextImpl {
         }
     }
 
-    _context = glXExt.glXCreateContextAttribsARB(display, config.getFBConfig(), share, direct, attribs, 0);
+    try {
+        _context = glXExt.glXCreateContextAttribsARB(display, config.getFBConfig(), share, direct, attribs, 0);
+    } catch (RuntimeException re) {
+        if(DEBUG) {
+          System.err.println("X11GLXContext.createContextARB glXCreateContextAttribsARB failed: "+re+", with "+getGLVersion(null, major, minor, ctp, "@creation"));
+          re.printStackTrace();
+        }
+    }
     if(0==_context) {
         if(DEBUG) {
           System.err.println("X11GLXContext.createContextARB couldn't create "+getGLVersion(null, major, minor, ctp, "@creation"));
         }
     } else {
-        if (!GLX.glXMakeContextCurrent(display,
-                                       drawable.getNativeWindow().getSurfaceHandle(), 
-                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                       _context)) {
+        if (!glXMakeContextCurrent(display,
+                                   drawable.getNativeWindow().getSurfaceHandle(), 
+                                   drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                   _context)) {
             if(DEBUG) {
               System.err.println("X11GLXContext.createContextARB couldn't make current "+getGLVersion(null, major, minor, ctp, "@creation"));
             }
-            GLX.glXMakeContextCurrent(display, 0, 0, 0);
+            glXMakeContextCurrent(display, 0, 0, 0);
             GLX.glXDestroyContext(display, _context);
             _context = 0;
         }
@@ -179,7 +205,7 @@ public abstract class X11GLXContext extends GLContextImpl {
 
   /**
    * Creates and initializes an appropriate OpenGL context. Should only be
-   * called by {@link create()}.
+   * called by {@link #create()}.
    * Note: The direct parameter may be overwritten by the direct state of a shared context.
    */
   protected void createContext(boolean direct) {
@@ -213,13 +239,13 @@ public abstract class X11GLXContext extends GLContextImpl {
         if (context == 0) {
           throw new GLException("Unable to create context(0)");
         }
-        if (!GLX.glXMakeContextCurrent(display,
-                                       drawable.getNativeWindow().getSurfaceHandle(), 
-                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                       context)) {
+        if (!glXMakeContextCurrent(display,
+                                   drawable.getNativeWindow().getSurfaceHandle(), 
+                                   drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                   context)) {
           throw new GLException("Error making temp context(0) current: display "+toHexString(display)+", context "+toHexString(context)+", drawable "+drawable);
         }
-        setGLFunctionAvailability(true, 0, 0, 0); // use GL_VERSION
+        setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY); // use GL_VERSION
         return;
     }
 
@@ -245,21 +271,21 @@ public abstract class X11GLXContext extends GLContextImpl {
         if (temp_context == 0) {
             throw new GLException("Unable to create temp OpenGL context(1)");
         }
-        if (!GLX.glXMakeContextCurrent(display,
-                                       drawable.getNativeWindow().getSurfaceHandle(), 
-                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                       temp_context)) {
+        if (!glXMakeContextCurrent(display,
+                                   drawable.getNativeWindow().getSurfaceHandle(), 
+                                   drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                   temp_context)) {
           throw new GLException("Error making temp context(1) current: display "+toHexString(display)+", context "+toHexString(context)+", drawable "+drawable);
         }
-        setGLFunctionAvailability(true, 0, 0, 0); // use GL_VERSION
+        setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT|CTX_OPTION_ANY); // use GL_VERSION
 
         if( createContextARBTried ||
             !isFunctionAvailable("glXCreateContextAttribsARB") ||
             !isExtensionAvailable("GLX_ARB_create_context") )  {
             if(glp.isGL3()) {
-              GLX.glXMakeContextCurrent(display, 0, 0, 0);
+              glXMakeContextCurrent(display, 0, 0, 0);
               GLX.glXDestroyContext(display, temp_context);
-              throw new GLException("Unable to create OpenGL >= 3.1 context (no GLX_ARB_create_context)");
+              throw new GLException("Unable to create OpenGL >= 3.1 context (failed GLX_ARB_create_context), GLProfile "+glp+", Drawable "+drawable);
             }
 
             // continue with temp context for GL < 3.0
@@ -271,22 +297,19 @@ public abstract class X11GLXContext extends GLContextImpl {
     }
 
     if(0!=context) {
-        // need to update the GL func table ..
-        setGLFunctionAvailability(true, major[0], minor[0], ctp[0]);
-
         if(0!=temp_context) {
-            GLX.glXMakeContextCurrent(display, 0, 0, 0);
+            glXMakeContextCurrent(display, 0, 0, 0);
             GLX.glXDestroyContext(display, temp_context);
-            if (!GLX.glXMakeContextCurrent(display,
-                                           drawable.getNativeWindow().getSurfaceHandle(), 
-                                           drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                           context)) {
+            if (!glXMakeContextCurrent(display,
+                                       drawable.getNativeWindow().getSurfaceHandle(), 
+                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                       context)) {
                 throw new GLException("Cannot make previous verified context current");
             }
         }
     } else {
         if(!glp.isGL2()) {
-          GLX.glXMakeContextCurrent(display, 0, 0, 0);
+          glXMakeContextCurrent(display, 0, 0, 0);
           GLX.glXDestroyContext(display, temp_context);
           throw new GLException("X11GLXContext.createContext failed, but context > GL2 requested "+getGLVersion(null, major[0], minor[0], ctp[0], "@creation")+", ");
         }
@@ -296,11 +319,11 @@ public abstract class X11GLXContext extends GLContextImpl {
 
         // continue with temp context for GL <= 3.0
         context = temp_context;
-        if (!GLX.glXMakeContextCurrent(display,
-                                       drawable.getNativeWindow().getSurfaceHandle(), 
-                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                       context)) {
-          GLX.glXMakeContextCurrent(display, 0, 0, 0);
+        if (!glXMakeContextCurrent(display,
+                                   drawable.getNativeWindow().getSurfaceHandle(), 
+                                   drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                   context)) {
+          glXMakeContextCurrent(display, 0, 0, 0);
           GLX.glXDestroyContext(display, temp_context);
           throw new GLException("Error making context(1) current: display "+toHexString(display)+", context "+toHexString(context)+", drawable "+drawable);
         }
@@ -349,19 +372,19 @@ public abstract class X11GLXContext extends GLContextImpl {
         boolean created = false;
         if (context == 0) {
           create();
+          created = true;
           GLContextShareSet.contextCreated(this);
           if (DEBUG) {
             System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
           }
-          created = true;
         }
 
         if (GLX.glXGetCurrentContext() != context) {
             
-            if (!GLX.glXMakeContextCurrent(dpy,
-                                           drawable.getNativeWindow().getSurfaceHandle(), 
-                                           drawableRead.getNativeWindow().getSurfaceHandle(), 
-                                           context)) {
+            if (!glXMakeContextCurrent(dpy,
+                                       drawable.getNativeWindow().getSurfaceHandle(), 
+                                       drawableRead.getNativeWindow().getSurfaceHandle(), 
+                                       context)) {
               throw new GLException("Error making context current: "+this);
             }
             if (DEBUG && (VERBOSE || created)) {
@@ -374,7 +397,7 @@ public abstract class X11GLXContext extends GLContextImpl {
         }
 
         if (created) {
-          setGLFunctionAvailability(false, -1, -1, -1);
+          setGLFunctionAvailability(false, -1, -1, CTX_PROFILE_COMPAT|CTX_OPTION_ANY);
           return CONTEXT_CURRENT_NEW;
         }
         return CONTEXT_CURRENT;
@@ -386,7 +409,7 @@ public abstract class X11GLXContext extends GLContextImpl {
   protected void releaseImplAfterLock() throws GLException {
     getDrawableImpl().getFactoryImpl().lockToolkit();
     try {
-        if (!GLX.glXMakeContextCurrent(drawable.getNativeWindow().getDisplayHandle(), 0, 0, 0)) {
+        if (!glXMakeContextCurrent(drawable.getNativeWindow().getDisplayHandle(), 0, 0, 0)) {
             throw new GLException("Error freeing OpenGL context");
         }
     } finally {
@@ -494,6 +517,10 @@ public abstract class X11GLXContext extends GLContextImpl {
   private int hasSwapIntervalSGI = 0;
 
   protected void setSwapIntervalImpl(int interval) {
+    X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
+    GLCapabilities glCaps = (GLCapabilities) config.getChosenCapabilities();
+    if(!glCaps.isOnscreen()) return;
+
     getDrawableImpl().getFactoryImpl().lockToolkit();
     try {
       GLXExt glXExt = getGLXExt();
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java
index 0d74bb791..f331ad2a2 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java
@@ -43,8 +43,9 @@ import javax.media.nativewindow.x11.*;
 import javax.media.opengl.*;
 import com.jogamp.gluegen.runtime.opengl.*;
 import com.jogamp.opengl.impl.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import com.jogamp.nativewindow.impl.NullWindow;
-import com.jogamp.nativewindow.impl.NWReflection;
 import com.jogamp.nativewindow.impl.x11.*;
 
 public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements DynamicLookupHelper {
@@ -58,9 +59,9 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
     // The act of constructing them causes them to be registered
     new X11GLXGraphicsConfigurationFactory();
     try {
-      NWReflection.createInstance("com.jogamp.opengl.impl.x11.glx.awt.X11AWTGLXGraphicsConfigurationFactory",
+      ReflectionUtil.createInstance("com.jogamp.opengl.impl.x11.glx.awt.X11AWTGLXGraphicsConfigurationFactory",
                                   new Object[] {});
-    } catch (Throwable t) { }
+    } catch (JogampRuntimeException jre) { /* n/a .. */ }
 
     X11GraphicsDevice sharedDevice = new X11GraphicsDevice(X11Util.createThreadLocalDisplay(null));
     vendorName = GLXUtil.getVendorName(sharedDevice.getHandle());
@@ -70,9 +71,20 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
         X11Util.markGlobalDisplayUndeletable(sharedDevice.getHandle()); // ATI hack ..
     }
     sharedScreen = new X11GraphicsScreen(sharedDevice, 0);
+    X11Lib.XLockDisplay(sharedScreen.getDevice().getHandle());
+    sharedDrawable = new X11DummyGLXDrawable(sharedScreen, this, null);
+    X11GLXContext ctx  = (X11GLXContext) sharedDrawable.createContext(null);
+    ctx.makeCurrent();
+    ctx.release();
+    sharedContext = ctx;
+    X11Lib.XUnlockDisplay(sharedScreen.getDevice().getHandle());
+    if(null==sharedContext) {
+        throw new GLException("Couldn't init shared resources");
+    }
     if (DEBUG) {
       System.err.println("!!! Vendor: "+vendorName+", ATI: "+isVendorATI+", NV: "+isVendorNVIDIA);
       System.err.println("!!! SharedScreen: "+sharedScreen);
+      System.err.println("!!! SharedContext: "+sharedContext);
     }
   }
 
@@ -88,30 +100,14 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
   private X11DummyGLXDrawable sharedDrawable=null;
   private X11GLXContext sharedContext=null;
 
-  // package private ..
-  final X11GLXContext getSharedContext() {
+  protected final GLDrawableImpl getSharedDrawable() {
     validate();
-    return sharedContext; 
+    return sharedDrawable; 
   }
 
-  private void initShared() {
-    if(null==sharedDrawable) {
-        X11Lib.XLockDisplay(sharedScreen.getDevice().getHandle());
-        sharedDrawable = new X11DummyGLXDrawable(sharedScreen, this, null);
-        X11GLXContext _sharedContext  = (X11GLXContext) sharedDrawable.createContext(null);
-        {
-            _sharedContext.makeCurrent();
-            _sharedContext.release();
-        }
-        sharedContext = _sharedContext;
-        X11Lib.XUnlockDisplay(sharedScreen.getDevice().getHandle());
-        if (DEBUG) {
-          System.err.println("!!! SharedContext: "+sharedContext);
-        }
-        if(null==sharedContext) {
-            throw new GLException("Couldn't init shared resources");
-        }
-    }
+  protected final GLContextImpl getSharedContext() {
+    validate();
+    return sharedContext; 
   }
 
   public void shutdown() {
@@ -145,7 +141,6 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
     if( isVendorATI() ) {
         X11Util.markGlobalDisplayUndeletable(target.getDisplayHandle()); // ATI hack ..
     }
@@ -157,11 +152,9 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
     if( isVendorATI() ) {
         X11Util.markGlobalDisplayUndeletable(target.getDisplayHandle()); // ATI hack ..
     }
-    initShared();
     return new X11OffscreenGLXDrawable(this, target);
   }
 
@@ -203,7 +196,6 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
     if (target == null) {
       throw new IllegalArgumentException("Null target");
     }
-    initShared();
 
     GLDrawableImpl pbufferDrawable;
 
@@ -234,7 +226,6 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
 
   protected NativeWindow createOffscreenWindow(GLCapabilities capabilities, GLCapabilitiesChooser chooser, int width, int height) {
     validate();
-    initShared();
     X11Lib.XLockDisplay(sharedScreen.getDevice().getHandle());
     NullWindow nw = new NullWindow(X11GLXGraphicsConfigurationFactory.chooseGraphicsConfigurationStatic(capabilities, chooser, sharedScreen));
     X11Lib.XUnlockDisplay(sharedScreen.getDevice().getHandle());
@@ -244,19 +235,16 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl implements Dyna
 
   public GLContext createExternalGLContext() {
     validate();
-    initShared();
     return X11ExternalGLXContext.create(this, null);
   }
 
   public boolean canCreateExternalGLDrawable(AbstractGraphicsDevice device) {
     validate();
-    initShared();
     return canCreateGLPbuffer(device);
   }
 
   public GLDrawable createExternalGLDrawable() {
     validate();
-    initShared();
     return X11ExternalGLXDrawable.create(this, null);
   }
 
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
index e0993abc3..1b70adf6b 100644
--- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
+++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11PbufferGLXContext.java
@@ -68,33 +68,6 @@ public class X11PbufferGLXContext extends X11GLXContext {
   }
 
   protected void create() {
-    if (DEBUG) {
-      System.err.println("Creating context for pbuffer " + drawable.getWidth() +
-                         " x " + drawable.getHeight());
-    }
-
-    // Create a gl context for the p-buffer.
-    X11GLXContext other = (X11GLXContext) GLContextShareSet.getShareContext(this);
-    long share = 0;
-    if (other != null) {
-      share = other.getContext();
-      if (share == 0) {
-        throw new GLException("GLContextShareSet returned an invalid OpenGL context");
-      }
-    }
-    X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)
-        getGLDrawable().getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
-
-    context = GLX.glXCreateNewContext(drawable.getNativeWindow().getDisplayHandle(), 
-                                      config.getFBConfig(), GLX.GLX_RGBA_TYPE, share, true);
-    if (context == 0) {
-      throw new GLException("pbuffer creation error: glXCreateNewContext() failed");
-    }
-    GLContextShareSet.contextCreated(this);
-
-    if (DEBUG) {
-      System.err.println("Created context for pbuffer " + drawable.getWidth() +
-                         " x " + drawable.getHeight());
-    }
+    createContext(true);
   }
 }
diff --git a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
index ad230a415..04b994198 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/ImmModeSink.java
@@ -1,9 +1,9 @@
 
 package com.jogamp.opengl.util;
 
+import com.jogamp.common.util.*;
 import javax.media.opengl.*;
 import javax.media.opengl.fixedfunc.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 import java.nio.*;
 import java.util.Iterator;
 import java.util.ArrayList;
@@ -341,9 +341,9 @@ public class ImmModeSink {
             } else {
                 Class clazz = indices.getClass();
                 int type=-1;
-                if(NWReflection.instanceOf(clazz, ByteBuffer.class.getName())) {
+                if(ReflectionUtil.instanceOf(clazz, ByteBuffer.class.getName())) {
                     type =  GL.GL_UNSIGNED_BYTE;
-                } else if(NWReflection.instanceOf(clazz, ShortBuffer.class.getName())) {
+                } else if(ReflectionUtil.instanceOf(clazz, ShortBuffer.class.getName())) {
                     type =  GL.GL_UNSIGNED_SHORT;
                 }
                 if(0>type) {
diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java
index f00357bfb..7ec4ac50e 100644
--- a/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java
+++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java
@@ -28,7 +28,7 @@ public class FixedFuncUtil {
             gl.getContext().setGL(impl);
             return impl;
         }
-        throw new GLException("GL Object is neither GL2ES1 nor GL2ES2");
+        throw new GLException("GL Object is neither GL2ES1 nor GL2ES2: "+gl.getContext());
     }
 
     /**
diff --git a/src/jogl/classes/javax/media/opengl/GL4.java b/src/jogl/classes/javax/media/opengl/GL4.java
deleted file mode 100644
index 29a316333..000000000
--- a/src/jogl/classes/javax/media/opengl/GL4.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package javax.media.opengl;
-
-public interface GL4 extends GLBase {
-}
-
diff --git a/src/jogl/classes/javax/media/opengl/GL4bc.java b/src/jogl/classes/javax/media/opengl/GL4bc.java
deleted file mode 100644
index be1131e91..000000000
--- a/src/jogl/classes/javax/media/opengl/GL4bc.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package javax.media.opengl;
-
-public interface GL4bc extends GL4 {
-}
-
diff --git a/src/jogl/classes/javax/media/opengl/GLContext.java b/src/jogl/classes/javax/media/opengl/GLContext.java
index 833ebf192..e5b499af9 100644
--- a/src/jogl/classes/javax/media/opengl/GLContext.java
+++ b/src/jogl/classes/javax/media/opengl/GLContext.java
@@ -40,6 +40,7 @@
 package javax.media.opengl;
 
 import java.util.HashMap;
+import com.jogamp.common.util.IntIntHashMap;
 
 /** Abstraction for an OpenGL rendering context. In order to perform
     OpenGL rendering, a context must be "made current" on the current
@@ -261,6 +262,12 @@ public abstract class GLContext {
     StringBuffer sb = new StringBuffer();
     sb.append(getClass().getName());
     sb.append(" [OpenGL ");
+    sb.append(getGLVersionMajor());
+    sb.append(".");
+    sb.append(getGLVersionMinor());
+    sb.append(", options 0x");
+    sb.append(Integer.toHexString(ctxOptions));
+    sb.append(", ");
     sb.append(getGLVersion());
     sb.append(", ");
     sb.append(getGL());
@@ -284,7 +291,7 @@ public abstract class GLContext {
   public abstract String getPlatformExtensionsString();
 
   public final int getGLVersionMajor() { return ctxMajorVersion; }
-  public final int getGLVersionMinor() { return ctxMajorVersion; }
+  public final int getGLVersionMinor() { return ctxMinorVersion; }
   public final boolean isGLCompatibilityProfile() { return ( 0 != ( CTX_PROFILE_COMPAT & ctxOptions ) ); }
   public final boolean isGLForwardCompatible()    { return ( 0 != ( CTX_OPTION_FORWARD & ctxOptions ) ); }
   public final boolean isCreatedWithARBMethod()   { return ( 0 != ( CTX_IS_ARB_CREATED & ctxOptions ) ); }
@@ -342,9 +349,181 @@ public abstract class GLContext {
   /** <code>ARB_create_context</code> related: core profile */
   protected static final int CTX_PROFILE_CORE   = 1 << 2;
   /** <code>ARB_create_context</code> related: flag forward compatible */
-  protected static final int CTX_OPTION_FORWARD = 1 << 3;
+  protected static final int CTX_PROFILE_ES     = 1 << 3;
+  /** <code>ARB_create_context</code> related: flag forward compatible */
+  protected static final int CTX_OPTION_FORWARD = 1 << 4;
   /** <code>ARB_create_context</code> related: not flag forward compatible */
-  protected static final int CTX_OPTION_ANY     = 1 << 4;
+  protected static final int CTX_OPTION_ANY     = 1 << 5;
   /** <code>ARB_create_context</code> related: flag debug */
-  protected static final int CTX_OPTION_DEBUG   = 1 << 5;
+  protected static final int CTX_OPTION_DEBUG   = 1 << 6;
+
+  
+  public final boolean isGL4bc() {
+      return ctxMajorVersion>=4 && CTX_PROFILE_COMPAT==(ctxOptions & (CTX_PROFILE_COMPAT|CTX_PROFILE_ES));
+  }
+
+  public final boolean isGL4() {
+      return ctxMajorVersion>=4 && 0==(ctxOptions & (CTX_PROFILE_ES));
+  }
+
+  public final boolean isGL3bc() {
+      return ctxMajorVersion>=3 && CTX_PROFILE_COMPAT==(ctxOptions & (CTX_PROFILE_COMPAT|CTX_PROFILE_ES));
+  }
+
+  public final boolean isGL3() {
+      return ctxMajorVersion>=3 && 0==(ctxOptions & (CTX_PROFILE_ES));
+  }
+
+  public final boolean isGL2() {
+      return ctxMajorVersion>=1 && CTX_PROFILE_COMPAT==(ctxOptions & (CTX_PROFILE_COMPAT|CTX_PROFILE_ES));
+  }
+
+  public final boolean isGLES1() {
+      return ctxMajorVersion==1 && CTX_PROFILE_ES==(ctxOptions & CTX_PROFILE_ES);
+  }
+
+  public final boolean isGLES2() {
+      return ctxMajorVersion==2 && CTX_PROFILE_ES==(ctxOptions & CTX_PROFILE_ES);
+  }
+
+  public final boolean isGLES() {
+      return CTX_PROFILE_ES==(ctxOptions & CTX_PROFILE_ES);
+  }
+
+  public final boolean isGL2ES1() {
+      return isGL2() || isGLES1() ;
+  }
+
+  public final boolean isGL2ES2() {
+      return isGL2() || isGL3() || isGLES2() ;
+  }
+
+  public final boolean isGL2GL3() {
+      return isGL2() || isGL3();
+  }
+
+  public final boolean hasGLSL() {
+      return isGL2ES2() ;
+  }
+
+  public static final int GL_VERSIONS[][] = {
+      /* 0.*/ { -1 },
+      /* 1.*/ { 0, 1, 2, 3, 4, 5 },
+      /* 2.*/ { 0, 1 },
+      /* 3.*/ { 0, 1, 2, 3 },
+      /* 4.*/ { 0 } };
+
+  public static final int getMaxMajor() {
+      return GL_VERSIONS.length-1;
+  }
+
+  public static final int getMaxMinor(int major) {
+      if(1>major || major>=GL_VERSIONS.length) return -1;
+      return GL_VERSIONS[major].length-1;
+  }
+
+  public static final boolean isValidGLVersion(int major, int minor) {
+      if(1>major || major>=GL_VERSIONS.length) return false;
+      if(0>minor || minor>=GL_VERSIONS[major].length) return false;
+      return true;
+  }
+
+  public static final boolean decrementGLVersion(int major[], int minor[]) {
+      if(null==major || major.length<1 ||null==minor || minor.length<1) {
+          throw new GLException("invalid array arguments");
+      }
+      int m = major[0];
+      int n = minor[0];
+      if(!isValidGLVersion(m, n)) return false;
+
+      // decrement ..
+      n -= 1;
+      if(n < 0) {
+          m -= 1;
+          n = GL_VERSIONS[m].length-1;
+      }
+      if(!isValidGLVersion(m, n)) return false;
+      major[0]=m;
+      minor[0]=n;
+
+      return true;
+  }
+
+  public static final boolean isGLVersionAvailable(int major, boolean compatibility) {
+      int key = compose8bit(major, compatibility?CTX_PROFILE_COMPAT:CTX_PROFILE_CORE, 0, 0);
+      int val = mappedVersionsAvailable.get( key );
+      return val>0;
+  }
+  public static final boolean isGL4bcAvailable() { return isGLVersionAvailable(4, true); }
+  public static final boolean isGL4Available() { return isGLVersionAvailable(4, false); }
+  public static final boolean isGL3bcAvailable() { return isGLVersionAvailable(3, true); }
+  public static final boolean isGL3Available() { return isGLVersionAvailable(3, false); }
+  public static final boolean isGL2Available() { return isGLVersionAvailable(2, true); }
+
+  protected static final IntIntHashMap mappedVersionsAvailable;
+  protected static volatile boolean mappedVersionsAvailableSet;
+  protected static Object mappedVersionsAvailableLock;
+
+  static {
+      mappedVersionsAvailableLock = new Object();
+      mappedVersionsAvailableSet = false;
+      mappedVersionsAvailable = new IntIntHashMap();
+      mappedVersionsAvailable.setKeyNotFoundValue(-1);
+  }
+
+  /**
+   * Called by {@link GLContextImpl#createContextARBMapVersionsAvailable} not intendet to be used by 
+   * implementations. However, if {@link #createContextARB} is not being used within the 
+   * {@link GLDrawableImpl} constructor, GLProfile has to map the available versions.
+   *
+   * @see #createContextARBMapVersionsAvailable
+   */
+  protected static void mapVersionAvailable(int reqMajor, boolean reqCompat, int resMajor, int resMinor, int resCtp)
+  {
+    int key = compose8bit(reqMajor, reqCompat?CTX_PROFILE_COMPAT:CTX_PROFILE_CORE, 0, 0);
+    int val = compose8bit(resMajor, resMinor, resCtp, 0);
+    mappedVersionsAvailable.put( key, val );
+  }
+
+  protected static int compose8bit(int one, int two, int three, int four) {
+    return  ( ( one   & 0x000000FF ) << 24 ) |
+            ( ( two   & 0x000000FF ) << 16 ) |
+            ( ( three & 0x000000FF ) <<  8 ) |
+            ( ( four  & 0x000000FF )       ) ;
+  }
+
+  protected static int getComposed8bit(int bits32, int which ) {
+    switch (which) {
+        case 1: return ( bits32 & 0xFF000000 ) >> 24 ;
+        case 2: return ( bits32 & 0x00FF0000 ) >> 16 ;
+        case 3: return ( bits32 & 0x0000FF00 ) >>  8 ;
+        case 4: return ( bits32 & 0xFF0000FF )       ;
+    }
+    throw new GLException("argument which out of range: "+which);
+  }
+
+  protected static String composed8BitToString(int bits32, boolean hex1, boolean hex2, boolean hex3, boolean hex4) {
+    int a = getComposed8bit(bits32, 1);
+    int b = getComposed8bit(bits32, 2);
+    int c = getComposed8bit(bits32, 3);
+    int d = getComposed8bit(bits32, 4);
+    return "["+toString(a, hex1)+", "+toString(b, hex2)+", "+toString(c, hex3)+", "+toString(d, hex4)+"]";
+  }
+
+  protected static String toString(int val, boolean hex) {
+    if(hex) {
+        return "0x" + Integer.toHexString(val);
+    }
+    return String.valueOf(val);
+  }
+
+  protected static String toHexString(int hex) {
+    return "0x" + Integer.toHexString(hex);
+  }
+
+  protected static String toHexString(long hex) {
+    return "0x" + Long.toHexString(hex);
+  }
+
 }
+
diff --git a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
index 80c2c10e2..b02bffb61 100644
--- a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
+++ b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
@@ -42,8 +42,9 @@ package javax.media.opengl;
 import javax.media.nativewindow.*;
 
 import java.security.*;
+import com.jogamp.common.JogampRuntimeException;
+import com.jogamp.common.util.*;
 import com.jogamp.opengl.impl.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 
 /** <P> Provides a virtual machine- and operating system-independent
     mechanism for creating {@link GLDrawable}s. </P>
@@ -96,51 +97,50 @@ public abstract class GLDrawableFactory {
   static {
     GLDrawableFactory tmp = null;
     try {
-        tmp = (GLDrawableFactory) NWReflection.createInstance("com.jogamp.opengl.impl.egl.EGLDrawableFactory");
-    } catch (Throwable t) {
+        tmp = (GLDrawableFactory) ReflectionUtil.createInstance("com.jogamp.opengl.impl.egl.EGLDrawableFactory");
+    } catch (JogampRuntimeException jre) {
         if (GLProfile.DEBUG) {
             System.err.println("GLDrawableFactory.static - EGLDrawableFactory - not available");
-            t.printStackTrace();
+            jre.printStackTrace();
         }
     }
     eglFactory = tmp;
 
     nativeOSType = NativeWindowFactory.getNativeWindowType(true);
 
-    String factoryClassName = null;
     tmp = null;
-    try {
-        factoryClassName = Debug.getProperty("jogl.gldrawablefactory.class.name", true, AccessController.getContext());
-        if (null == factoryClassName) {
-            if ( nativeOSType.equals(NativeWindowFactory.TYPE_X11) ) {
-              factoryClassName = "com.jogamp.opengl.impl.x11.glx.X11GLXDrawableFactory";
-            } else if ( nativeOSType.equals(NativeWindowFactory.TYPE_WINDOWS) ) {
-              factoryClassName = "com.jogamp.opengl.impl.windows.wgl.WindowsWGLDrawableFactory";
-            } else if ( nativeOSType.equals(NativeWindowFactory.TYPE_MACOSX) ) {
-                if(NWReflection.isClassAvailable(macosxFactoryClassNameAWTCGL)) {
-                    factoryClassName = macosxFactoryClassNameAWTCGL;
-                } else {
-                    factoryClassName = macosxFactoryClassNameCGL;
-                }
+    String factoryClassName = Debug.getProperty("jogl.gldrawablefactory.class.name", true, AccessController.getContext());
+    if (null == factoryClassName) {
+        if ( nativeOSType.equals(NativeWindowFactory.TYPE_X11) ) {
+          factoryClassName = "com.jogamp.opengl.impl.x11.glx.X11GLXDrawableFactory";
+        } else if ( nativeOSType.equals(NativeWindowFactory.TYPE_WINDOWS) ) {
+          factoryClassName = "com.jogamp.opengl.impl.windows.wgl.WindowsWGLDrawableFactory";
+        } else if ( nativeOSType.equals(NativeWindowFactory.TYPE_MACOSX) ) {
+            if(ReflectionUtil.isClassAvailable(macosxFactoryClassNameAWTCGL)) {
+                factoryClassName = macosxFactoryClassNameAWTCGL;
             } else {
-              // may use egl*Factory ..
-              if (GLProfile.DEBUG) {
-                  System.err.println("GLDrawableFactory.static - No native OS Factory for: "+nativeOSType+"; May use EGLDrawableFactory, if available." );
-              }
+                factoryClassName = macosxFactoryClassNameCGL;
             }
-        }
-        if (null != factoryClassName) {
+        } else {
+          // may use egl*Factory ..
           if (GLProfile.DEBUG) {
-              System.err.println("GLDrawableFactory.static - Native OS Factory for: "+nativeOSType+": "+factoryClassName);
+              System.err.println("GLDrawableFactory.static - No native OS Factory for: "+nativeOSType+"; May use EGLDrawableFactory, if available." );
           }
-          tmp = (GLDrawableFactory) NWReflection.createInstance(factoryClassName);
-        }
-    } catch (Throwable t) {
-        if (GLProfile.DEBUG) {
-            System.err.println("GLDrawableFactory.static - Native Platform: "+nativeOSType+" - not available: "+factoryClassName);
-            t.printStackTrace();
         }
     }
+    if (null != factoryClassName) {
+      if (GLProfile.DEBUG) {
+          System.err.println("GLDrawableFactory.static - Native OS Factory for: "+nativeOSType+": "+factoryClassName);
+      }
+      try {
+          tmp = (GLDrawableFactory) ReflectionUtil.createInstance(factoryClassName);
+      } catch (JogampRuntimeException jre) { 
+          if (GLProfile.DEBUG) {
+              System.err.println("GLDrawableFactory.static - Native Platform: "+nativeOSType+" - not available: "+factoryClassName);
+              jre.printStackTrace();
+          }
+      }
+    }
     nativeOSFactory = tmp;
   }
 
diff --git a/src/jogl/classes/javax/media/opengl/GLProfile.java b/src/jogl/classes/javax/media/opengl/GLProfile.java
index e1fc9f53f..9e3a532e6 100644
--- a/src/jogl/classes/javax/media/opengl/GLProfile.java
+++ b/src/jogl/classes/javax/media/opengl/GLProfile.java
@@ -36,12 +36,13 @@
 
 package javax.media.opengl;
 
+import com.jogamp.common.util.*;
 import com.jogamp.opengl.impl.DRIHack;
 import com.jogamp.opengl.impl.Debug;
-import com.jogamp.opengl.impl.NativeLibLoader;
-import com.jogamp.nativewindow.impl.NWReflection;
-import com.jogamp.nativewindow.impl.jvm.JVMUtil;
+import com.jogamp.opengl.impl.GLJNILibLoader;
+import com.jogamp.common.jvm.JVMUtil;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import javax.media.opengl.fixedfunc.GLPointerFunc;
@@ -58,6 +59,45 @@ import javax.media.opengl.fixedfunc.GLPointerFunc;
 public class GLProfile implements Cloneable {
     public static final boolean DEBUG = Debug.debug("GLProfile");
 
+    //
+    // Query platform available OpenGL implementation
+    //
+
+    public static final boolean isGL4bcAvailable() { return hasGL4bcImpl; }
+    public static final boolean isGL4Available() { return hasGL4Impl; }
+    public static final boolean isGL3bcAvailable() { return hasGL3bcImpl; }
+    public static final boolean isGL3Available() { return hasGL3Impl; }
+    public static final boolean isGL2Available() { return hasGL2Impl; }
+    public static final boolean isGLES2Available() { return hasGLES2Impl; }
+    public static final boolean isGLES1Available() { return hasGLES1Impl; }
+    public static final String glAvailabilityToString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append("GLAvailability[Native[GL4bc ");
+        sb.append(hasGL4bcImpl);
+        sb.append(", GL4 ");
+        sb.append(hasGL4Impl);
+        sb.append(", GL3bc ");
+        sb.append(hasGL3bcImpl);
+        sb.append(", GL3 ");
+        sb.append(hasGL3Impl);
+        sb.append(", GL2 ");
+        sb.append(hasGL2Impl);
+        sb.append(", GLES1 ");
+        sb.append(hasGLES1Impl);
+        sb.append(", GLES2 ");
+        sb.append(hasGLES2Impl);
+        sb.append("], Profiles[");
+        for(Iterator i=mappedProfiles.values().iterator(); i.hasNext(); ) {
+            sb.append(((GLProfile)i.next()).toString());
+            sb.append(", ");
+        }
+        sb.append(", default ");
+        sb.append(defaultGLProfile);
+        sb.append("]]");
+
+        return sb.toString();
+    }
+
     //
     // Public (user-visible) profiles
     //
@@ -95,22 +135,92 @@ public class GLProfile implements Cloneable {
     public static final String GL2GL3 = "GL2GL3";
 
     /** 
-     * All GL Profiles in the order of default detection: GL2, GL2ES2, GL2ES1, GLES2, GLES1, GL2GL3, GL3
+     * All GL Profiles in the order of default detection.
+     * Desktop compatibility profiles (the one with fixed function pipeline) comes first.
+     *
+     * FIXME GL3GL4: Due to GL3 and GL4 implementation bugs, we still choose GL2 first, if available!
+     *
+     * <ul>
+     *  <li> GL2
+     *  <li> GL3bc
+     *  <li> GL4bc
+     *  <li> GL2GL3
+     *  <li> GL3
+     *  <li> GL4
+     *  <li> GL2ES2
+     *  <li> GLES2
+     *  <li> GL2ES1
+     *  <li> GLES1
+     * </ul>
+     *
      */
-    public static final String[] GL_PROFILE_LIST_ALL = new String[] { GL2, GL2ES2, GL2ES1, GLES2, GLES1, GL2GL3, GL4bc, GL3bc, GL4, GL3  };
+    public static final String[] GL_PROFILE_LIST_ALL = new String[] { GL2, GL3bc, GL4bc, GL2GL3, GL3, GL4, GL2ES2, GLES2, GL2ES1, GLES1 };
 
     /**
-     * All GL2ES2 Profiles in the order of default detection: GL2ES2, GL2, GLES2, GL3
+     * Order of maximum fixed function profiles
+     *
+     * <ul>
+     *  <li> GL4bc
+     *  <li> GL3bc
+     *  <li> GL2
+     *  <li> GL2ES1
+     *  <li> GLES1
+     * </ul>
+     *
+     */
+    public static final String[] GL_PROFILE_LIST_MAX_FIXEDFUNC = new String[] { GL4bc, GL3bc, GL2, GL2ES1, GLES1 };
+
+    /**
+     * Order of maximum programmable shader profiles
+     *
+     * <ul>
+     *  <li> GL4
+     *  <li> GL4bc
+     *  <li> GL3
+     *  <li> GL3bc
+     *  <li> GL2
+     *  <li> GL2ES2
+     *  <li> GLES2
+     * </ul>
+     *
+     */
+    public static final String[] GL_PROFILE_LIST_MAX_PROGSHADER   = new String[] { GL4, GL4bc, GL3, GL3bc, GL2, GL2ES2, GLES2 };
+
+    /**
+     * All GL2ES2 Profiles in the order of default detection.
+     *
+     * FIXME GL3GL4: Due to GL3 and GL4 implementation bugs, we still choose GL2 first, if available!
+     *
+     * <ul>
+     *  <li> GL2ES2
+     *  <li> GL2
+     *  <li> GL3
+     *  <li> GL4
+     *  <li> GLES2
+     * </ul>
+     *
      */
-    public static final String[] GL_PROFILE_LIST_GL2ES2 = new String[] { GL2ES2, GL2, GLES2, GL4bc, GL3bc, GL4, GL3 };
+    public static final String[] GL_PROFILE_LIST_GL2ES2 = new String[] { GL2ES2, GL2, GL3, GL4, GLES2 };
 
     /**
-     * All GL2ES1 Profiles in the order of default detection: GL2ES1, GL2, GLES1
+     * All GL2ES1 Profiles in the order of default detection.
+     *
+     * FIXME GL3GL4: Due to GL3 and GL4 implementation bugs, we still choose GL2 first, if available!
+     *
+     * <ul>
+     *  <li> GL2ES1
+     *  <li> GL2
+     *  <li> GL3bc
+     *  <li> GL4bc
+     *  <li> GLES1
+     * </ul>
+     *
      */
-    public static final String[] GL_PROFILE_LIST_GL2ES1 = new String[] { GL2ES1, GL2, GLES1 };
+    public static final String[] GL_PROFILE_LIST_GL2ES1 = new String[] { GL2ES1, GL2, GL3bc, GL4bc, GLES1 };
 
     /** Returns a default GLProfile object, reflecting the best for the running platform.
      * It selects the first of the set {@link GLProfile#GL_PROFILE_LIST_ALL}
+     * @see #GL_PROFILE_LIST_ALL
      */
     public static final GLProfile getDefault() {
         if(null==defaultGLProfile) {
@@ -119,22 +229,30 @@ public class GLProfile implements Cloneable {
         return defaultGLProfile;
     }
 
-    /** Returns a GLProfile object.
-     * Verfifies the given profile and chooses an apropriate implementation.
-     * A generic value of <code>null</code> or <code>GL</code> will result in
-     * the default profile.
+    /**
+     * Returns the highest profile, implementing the fixed function pipeline
+     * It selects the first of the set: {@link GLProfile#GL_PROFILE_LIST_MAX_FIXEDFUNC}
      *
      * @throws GLException if no implementation for the given profile is found.
+     * @see #GL_PROFILE_LIST_MAX_FIXEDFUNC
      */
-    public static final GLProfile get(String profile) 
+    public static final GLProfile getMaxFixedFunc() 
         throws GLException
     {
-        if(null==profile || profile.equals("GL")) return getDefault();
-        GLProfile glProfile = (GLProfile) mappedProfiles.get(profile);
-        if(null==glProfile) {
-            throw new GLException("No implementation for profile "+profile+" available");
-        }
-        return glProfile;
+        return get(GL_PROFILE_LIST_MAX_FIXEDFUNC);
+    }
+
+    /**
+     * Returns the highest profile, implementing the programmable shader pipeline.
+     * It selects the first of the set: {@link GLProfile#GL_PROFILE_LIST_MAX_PROGSHADER}
+     *
+     * @throws GLException if no implementation for the given profile is found.
+     * @see #GL_PROFILE_LIST_MAX_PROGSHADER
+     */
+    public static final GLProfile getMaxProgrammable() 
+        throws GLException
+    {
+        return get(GL_PROFILE_LIST_MAX_PROGSHADER);
     }
 
     /**
@@ -142,6 +260,7 @@ public class GLProfile implements Cloneable {
      * It selects the first of the set: {@link GLProfile#GL_PROFILE_LIST_GL2ES1}
      *
      * @throws GLException if no implementation for the given profile is found.
+     * @see #GL_PROFILE_LIST_GL2ES1
      */
     public static final GLProfile getGL2ES1() 
         throws GLException
@@ -154,6 +273,7 @@ public class GLProfile implements Cloneable {
      * It selects the first of the set: {@link GLProfile#GL_PROFILE_LIST_GL2ES2}
      *
      * @throws GLException if no implementation for the given profile is found.
+     * @see #GL_PROFILE_LIST_GL2ES2
      */
     public static final GLProfile getGL2ES2() 
         throws GLException
@@ -161,6 +281,24 @@ public class GLProfile implements Cloneable {
         return get(GL_PROFILE_LIST_GL2ES2);
     }
 
+    /** Returns a GLProfile object.
+     * Verfifies the given profile and chooses an apropriate implementation.
+     * A generic value of <code>null</code> or <code>GL</code> will result in
+     * the default profile.
+     *
+     * @throws GLException if no implementation for the given profile is found.
+     */
+    public static final GLProfile get(String profile) 
+        throws GLException
+    {
+        if(null==profile || profile.equals("GL")) return getDefault();
+        GLProfile glProfile = (GLProfile) mappedProfiles.get(profile);
+        if(null==glProfile) {
+            throw new GLException("No implementation for profile "+profile+" available");
+        }
+        return glProfile;
+    }
+
     /**
      * Returns the first profile from the given list,
      * where an implementation is available.
@@ -200,18 +338,12 @@ public class GLProfile implements Cloneable {
     }
 
     private static final String getGLImplBaseClassName(String profileImpl) {
-        if(GL4bc.equals(profileImpl)) {
+        if ( GL4bc.equals(profileImpl) ||
+             GL4.equals(profileImpl)   ||
+             GL3bc.equals(profileImpl) ||
+             GL3.equals(profileImpl)   ||
+             GL2.equals(profileImpl) ) {
             return "com.jogamp.opengl.impl.gl4.GL4bc";
-        } else if(GL4.equals(profileImpl)) {
-            return "com.jogamp.opengl.impl.gl4.GL4";
-        } else if(GL3bc.equals(profileImpl)) {
-            return "com.jogamp.opengl.impl.gl3.GL3bc";
-        } else if(GL3.equals(profileImpl)) {
-            return "com.jogamp.opengl.impl.gl3.GL3";
-        } else if(GL2.equals(profileImpl)) {
-            return "com.jogamp.opengl.impl.gl2.GL2";
-        } else if(GL2ES12.equals(profileImpl)) {
-            return "com.jogamp.opengl.impl.gl2es12.GL2ES12";
         } else if(GLES1.equals(profileImpl) || GL2ES1.equals(profileImpl)) {
             return "com.jogamp.opengl.impl.es1.GLES1";
         } else if(GLES2.equals(profileImpl) || GL2ES2.equals(profileImpl)) {
@@ -285,7 +417,7 @@ public class GLProfile implements Cloneable {
         return isGL4() || isGL3bc() || GL3.equals(profile);
     }
 
-    /** Indicates whether this profile is capable of GL2. */
+    /** Indicates whether this context is a GL2 context */
     public final boolean isGL2() {
         return isGL3bc() || GL2.equals(profile);
     }
@@ -315,34 +447,9 @@ public class GLProfile implements Cloneable {
         return GL2GL3.equals(profile) || isGL2() || isGL3() ;
     }
 
-    /** Indicates whether this profile uses the native desktop OpenGL GL4bc implementations. */
-    public final boolean usesNativeGL4bc() {
-        return GL4bc.equals(profileImpl);
-    }
-
-    /** Indicates whether this profile uses the native desktop OpenGL GL4 implementations. */
-    public final boolean usesNativeGL4() {
-        return usesNativeGL4bc() || GL4.equals(profileImpl);
-    }
-
-    /** Indicates whether this profile uses the native desktop OpenGL GL3bc implementations. */
-    public final boolean usesNativeGL3bc() {
-        return GL3bc.equals(profileImpl);
-    }
-
-    /** Indicates whether this profile uses the native desktop OpenGL GL3 implementations. */
-    public final boolean usesNativeGL3() {
-        return usesNativeGL3bc() || GL3.equals(profileImpl);
-    }
-
-    /** Indicates whether this profile uses the native desktop OpenGL GL2 implementations. */
-    public final boolean usesNativeGL2() {
-        return GL2.equals(profileImpl) || GL2ES12.equals(profileImpl) ;
-    }
-
-    /** Indicates whether this profile uses the native desktop OpenGL GL2 or GL3 implementations. */
-    public final boolean usesNativeGL2GL3() {
-        return usesNativeGL2() || usesNativeGL3() || usesNativeGL4();
+    /** Indicates whether this profile supports GLSL. */
+    public final boolean hasGLSL() {
+        return isGL2ES2() ;
     }
 
     /** Indicates whether this profile uses the native OpenGL ES1 implementations. */
@@ -360,11 +467,6 @@ public class GLProfile implements Cloneable {
         return usesNativeGLES2() || usesNativeGLES1();
     }
 
-    /** Indicates whether this profile supports GLSL. */
-    public final boolean hasGLSL() {
-        return isGL2ES2() ;
-    }
-
     /** 
      * General validation if type is a valid GL data type
      * for the current profile
@@ -665,70 +767,23 @@ public class GLProfile implements Cloneable {
         return "GLProfile[" + profile + "/" + profileImpl + "]";
     }
 
-    public static final int GL_VERSIONS[][] = {
-        /* 0.*/ { -1 },
-        /* 1.*/ { 0, 1, 2, 3, 4, 5 },
-        /* 2.*/ { 0, 1 },
-        /* 3.*/ { 0, 1, 2, 3 },
-        /* 4.*/ { 0 } };
-
-    public static final int getMaxMajor() {
-        return GL_VERSIONS.length-1;
-    }
-
-    public static final int getMaxMinor(int major) {
-        if(1>major || major>=GL_VERSIONS.length) return -1;
-        return GL_VERSIONS[major].length-1;
-    }
-
-    public static final boolean isValidGLVersion(int major, int minor) {
-        if(1>major || major>=GL_VERSIONS.length) return false;
-        if(0>minor || minor>=GL_VERSIONS[major].length) return false;
-        return true;
-    }
-
-    public static final boolean decrementGLVersion(int major[], int minor[]) {
-        if(null==major || major.length<1 ||null==minor || minor.length<1) {
-            throw new GLException("invalid array arguments");
-        }
-        int m = major[0];
-        int n = minor[0];
-        if(!isValidGLVersion(m, n)) return false;
-
-        // decrement ..
-        n -= 1;
-        if(n < 0) {
-            m -= 1;
-            n = GL_VERSIONS[m].length-1;
-        }
-        if(!isValidGLVersion(m, n)) return false;
-        major[0]=m;
-        minor[0]=n;
-
-        return true;
-    }
-
-    // The intersection between desktop OpenGL and the union of the OpenGL ES profiles
-    // This is here only to avoid having separate GL2ES1Impl and GL2ES2Impl classes
-    private static final String GL2ES12 = "GL2ES12";
-
     private static final boolean isAWTAvailable;
     private static final boolean isAWTJOGLAvailable;
 
-    private static final boolean hasGL4bcImpl;
-    private static final boolean hasGL4Impl;
-    private static final boolean hasGL3bcImpl;
-    private static final boolean hasGL3Impl;
-    private static final boolean hasGL2Impl;
-    private static final boolean hasGL2ES12Impl;
-    private static final boolean hasGLES2Impl;
-    private static final boolean hasGLES1Impl;
+    private static /*final*/ boolean hasGL234Impl;
+    private static /*final*/ boolean hasGL4bcImpl;
+    private static /*final*/ boolean hasGL4Impl;
+    private static /*final*/ boolean hasGL3bcImpl;
+    private static /*final*/ boolean hasGL3Impl;
+    private static /*final*/ boolean hasGL2Impl;
+    private static /*final*/ boolean hasGLES2Impl;
+    private static /*final*/ boolean hasGLES1Impl;
 
     /** The JVM/process wide default GL profile **/
-    private static GLProfile defaultGLProfile;
+    private static /*final*/ GLProfile defaultGLProfile;
   
     /** All GLProfiles */
-    private static final HashMap/*<String, GLProfile>*/ mappedProfiles;
+    private static /*final*/ HashMap/*<String, GLProfile>*/ mappedProfiles;
 
     /**
      * Tries the profiles implementation and native libraries.
@@ -740,119 +795,174 @@ public class GLProfile implements Cloneable {
         AccessControlContext acc = AccessController.getContext();
 
         isAWTAvailable = !Debug.getBooleanProperty("java.awt.headless", true, acc) &&
-                          NWReflection.isClassAvailable("java.awt.Component") ;
+                          ReflectionUtil.isClassAvailable("java.awt.Component") ;
 
         isAWTJOGLAvailable = isAWTAvailable &&
-                             NWReflection.isClassAvailable("javax.media.nativewindow.awt.AWTGraphicsDevice") && // NativeWindow
-                             NWReflection.isClassAvailable("javax.media.opengl.awt.GLCanvas") ; // JOGL
+                             ReflectionUtil.isClassAvailable("javax.media.nativewindow.awt.AWTGraphicsDevice") && // NativeWindow
+                             ReflectionUtil.isClassAvailable("javax.media.opengl.awt.GLCanvas") ; // JOGL
 
         boolean hasDesktopGL = false;
-        boolean hasDesktopGLES12 = false;
         boolean hasNativeOSFactory = false;
-
+        Throwable t;
+
+        //
+        // First iteration of desktop GL availability detection
+        //   - native libs exist
+        //   - class exists
+        // 
+        t=null;
         try {
             // See DRIHack.java for an explanation of why this is necessary
             DRIHack.begin();
-            NativeLibLoader.loadGLDesktop();
+            GLJNILibLoader.loadGLDesktop();
             DRIHack.end();
             hasDesktopGL = true;
-        } catch (Throwable t) {
+        } catch (UnsatisfiedLinkError ule) {
+            t=ule;
+        } catch (SecurityException se) {
+            t=se;
+        } catch (NullPointerException npe) {
+            t=npe;
+        } catch (RuntimeException re) {
+            t=re;
+        }
+        if(null!=t) {
             if (DEBUG) {
                 System.err.println("GLProfile.static Desktop GL Library not available");
                 t.printStackTrace();
             }
         }
 
-        try {
-            // See DRIHack.java for an explanation of why this is necessary
-            DRIHack.begin();
-            NativeLibLoader.loadGLDesktopES12();
-            DRIHack.end();
-            hasDesktopGLES12 = true;
-        } catch (Throwable t) {
-            if (DEBUG) {
-                System.err.println("GLProfile.static Desktop GL ES12 Library not available");
-                t.printStackTrace();
+        hasGL234Impl   = hasDesktopGL && ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.gl4.GL4bcImpl");
+        hasGL4bcImpl   = hasGL234Impl;
+        hasGL4Impl     = hasGL234Impl;
+        hasGL3bcImpl   = hasGL234Impl;
+        hasGL3Impl     = hasGL234Impl;
+        hasGL2Impl     = hasGL234Impl;
+        mappedProfiles = computeProfileMap();
+
+        //
+        // Second iteration of desktop GL availability detection
+        // utilizing the detected GL version in the shared context.
+        //
+        // - Instantiate GLDrawableFactory incl its shared dummy drawable/context,
+        //   which will register at GLContext ..
+        // 
+
+        if(hasDesktopGL) {
+            // if successfull it has a shared dummy drawable and context created
+            try {
+                hasNativeOSFactory = null != GLDrawableFactory.getFactoryImpl(GL2);
+            } catch (RuntimeException re) {
+                System.err.println("GLProfile.static - Native platform GLDrawable factory not available");
+                re.printStackTrace();
             }
         }
 
-        if(hasDesktopGL||hasDesktopGLES12) {
-            try {
-                hasNativeOSFactory = null!=GLDrawableFactory.getFactoryImpl(GL2);
-            } catch (Throwable t) {
-                if (DEBUG) {
-                    System.err.println("GLProfile.static - Native platform GLDrawable factory not available");
-                    t.printStackTrace();
-                }
-            }
+        if(hasNativeOSFactory && !GLContext.mappedVersionsAvailableSet) {
+            // nobody yet set the available desktop versions, see {@link GLContextImpl#makeCurrent},
+            // so we have to add the usual suspect
+            GLContext.mapVersionAvailable(2, true, 1, 5, GLContext.CTX_PROFILE_COMPAT|GLContext.CTX_OPTION_ANY);
         }
 
         if(!hasNativeOSFactory) {
-            hasDesktopGLES12=false;
-            hasDesktopGL=false;
+            hasDesktopGL   = false;
+            hasGL234Impl   = false;
+            hasGL4bcImpl   = false;
+            hasGL4Impl     = false;
+            hasGL3bcImpl   = false;
+            hasGL3Impl     = false;
+            hasGL2Impl     = false;
+        } else {
+            hasGL4bcImpl   = GLContext.isGL4bcAvailable();
+            hasGL4Impl     = GLContext.isGL4Available();
+            hasGL3bcImpl   = GLContext.isGL3bcAvailable();
+            hasGL3Impl     = GLContext.isGL3Available();
+            hasGL2Impl     = GLContext.isGL2Available();
         }
 
-        // FIXME: check for real GL3 availability .. ?
-        hasGL4bcImpl   = hasDesktopGL && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl4.GL4bcImpl");
-        hasGL4Impl     = hasDesktopGL && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl4.GL4Impl");
-        hasGL3bcImpl   = hasDesktopGL && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl3.GL3bcImpl");
-        hasGL3Impl     = hasDesktopGL && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl3.GL3Impl");
-        hasGL2Impl     = hasDesktopGL && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl2.GL2Impl");
-
-        hasGL2ES12Impl = hasDesktopGLES12 && NWReflection.isClassAvailable("com.jogamp.opengl.impl.gl2es12.GL2ES12Impl");
-
         boolean btest = false;
 
-        boolean hasEGLDynLookup = NWReflection.isClassAvailable("com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper");
+        boolean hasEGLDynLookup = ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper");
         boolean hasEGLDrawableFactory = false;
+        t=null;
         try {
             if(hasEGLDynLookup) {
                 hasEGLDrawableFactory = null!=GLDrawableFactory.getFactoryImpl(GLES2);
-                btest = hasEGLDrawableFactory &&
-                        NWReflection.isClassAvailable("com.jogamp.opengl.impl.es2.GLES2Impl") &&
-                        null!=com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper.getDynamicLookupHelper(2);
+                try {
+                    btest = hasEGLDrawableFactory &&
+                            ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.es2.GLES2Impl") &&
+                            null!=com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper.getDynamicLookupHelper(2);
+                } catch (GLException gle) {
+                    // n/a ..
+                }
             }
-        } catch (Throwable t) {
+        } catch (UnsatisfiedLinkError ule) {
+            t=ule;
+        } catch (SecurityException se) {
+            t=se;
+        } catch (NullPointerException npe) {
+            t=npe;
+        } catch (RuntimeException re) {
+            t=re;
+        }
+        if(null!=t) {
             if (DEBUG) {
                 System.err.println("GLProfile.static - GL ES2 Factory/Library not available");
                 t.printStackTrace();
             }
         }
         hasGLES2Impl     = btest;
+        if(hasGLES2Impl) {
+            GLContext.mapVersionAvailable(2, false, 2, 0, GLContext.CTX_PROFILE_ES|GLContext.CTX_PROFILE_CORE|GLContext.CTX_OPTION_ANY);
+        }
 
         btest = false;
-        try {
-            if(hasEGLDynLookup) {
+        if(hasEGLDynLookup) {
+            try {
                 btest = hasEGLDrawableFactory &&
-                        NWReflection.isClassAvailable("com.jogamp.opengl.impl.es1.GLES1Impl") &&
+                        ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.es1.GLES1Impl") &&
                         null!=com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper.getDynamicLookupHelper(1);
-            }
-        } catch (Throwable t) {
-            if (DEBUG) {
-                System.err.println("GLProfile.static - GL ES1 Factory/Library not available");
-                t.printStackTrace();
+            } catch (GLException jre) {
+                /* just not available .. */ 
             }
         }
         hasGLES1Impl     = btest;
+        if(hasGLES1Impl) {
+            GLContext.mapVersionAvailable(1, false, 1, 0, GLContext.CTX_PROFILE_ES|GLContext.CTX_PROFILE_CORE|GLContext.CTX_OPTION_ANY);
+        }
+
+        mappedProfiles = computeProfileMap();
+        if(null==defaultGLProfile) {
+            throw new GLException("No profile available: "+list2String(GL_PROFILE_LIST_ALL));
+        }
 
         if (DEBUG) {
             System.err.println("GLProfile.static isAWTAvailable "+isAWTAvailable);
             System.err.println("GLProfile.static isAWTJOGLAvailable "+isAWTJOGLAvailable);
             System.err.println("GLProfile.static hasNativeOSFactory "+hasNativeOSFactory);
-            System.err.println("GLProfile.static hasDesktopGLES12 "+hasDesktopGLES12);
             System.err.println("GLProfile.static hasDesktopGL "+hasDesktopGL);
-            System.err.println("GLProfile.static hasGL4bcImpl "+hasGL4bcImpl);
-            System.err.println("GLProfile.static hasGL4Impl "+hasGL4Impl);
-            System.err.println("GLProfile.static hasGL3bcImpl "+hasGL3bcImpl);
-            System.err.println("GLProfile.static hasGL3Impl "+hasGL3Impl);
-            System.err.println("GLProfile.static hasGL2Impl "+hasGL2Impl);
-            System.err.println("GLProfile.static hasGL2ES12Impl "+hasGL2ES12Impl);
             System.err.println("GLProfile.static hasEGLDynLookup "+hasEGLDynLookup);
             System.err.println("GLProfile.static hasEGLDrawableFactory "+hasEGLDrawableFactory);
-            System.err.println("GLProfile.static hasGLES2Impl "+hasGLES2Impl);
-            System.err.println("GLProfile.static hasGLES1Impl "+hasGLES1Impl);
+            System.err.println("GLProfile.static hasGL234Impl "+hasGL234Impl);
+            System.err.println("GLProfile.static "+glAvailabilityToString());
+        }
+    }
+
+    private static final String list2String(String[] list) {
+        StringBuffer msg = new StringBuffer();
+        msg.append("[");
+        for (int i = 0; i < list.length; i++) {
+            if (i > 0)
+                msg.append(", ");
+            msg.append(list[i]);
         }
+        msg.append("]");
+        return msg.toString();
+    }
 
+    private static HashMap computeProfileMap() {
+        defaultGLProfile=null;
         HashMap/*<String, GLProfile>*/ _mappedProfiles = new HashMap(GL_PROFILE_LIST_ALL.length);
         for(int i=0; i<GL_PROFILE_LIST_ALL.length; i++) {
             String profile = GL_PROFILE_LIST_ALL[i];
@@ -875,73 +985,55 @@ public class GLProfile implements Cloneable {
                 }
             }
         }
-        mappedProfiles = _mappedProfiles; // final ..
-        if(null==defaultGLProfile) {
-            throw new GLException("No profile available: "+list2String(GL_PROFILE_LIST_ALL));
-        }
-    }
-
-    private static final String list2String(String[] list) {
-        StringBuffer msg = new StringBuffer();
-        msg.append("[");
-        for (int i = 0; i < list.length; i++) {
-            if (i > 0)
-                msg.append(", ");
-            msg.append(list[i]);
-        }
-        msg.append("]");
-        return msg.toString();
+        return _mappedProfiles;
     }
 
     /**
      * Returns the profile implementation
      */
     private static String computeProfileImpl(String profile) {
-    // FIXME Order of return profiles, after we can test their availability
         if (GL2ES1.equals(profile)) {
-            if(hasGL2ES12Impl) {
-                return GL2ES12;
-            } else if(hasGL2Impl) {
+            if(hasGL2Impl) {
                 return GL2;
+            } else if(hasGL3bcImpl) {
+                return GL3bc;
+            } else if(hasGL4bcImpl) {
+                return GL4bc;
             } else if(hasGLES1Impl) {
                 return GLES1;
             }
         } else if (GL2ES2.equals(profile)) {
-            if(hasGL2ES12Impl) {
-                return GL2ES12;
-            } else if(hasGL2Impl) {
+            if(hasGL2Impl) {
                 return GL2;
             } else if(hasGL3Impl) {
                 return GL3;
-            } else if(hasGL3bcImpl) {
-                return GL3bc;
             } else if(hasGL4Impl) {
                 return GL4;
-            } else if(hasGL4bcImpl) {
-                return GL4bc;
             } else if(hasGLES2Impl) {
                 return GLES2;
             }
-        } else if(GL4bc.equals(profile) && hasGL4bcImpl) {
-            return GL4bc;
-        } else if(GL4.equals(profile)) {
-            if(hasGL4Impl) {
-                return GL4;
+        } else if(GL2GL3.equals(profile)) {
+            if(hasGL2Impl) {
+                return GL2;
+            } else if(hasGL3bcImpl) {
+                return GL3bc;
             } else if(hasGL4bcImpl) {
                 return GL4bc;
+            } else if(hasGL3Impl) {
+                return GL3;
+            } else if(hasGL4Impl) {
+                return GL4;
             }
+        } else if(GL4bc.equals(profile) && hasGL4bcImpl) {
+            return GL4bc;
+        } else if(GL4.equals(profile) && hasGL4Impl) {
+            return GL4;
         } else if(GL3bc.equals(profile) && hasGL3bcImpl) {
             return GL3bc;
-        } else if(GL3.equals(profile)) {
-            if(hasGL3Impl) {
-                return GL3;
-            } else if(hasGL3bcImpl) {
-                return GL3bc;
-            }
+        } else if(GL3.equals(profile) && hasGL3Impl) {
+            return GL3;
         } else if(GL2.equals(profile) && hasGL2Impl) {
             return GL2;
-        } else if(GL2GL3.equals(profile) && hasGL2Impl) {
-            return GL2;
         } else if(GLES2.equals(profile) && hasGLES2Impl) {
             return GLES2;
         } else if(GLES1.equals(profile) && hasGLES1Impl) {
diff --git a/src/junit/com/jogamp/test/junit/jogl/acore/TestGLProfile01CORE.java b/src/junit/com/jogamp/test/junit/jogl/acore/TestGLProfile01CORE.java
new file mode 100755
index 000000000..a1ff0d860
--- /dev/null
+++ b/src/junit/com/jogamp/test/junit/jogl/acore/TestGLProfile01CORE.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2010 Sven Gothel. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * - Redistribution of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * 
+ * - Redistribution in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * Neither the name Sven Gothel or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+package com.jogamp.test.junit.jogl.acore;
+
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.AfterClass;
+import org.junit.Test;
+
+import javax.media.opengl.*;
+
+import com.jogamp.newt.*;
+import java.io.IOException;
+
+public class TestGLProfile01CORE {
+    static GLProfile glp;
+    static GLDrawableFactory factory;
+
+    @BeforeClass
+    public static void initClass() {
+        glp = GLProfile.getDefault();
+        Assert.assertNotNull(glp);
+        factory = GLDrawableFactory.getFactory(glp);
+        Assert.assertNotNull(factory);
+    }
+
+    @AfterClass
+    public static void releaseClass() {
+        factory.shutdown();
+        factory=null;
+    }
+
+    @Test
+    public void test01GLProfileDefault() {
+        System.out.println("GLProfile <static> "+GLProfile.glAvailabilityToString());
+    }
+
+    @Test
+    public void test02GLProfileMaxFixedFunc() {
+        System.out.println("GLProfile <static> getMaxFixedFunc(): "+GLProfile.getMaxFixedFunc());
+    }
+
+    @Test
+    public void test02GLProfileMaxProgrammable() {
+        System.out.println("GLProfile <static> getMaxProgrammable(): "+GLProfile.getMaxProgrammable());
+    }
+
+    public static void main(String args[]) throws IOException {
+        String tstname = TestGLProfile01CORE.class.getName();
+        org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(new String[] {
+            tstname,
+            "filtertrace=true",
+            "haltOnError=false",
+            "haltOnFailure=false",
+            "showoutput=true",
+            "outputtoformatters=true",
+            "logfailedtests=true",
+            "logtestlistenerevents=true",
+            "formatter=org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter",
+            "formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,TEST-"+tstname+".xml" } );
+    }
+
+}
diff --git a/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT01GLn.java b/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT01GLn.java
new file mode 100755
index 000000000..ac34b46b5
--- /dev/null
+++ b/src/junit/com/jogamp/test/junit/jogl/awt/TestAWT01GLn.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2010 Sven Gothel. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * - Redistribution of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * 
+ * - Redistribution in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * Neither the name Sven Gothel or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+package com.jogamp.test.junit.jogl.awt;
+
+import javax.media.opengl.GLProfile;
+import javax.media.opengl.GLCapabilities;
+import javax.media.opengl.awt.GLCanvas;
+import com.jogamp.opengl.util.Animator;
+
+import com.jogamp.test.junit.jogl.demos.gl2.gears.Gears;
+import java.awt.Frame;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.After;
+import org.junit.Test;
+
+public class TestAWT01GLn {
+    Frame frame=null;
+    GLCanvas glCanvas=null;
+
+    @Before
+    public void init() {
+        frame = new Frame("Texture Test");
+        Assert.assertNotNull(frame);
+    }
+
+    @After
+    public void release() {
+        Assert.assertNotNull(frame);
+        Assert.assertNotNull(glCanvas);
+        frame.setVisible(false);
+        frame.remove(glCanvas);
+        frame.dispose();
+        frame=null;
+        glCanvas=null;
+    }
+
+    protected void runTestGL(GLCapabilities caps) throws InterruptedException {
+        glCanvas = new GLCanvas(caps);
+        Assert.assertNotNull(glCanvas);
+        frame.add(glCanvas);
+        frame.setSize(512, 512);
+
+        glCanvas.addGLEventListener(new Gears());
+
+        Animator animator = new Animator(glCanvas);
+        frame.setVisible(true);
+        animator.start();
+
+        Thread.sleep(500); // 500 ms
+
+        animator.stop();
+    }
+
+    @Test
+    public void test01GLDefault() throws InterruptedException {
+        GLCapabilities caps = new GLCapabilities(GLProfile.getDefault());
+        runTestGL(caps);
+    }
+
+    /** Both fail on ATI .. if GLn n>2
+    public void test02GL3bc() throws InterruptedException {
+        GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL3bc));
+        runTestGL(caps);
+    }
+
+    public void test03GLMaxFixed() throws InterruptedException {
+        GLCapabilities caps = new GLCapabilities(GLProfile.getMaxFixedFunc());
+        runTestGL(caps);
+    } */
+
+    public static void main(String args[]) {
+        org.junit.runner.JUnitCore.main(TestAWT01GLn.class.getName());
+    }
+}
diff --git a/src/junit/com/jogamp/test/junit/jogl/offscreen/TestOffscreen01NEWT.java b/src/junit/com/jogamp/test/junit/jogl/offscreen/TestOffscreen01NEWT.java
index ec03bec95..459b41f16 100755
--- a/src/junit/com/jogamp/test/junit/jogl/offscreen/TestOffscreen01NEWT.java
+++ b/src/junit/com/jogamp/test/junit/jogl/offscreen/TestOffscreen01NEWT.java
@@ -55,16 +55,16 @@ import com.jogamp.test.junit.jogl.demos.es1.RedSquare;
 import java.io.IOException;
 
 public class TestOffscreen01NEWT {
-    static GLProfile glp;
+    static GLProfile glpDefault;
     static GLDrawableFactory factory;
     static int width, height;
-    GLCapabilities caps;
+    GLCapabilities capsDefault;
 
     @BeforeClass
     public static void initClass() {
-        glp = GLProfile.getDefault();
-        Assert.assertNotNull(glp);
-        factory = GLDrawableFactory.getFactory(glp);
+        glpDefault = GLProfile.getDefault();
+        Assert.assertNotNull(glpDefault);
+        factory = GLDrawableFactory.getFactory(glpDefault);
         Assert.assertNotNull(factory);
         width  = 640;
         height = 480;
@@ -78,7 +78,8 @@ public class TestOffscreen01NEWT {
 
     @Before
     public void init() {
-        caps = new GLCapabilities(glp);
+        capsDefault = new GLCapabilities(glpDefault);
+        Assert.assertNotNull(capsDefault);
     }
 
     private void do01OffscreenWindowPBuffer(GLCapabilities caps) {
@@ -115,20 +116,20 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test01aOffscreenWindowPBuffer() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         do01OffscreenWindowPBuffer(caps2);
     }
 
     @Test
     public void test01bOffscreenWindowPBufferStencil() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         caps2.setStencilBits(8);
         do01OffscreenWindowPBuffer(caps2);
     }
 
     @Test
     public void test01cOffscreenWindowPBufferStencilAlpha() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         caps2.setStencilBits(8);
         caps2.setAlphaBits(8);
         do01OffscreenWindowPBuffer(caps2);
@@ -136,7 +137,7 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test01cOffscreenWindowPBuffer555() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         caps2.setRedBits(5);
         caps2.setGreenBits(5);
         caps2.setBlueBits(5);
@@ -145,7 +146,7 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test02Offscreen3Windows1DisplayPBuffer() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         int winnum = 3, i;
         Window windows[] = new Window[winnum];
         GLWindow glWindows[] = new GLWindow[winnum];
@@ -192,7 +193,7 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test03Offscreen3Windows3DisplaysPBuffer() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
         int winnum = 3, i;
         Display displays[] = new Display[winnum];
         Screen screens[] = new Screen[winnum];
@@ -240,7 +241,7 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test04OffscreenSnapshotWithDemoPBuffer() {
-        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, true, false);
+        GLCapabilities caps2 = WindowUtilNEWT.fixCaps(capsDefault, false, true, false);
 
         System.out.println("Create Window 1");
         Display display = NewtFactory.createDisplay(null); // local display
@@ -283,6 +284,12 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test11OffscreenWindowPixmap() {
+        // Offscreen doesn't work on >= GL3 (ATI)
+        GLProfile glp = GLProfile.get(GLProfile.GL2);
+        Assert.assertNotNull(glp);
+        GLCapabilities caps = new GLCapabilities(glp);
+        Assert.assertNotNull(caps);
+
         GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, false, false);
 
         Display display = NewtFactory.createDisplay(null); // local display
@@ -318,6 +325,12 @@ public class TestOffscreen01NEWT {
 
     @Test
     public void test14OffscreenSnapshotWithDemoPixmap() {
+        // Offscreen doesn't work on >= GL3 (ATI)
+        GLProfile glp = GLProfile.get(GLProfile.GL2);
+        Assert.assertNotNull(glp);
+        GLCapabilities caps = new GLCapabilities(glp);
+        Assert.assertNotNull(caps);
+
         GLCapabilities caps2 = WindowUtilNEWT.fixCaps(caps, false, false, false);
 
         System.out.println("Create Window 1");
diff --git a/src/junit/com/jogamp/test/junit/jogl/texture/TestTexture01AWT.java b/src/junit/com/jogamp/test/junit/jogl/texture/TestTexture01AWT.java
index 563c7f88e..4bbbaa271 100755
--- a/src/junit/com/jogamp/test/junit/jogl/texture/TestTexture01AWT.java
+++ b/src/junit/com/jogamp/test/junit/jogl/texture/TestTexture01AWT.java
@@ -93,7 +93,7 @@ public class TestTexture01AWT {
         frame.setVisible(true);
         animator.start();
 
-        Thread.sleep(1000); // 1000 ms
+        Thread.sleep(500); // 500 ms
 
         animator.stop();
         frame.setVisible(false);
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWJNILibLoader.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWJNILibLoader.java
new file mode 100644
index 000000000..c3c04287a
--- /dev/null
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWJNILibLoader.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2010, Sven Gothel
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Sven Gothel nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Sven Gothel BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.jogamp.nativewindow.impl;
+
+// FIXME: refactor Java SE dependencies
+//import java.awt.Toolkit;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.HashSet;
+import com.jogamp.common.jvm.JNILibLoaderBase;
+
+public class NWJNILibLoader extends JNILibLoaderBase {
+  
+  public static void loadNativeWindow(final String ossuffix) {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("nativewindow_"+ossuffix, null, false);
+        return null;
+      }
+    });
+  }
+
+}
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWReflection.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWReflection.java
deleted file mode 100644
index 9bac9477a..000000000
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NWReflection.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- */
-
-package com.jogamp.nativewindow.impl;
-
-import java.lang.reflect.*;
-import javax.media.nativewindow.*;
-
-public final class NWReflection {
-    
-  public static final boolean DEBUG = Debug.debug("NWReflection");
-
-    /**
-     * Returns true only if the class could be loaded.
-     */
-    public static final boolean isClassAvailable(String clazzName) {
-        try {
-            return null != Class.forName(clazzName, false, NWReflection.class.getClassLoader());
-        } catch (ClassNotFoundException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Loads and returns the class or null.
-     * @see Class#forName(java.lang.String, boolean, java.lang.ClassLoader)
-     */
-    public static final Class getClass(String clazzName, boolean initialize) {
-        try {
-            return getClassImpl(clazzName, initialize);
-        } catch (ClassNotFoundException e) {
-            return null;
-        }
-    }
-
-    private static Class getClassImpl(String clazzName, boolean initialize) throws ClassNotFoundException {
-        return Class.forName(clazzName, initialize, NWReflection.class.getClassLoader());
-    }
-
-    /**
-     * @throws NativeWindowException if the constructor can not be delivered.
-     */
-    public static final Constructor getConstructor(String clazzName, Class[] cstrArgTypes) {
-        try {
-            return getConstructor(getClassImpl(clazzName, true), cstrArgTypes);
-        } catch (ClassNotFoundException ex) {
-            throw new NativeWindowException(clazzName + " not available", ex);
-        }
-    }
-
-    /**
-     * @throws NativeWindowException if the constructor can not be delivered.
-     */
-    public static final Constructor getConstructor(Class clazz, Class[] cstrArgTypes) {
-        try {
-            return clazz.getDeclaredConstructor(cstrArgTypes);
-        } catch (NoSuchMethodException ex) {
-            String args = "";
-            for (int i = 0; i < cstrArgTypes.length; i++) {
-                args += cstrArgTypes[i].getName();
-                if(i != cstrArgTypes.length-1) {
-                     args+= ", ";
-                }
-            }
-            throw new NativeWindowException("Constructor: '" + clazz + "(" + args + ")' not found", ex);
-        }
-    }
-
-  public static final Constructor getConstructor(String clazzName) {
-    return getConstructor(clazzName, new Class[0]);
-  }
-
-    /**
-     * @throws NativeWindowException if the instance can not be created.
-     */
-    public static final Object createInstance(Class clazz, Class[] cstrArgTypes, Object[] cstrArgs) {
-        try {
-            return getConstructor(clazz, cstrArgTypes).newInstance(cstrArgs);
-        } catch (InstantiationException ex) {
-            throw new NativeWindowException("can not create instance of class "+clazz, ex);
-        } catch (InvocationTargetException ex) {
-            throw new NativeWindowException("can not create instance of class "+clazz, ex);
-        } catch (IllegalAccessException ex) {
-            throw new NativeWindowException("can not create instance of class "+clazz, ex);
-        }
-    }
-
-  public static final Object createInstance(Class clazz, Object[] cstrArgs) {
-    Class[] cstrArgTypes = new Class[cstrArgs.length];
-    for(int i=0; i<cstrArgs.length; i++) {
-        cstrArgTypes[i] = cstrArgs[i].getClass();
-    }
-    return createInstance(clazz, cstrArgTypes, cstrArgs);
-  }
-
-    public static final Object createInstance(String clazzName, Class[] cstrArgTypes, Object[] cstrArgs) {
-        try {
-            return createInstance(getClassImpl(clazzName, true), cstrArgTypes, cstrArgs);
-        } catch (ClassNotFoundException ex) {
-            throw new NativeWindowException(clazzName + " not available", ex);
-        }
-    }
-
-  public static final Object createInstance(String clazzName, Object[] cstrArgs) {
-    Class[] cstrArgTypes = new Class[cstrArgs.length];
-    for(int i=0; i<cstrArgs.length; i++) {
-        cstrArgTypes[i] = cstrArgs[i].getClass();
-    }
-    return createInstance(clazzName, cstrArgTypes, cstrArgs);
-  }
-
-  public static final Object createInstance(String clazzName) {
-    return createInstance(clazzName, new Class[0], null);
-  }
-
-  public static final boolean instanceOf(Object obj, String clazzName) {
-    return instanceOf(obj.getClass(), clazzName);
-  }
-  public static final boolean instanceOf(Class clazz, String clazzName) {
-    do {
-        if(clazz.getName().equals(clazzName)) {
-            return true;
-        }
-        clazz = clazz.getSuperclass();
-    } while (clazz!=null);
-    return false;
-  }
-
-  public static final boolean implementationOf(Object obj, String faceName) {
-    return implementationOf(obj.getClass(), faceName);
-  }
-  public static final boolean implementationOf(Class clazz, String faceName) {
-    do {
-        Class[] clazzes = clazz.getInterfaces();
-        for(int i=clazzes.length-1; i>=0; i--) {
-            Class face = clazzes[i];
-            if(face.getName().equals(faceName)) {
-                return true;
-            }
-        }
-        clazz = clazz.getSuperclass();
-    } while (clazz!=null);
-    return false;
-  }
-
-  public static boolean isAWTComponent(Object target) {
-      return instanceOf(target, "java.awt.Component");
-  }
-
-  public static boolean isAWTComponent(Class clazz) {
-      return instanceOf(clazz, "java.awt.Component");
-  }
-
-}
-
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeLibLoaderBase.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeLibLoaderBase.java
deleted file mode 100644
index c4f1d7e08..000000000
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeLibLoaderBase.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- * 
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.jogamp.nativewindow.impl;
-
-// FIXME: refactor Java SE dependencies
-//import java.awt.Toolkit;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.HashSet;
-
-public class NativeLibLoaderBase {
-  public static final boolean DEBUG = Debug.debug("NativeLibLoader");
-
-  public interface LoaderAction {
-    /**
-     * Loads the library specified by libname. Optionally preloads the libraries specified by
-     * preload. The implementation should ignore, if the preload-libraries have already been
-     * loaded.
-     * @param libname the library to load
-     * @param preload the libraries to load before loading the main library if not null
-     * @param preloadIgnoreError true, if errors during loading the preload-libraries should be ignored 
-     */
-    void loadLibrary(String libname, String[] preload, 
-        boolean preloadIgnoreError);
-  }
-  
-  private static class DefaultAction implements LoaderAction {
-    public void loadLibrary(String libname, String[] preload, boolean preloadIgnoreError) {
-      if (null!=preload) {
-        for (int i=0; i<preload.length; i++) {
-          if(!isLoaded(preload[i])) {
-              try {
-                loadLibraryInternal(preload[i]);
-                addLoaded(preload[i]);
-                if(DEBUG) {
-                    System.err.println("NativeLibLoaderBase preloaded "+preload[i]);
-                }
-              } catch (UnsatisfiedLinkError e) {
-                if(DEBUG) {
-                    e.printStackTrace();
-                }
-                if (!preloadIgnoreError && e.getMessage().indexOf("already loaded") < 0) {
-                  throw e;
-                }
-              }
-          }
-        }
-      }
-      loadLibraryInternal(libname);
-      addLoaded(libname);
-      if(DEBUG) {
-          System.err.println("NativeLibLoaderBase    loaded "+libname);
-      }
-    }
-  }
-
-  private static final HashSet loaded = new HashSet();
-  private static LoaderAction loaderAction = new DefaultAction();
-
-  public static boolean isLoaded(String libName) {
-    return loaded.contains(libName);
-  }
-
-  public static void addLoaded(String libName) {
-    loaded.add(libName);
-    if(DEBUG) {
-        System.err.println("NativeLibLoaderBase Loaded Native Library: "+libName);
-    }
-  }
-
-  public static void disableLoading() {
-    setLoadingAction(null);
-  }
-
-  public static void enableLoading() {
-    setLoadingAction(new DefaultAction());
-  }
-  
-  public static synchronized void setLoadingAction(LoaderAction action) {
-    loaderAction = action;
-  }
-
-  protected static synchronized void loadLibrary(String libname, String[] preload, 
-      boolean preloadIgnoreError) {
-    if (loaderAction != null && !isLoaded(libname))
-    {
-      loaderAction.loadLibrary(libname, preload, preloadIgnoreError);    
-    }
-  }
-  
-  public static void loadNativeWindow(final String ossuffix) {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("nativewindow_"+ossuffix, null, false);
-        return null;
-      }
-    });
-  }
-
-
-  private static final Class  customLauncherClass;
-  private static final Method customLoadLibraryMethod;
-
-  // FIXME centralize logging
-  static {
-    Class launcherClass = null;
-    Method loadLibraryMethod = null;
-
-    if ( Debug.getBooleanProperty("sun.jnlp.applet.launcher", false) ) {
-        try {
-            launcherClass = Class.forName("org.jdesktop.applet.util.JNLPAppletLauncher");
-            loadLibraryMethod = launcherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class });
-        } catch (ClassNotFoundException ex) {
-            if(DEBUG) {
-                ex.printStackTrace();
-            }
-        } catch (NoSuchMethodException ex) {
-            if(DEBUG) {
-                ex.printStackTrace();
-            }
-            launcherClass = null;
-        }
-    }
-
-    if(null==launcherClass) {
-        String launcherClassName = Debug.getProperty("jnlp.launcher.class", false);
-        if(null!=launcherClassName) {
-            try {
-                launcherClass = Class.forName(launcherClassName);
-                loadLibraryMethod = launcherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class });
-            } catch (ClassNotFoundException ex) {
-                if(DEBUG) {
-                    ex.printStackTrace();
-                }
-            } catch (NoSuchMethodException ex) {
-                if(DEBUG) {
-                    ex.printStackTrace();
-                }
-                launcherClass = null;
-            }
-        }
-    }
-
-    customLauncherClass = launcherClass;
-    customLoadLibraryMethod = loadLibraryMethod;
-  }
-
-  private static void loadLibraryInternal(String libraryName) {
-    // Note: special-casing JAWT which is built in to the JDK
-    if (null!=customLoadLibraryMethod && !libraryName.equals("jawt")) {
-        try {
-          customLoadLibraryMethod.invoke(null, new Object[] { libraryName });
-        } catch (Exception e) {
-          Throwable t = e;
-          if (t instanceof InvocationTargetException) {
-            t = ((InvocationTargetException) t).getTargetException();
-          }
-          if (t instanceof Error)
-            throw (Error) t;
-          if (t instanceof RuntimeException) {
-            throw (RuntimeException) t;
-          }
-          // Throw UnsatisfiedLinkError for best compatibility with System.loadLibrary()
-          throw (UnsatisfiedLinkError)new UnsatisfiedLinkError("can not load library "+libraryName).initCause(e);
-        }
-    } else {
-      // System.out.println("sun.boot.library.path=" + Debug.getProperty("sun.boot.library.path", false));
-      System.loadLibrary(libraryName);
-    }
-  }
-}
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeWindowFactoryImpl.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeWindowFactoryImpl.java
index e84264bd0..d2429cdab 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeWindowFactoryImpl.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/NativeWindowFactoryImpl.java
@@ -32,6 +32,7 @@
 
 package com.jogamp.nativewindow.impl;
 
+import com.jogamp.common.util.*;
 import java.lang.reflect.*;
 import java.security.*;
 
@@ -55,7 +56,7 @@ public class NativeWindowFactoryImpl extends NativeWindowFactory {
             throw new IllegalArgumentException("AbstractGraphicsConfiguration is null with a non NativeWindow object");
         }
 
-        if (NWReflection.isAWTComponent(winObj)) {
+        if (ReflectionUtil.instanceOf(winObj, "java.awt.Component")) {
             return getAWTNativeWindow(winObj, config);
         }
 
@@ -86,7 +87,7 @@ public class NativeWindowFactoryImpl extends NativeWindowFactory {
                     throw new IllegalArgumentException("OS " + getNativeOSName(false) + " not yet supported");
                 }
 
-                nativeWindowConstructor = NWReflection.getConstructor(windowClassName, new Class[] { Object.class, AbstractGraphicsConfiguration.class });
+                nativeWindowConstructor = ReflectionUtil.getConstructor(windowClassName, new Class[] { Object.class, AbstractGraphicsConfiguration.class });
             } catch (Exception e) {
                 throw (IllegalArgumentException) new IllegalArgumentException().initCause(e);
             }
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTJNILibLoader.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTJNILibLoader.java
new file mode 100644
index 000000000..4ea404c09
--- /dev/null
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTJNILibLoader.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * - Redistribution of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * 
+ * - Redistribution in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ * 
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ * 
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.jogamp.nativewindow.impl.jawt;
+
+import javax.media.nativewindow.NativeWindowFactory;
+import com.jogamp.nativewindow.impl.NWJNILibLoader;
+
+import java.awt.Toolkit;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+public class JAWTJNILibLoader extends NWJNILibLoader {
+  public static void loadAWTImpl() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        // Make sure that awt.dll is loaded before loading jawt.dll. Otherwise
+        // a Dialog with "awt.dll not found" might pop up.
+        // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4481947.
+        Toolkit.getDefaultToolkit();
+        
+        // Must pre-load JAWT on all non-Mac platforms to
+        // ensure references from jogl_awt shared object
+        // will succeed since JAWT shared object isn't in
+        // default library path
+        if ( ! NativeWindowFactory.TYPE_MACOSX.equals( NativeWindowFactory.getNativeWindowType(false) ) ) {
+            try {
+                loadLibrary("jawt", null, true);
+            } catch (Throwable t) {
+                // It might be ok .. if it's already loaded
+                if(DEBUG) {
+                    t.printStackTrace();
+                }
+            }
+        }
+        return null;
+      }
+    });
+  }
+}
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTNativeLibLoader.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTNativeLibLoader.java
deleted file mode 100644
index 9be343a7a..000000000
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTNativeLibLoader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- * 
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.jogamp.nativewindow.impl.jawt;
-
-import javax.media.nativewindow.NativeWindowFactory;
-import com.jogamp.nativewindow.impl.NativeLibLoaderBase;
-
-import java.awt.Toolkit;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-public class JAWTNativeLibLoader extends NativeLibLoaderBase {
-  public static void loadAWTImpl() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        // Make sure that awt.dll is loaded before loading jawt.dll. Otherwise
-        // a Dialog with "awt.dll not found" might pop up.
-        // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4481947.
-        Toolkit.getDefaultToolkit();
-        
-        // Must pre-load JAWT on all non-Mac platforms to
-        // ensure references from jogl_awt shared object
-        // will succeed since JAWT shared object isn't in
-        // default library path
-        if ( ! NativeWindowFactory.TYPE_MACOSX.equals( NativeWindowFactory.getNativeWindowType(false) ) ) {
-            try {
-                loadLibrary("jawt", null, true);
-            } catch (Throwable t) {
-                // It might be ok .. if it's already loaded
-                if(DEBUG) {
-                    t.printStackTrace();
-                }
-            }
-        }
-        return null;
-      }
-    });
-  }
-}
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTUtil.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTUtil.java
index 2c88b308f..b3c706ed8 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTUtil.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jawt/JAWTUtil.java
@@ -54,8 +54,8 @@ public class JAWTUtil {
   private static final boolean j2dExist;
 
   static {
-    JAWTNativeLibLoader.loadAWTImpl();
-    JAWTNativeLibLoader.loadNativeWindow("awt");
+    JAWTJNILibLoader.loadAWTImpl();
+    JAWTJNILibLoader.loadNativeWindow("awt");
 
     lockedStack   = null;
     headlessMode = GraphicsEnvironment.isHeadless();
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jvm/JVMUtil.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/jvm/JVMUtil.java
deleted file mode 100644
index df703aa55..000000000
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/jvm/JVMUtil.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- */
-
-package com.jogamp.nativewindow.impl.jvm;
-
-import java.nio.ByteBuffer;
-import com.jogamp.nativewindow.impl.*;
-
-/**
- * Currently this tool works around the Hotspot race condition bugs:
- <PRE>
-     4395095 JNI access to java.nio DirectBuffer constructor/accessor
-     6852404 Race condition in JNI Direct Buffer access and creation routines
- </PRE>
- *
- * Make sure to initialize this class as soon as possible,
- * before doing any multithreading work.
- *
- */
-public class JVMUtil {
-    private static final boolean DEBUG = Debug.debug("JVMUtil");
-
-    static {
-        NativeLibLoaderBase.loadNativeWindow("jvm");
-
-        ByteBuffer buffer = InternalBufferUtil.newByteBuffer(64);
-        if( ! initialize(buffer) ) {
-            throw new RuntimeException("Failed to initialize the JVMUtil "+Thread.currentThread().getName());
-        }
-        if(DEBUG) {
-            Exception e = new Exception("JVMUtil.initSingleton() .. initialized "+Thread.currentThread().getName());
-            e.printStackTrace();
-        }
-    }
-
-    public static void initSingleton() {
-    }
-
-    private JVMUtil() {}
-
-    private static native boolean initialize(java.nio.ByteBuffer buffer);
-}
-
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/impl/x11/X11Util.java b/src/nativewindow/classes/com/jogamp/nativewindow/impl/x11/X11Util.java
index 41ffccc42..5f5c10885 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/impl/x11/X11Util.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/impl/x11/X11Util.java
@@ -53,7 +53,7 @@ public class X11Util {
     private static final boolean DEBUG = Debug.debug("X11Util");
 
     static {
-        NativeLibLoaderBase.loadNativeWindow("x11");
+        NWJNILibLoader.loadNativeWindow("x11");
         installIOErrorHandler();
     }
 
diff --git a/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java b/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
index a8b67fddc..c692e51c4 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
@@ -35,6 +35,7 @@ package javax.media.nativewindow;
 import java.lang.reflect.*;
 import java.util.*;
 
+import com.jogamp.common.util.*;
 import com.jogamp.nativewindow.impl.*;
 
 /**
@@ -77,7 +78,7 @@ public abstract class GraphicsConfigurationFactory {
         if (NativeWindowFactory.TYPE_X11.equals(NativeWindowFactory.getNativeWindowType(true))) {
             try {
                 GraphicsConfigurationFactory factory = (GraphicsConfigurationFactory)
-                    NWReflection.createInstance("com.jogamp.nativewindow.impl.x11.X11GraphicsConfigurationFactory", new Object[] {});
+                    ReflectionUtil.createInstance("com.jogamp.nativewindow.impl.x11.X11GraphicsConfigurationFactory", new Object[] {});
                 registerFactory(javax.media.nativewindow.x11.X11GraphicsDevice.class, factory);
             } catch (Exception e) {
                 throw new RuntimeException(e);
diff --git a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java
index 5b1bf54bb..944fdee74 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java
@@ -36,8 +36,9 @@ import java.lang.reflect.*;
 import java.security.*;
 import java.util.*;
 
+import com.jogamp.common.util.*;
+import com.jogamp.common.jvm.JVMUtil;
 import com.jogamp.nativewindow.impl.*;
-import com.jogamp.nativewindow.impl.jvm.JVMUtil;
 
 /** Provides a pluggable mechanism for arbitrary window toolkits to
     adapt their components to the {@link NativeWindow} interface,
@@ -123,10 +124,10 @@ public abstract class NativeWindowFactory {
         // make it easier to run this code on mobile devices
 
         Class componentClass = null;
-        if ( NWReflection.isClassAvailable("java.awt.Component") &&
-             NWReflection.isClassAvailable("javax.media.nativewindow.awt.AWTGraphicsDevice") ) {
+        if ( ReflectionUtil.isClassAvailable("java.awt.Component") &&
+             ReflectionUtil.isClassAvailable("javax.media.nativewindow.awt.AWTGraphicsDevice") ) {
             try {
-                componentClass = NWReflection.getClass("java.awt.Component", false);
+                componentClass = ReflectionUtil.getClass("java.awt.Component", false);
             } catch (Exception e) { }
         }
 
@@ -177,7 +178,7 @@ public abstract class NativeWindowFactory {
 
             try {
                 Constructor factoryConstructor =
-                    NWReflection.getConstructor("com.jogamp.nativewindow.impl.x11.awt.X11AWTNativeWindowFactory", new Class[] {});
+                    ReflectionUtil.getConstructor("com.jogamp.nativewindow.impl.x11.awt.X11AWTNativeWindowFactory", new Class[] {});
                 _factory = (NativeWindowFactory) factoryConstructor.newInstance(null);
             } catch (Exception e) { }
         }
@@ -185,7 +186,7 @@ public abstract class NativeWindowFactory {
         if (toolkitLockForced && null==_factory) {
             try {
                 Constructor factoryConstructor =
-                    NWReflection.getConstructor("com.jogamp.nativewindow.impl.LockingNativeWindowFactory", new Class[] {});
+                    ReflectionUtil.getConstructor("com.jogamp.nativewindow.impl.LockingNativeWindowFactory", new Class[] {});
                 _factory = (NativeWindowFactory) factoryConstructor.newInstance(null);
             } catch (Exception e) { }
         }
diff --git a/src/nativewindow/native/JVM_Tool.c b/src/nativewindow/native/JVM_Tool.c
deleted file mode 100644
index ce827129c..000000000
--- a/src/nativewindow/native/JVM_Tool.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- * 
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-#include <jni.h>
-
-JNIEXPORT jboolean JNICALL
-Java_com_jogamp_nativewindow_impl_jvm_JVMUtil_initialize(JNIEnv *env, jclass _unused, jobject nioBuffer) {
-  int res;
-  void * ptr = NULL;
-  if (nioBuffer != NULL) {
-        ptr = (void *) (*env)->GetDirectBufferAddress(env, nioBuffer);
-  }
-  return ( NULL==ptr ) ? JNI_FALSE : JNI_TRUE ;
-}
-
diff --git a/src/nativewindow/native/x11/Xmisc.c b/src/nativewindow/native/x11/Xmisc.c
index 4320a8f12..52449ae84 100644
--- a/src/nativewindow/native/x11/Xmisc.c
+++ b/src/nativewindow/native/x11/Xmisc.c
@@ -128,6 +128,7 @@ static void _FatalError(JNIEnv *env, const char* msg, ...)
     va_end(ap);
 
     fprintf(stderr, buffer);
+    fprintf(stderr, "\n");
     (*env)->FatalError(env, buffer);
 }
 
@@ -201,32 +202,54 @@ static void _throwNewRuntimeException(Display * unlockDisplay, JNIEnv *env, cons
     (*env)->ThrowNew(env, clazzRuntimeException, buffer);
 }
 
+static JNIEnv * x11ErrorHandlerJNIEnv = NULL;
+static XErrorHandler origErrorHandler = NULL ;
+
+static int x11ErrorHandler(Display *dpy, XErrorEvent *e)
+{
+    _throwNewRuntimeException(NULL, x11ErrorHandlerJNIEnv, "Nativewindow X11 Error: Display %p, Code 0x%X", dpy, e->error_code);
+
+    return 0;
+}
+
+static void x11ErrorHandlerEnable(int onoff, JNIEnv * env) {
+    if(onoff) {
+        if(NULL==origErrorHandler) {
+            x11ErrorHandlerJNIEnv = env;
+            origErrorHandler = XSetErrorHandler(x11ErrorHandler);
+        }
+    } else {
+        XSetErrorHandler(origErrorHandler);
+        origErrorHandler = NULL;
+    }
+}
+
+
 static XIOErrorHandler origIOErrorHandler = NULL;
-static JNIEnv * displayIOErrorHandlerJNIEnv = NULL;
 
-static int displayIOErrorHandler(Display *dpy)
+static int x11IOErrorHandler(Display *dpy)
 {
-    _FatalError(displayIOErrorHandlerJNIEnv, "Nativewindow X11 IOError: Display %p not available", dpy);
+    _FatalError(x11ErrorHandlerJNIEnv, "Nativewindow X11 IOError: Display %p not available", dpy);
     origIOErrorHandler(dpy);
     return 0;
 }
 
-static void displayIOErrorHandlerEnable(int onoff, JNIEnv * env) {
+static void x11IOErrorHandlerEnable(int onoff, JNIEnv * env) {
     if(onoff) {
         if(NULL==origIOErrorHandler) {
-            displayIOErrorHandlerJNIEnv = env;
-            origIOErrorHandler = XSetIOErrorHandler(displayIOErrorHandler);
+            x11ErrorHandlerJNIEnv = env;
+            origIOErrorHandler = XSetIOErrorHandler(x11IOErrorHandler);
         }
     } else {
         XSetIOErrorHandler(origIOErrorHandler);
         origIOErrorHandler = NULL;
-        displayIOErrorHandlerJNIEnv = NULL;
     }
 }
 
 JNIEXPORT void JNICALL 
 Java_com_jogamp_nativewindow_impl_x11_X11Util_installIOErrorHandler(JNIEnv *env, jclass _unused) {
-    displayIOErrorHandlerEnable(1, env);
+    x11ErrorHandlerEnable(1, env);
+    x11IOErrorHandlerEnable(1, env);
 }
 
 JNIEXPORT jlong JNICALL 
@@ -345,6 +368,7 @@ Java_com_jogamp_nativewindow_impl_x11_X11Lib_XCloseDisplay__J(JNIEnv *env, jclas
  * Class:     com_jogamp_nativewindow_impl_x11_X11Lib
  * Method:    CreateDummyWindow
  * Signature: (JIJ)J
+ */
 JNIEXPORT jlong JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_CreateDummyWindow
   (JNIEnv *env, jobject obj, jlong display, jint screen_index, jlong visualID)
 {
@@ -370,7 +394,7 @@ JNIEXPORT jlong JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_CreateDummy
     }
 
     if(visualID<0) {
-        _throwNewRuntimeException(NULL, env, "invalid VisualID ..\n");
+        _throwNewRuntimeException(NULL, env, "invalid VisualID ..");
         return 0;
     }
 
@@ -396,7 +420,7 @@ JNIEXPORT jlong JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_CreateDummy
 
     if (visual==NULL)
     { 
-        _throwNewRuntimeException(dpy, env, "could not query Visual by given VisualID, bail out!\n");
+        _throwNewRuntimeException(dpy, env, "could not query Visual by given VisualID, bail out!");
         return 0;
     } 
 
@@ -440,13 +464,13 @@ JNIEXPORT jlong JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_CreateDummy
 
     return (jlong) window;
 }
- */
 
 
 /*
  * Class:     com_jogamp_nativewindow_impl_x11_X11Lib
  * Method:    DestroyDummyWindow
  * Signature: (JJ)V
+ */
 JNIEXPORT void JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_DestroyDummyWindow
   (JNIEnv *env, jobject obj, jlong display, jlong window)
 {
@@ -454,7 +478,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_DestroyDummy
     Window      w = (Window) window;
 
     if(NULL==dpy) {
-        _throwNewRuntimeException(NULL, env, "invalid display connection..\n");
+        _throwNewRuntimeException(NULL, env, "invalid display connection..");
         return;
     }
     XLockDisplay(dpy) ;
@@ -467,5 +491,3 @@ JNIEXPORT void JNICALL Java_com_jogamp_nativewindow_impl_x11_X11Lib_DestroyDummy
 
     XUnlockDisplay(dpy) ;
 }
- */
-
diff --git a/src/newt/classes/com/jogamp/newt/NewtFactory.java b/src/newt/classes/com/jogamp/newt/NewtFactory.java
index 2a696aa07..2d5c10c52 100755
--- a/src/newt/classes/com/jogamp/newt/NewtFactory.java
+++ b/src/newt/classes/com/jogamp/newt/NewtFactory.java
@@ -36,7 +36,7 @@ package com.jogamp.newt;
 import javax.media.nativewindow.*;
 import java.util.ArrayList;
 import java.util.Iterator;
-import com.jogamp.nativewindow.impl.jvm.JVMUtil;
+import com.jogamp.common.jvm.JVMUtil;
 
 public abstract class NewtFactory {
     // Work-around for initialization order problems on Mac OS X
diff --git a/src/newt/classes/com/jogamp/newt/Window.java b/src/newt/classes/com/jogamp/newt/Window.java
index 8f09ae364..5123ab19f 100755
--- a/src/newt/classes/com/jogamp/newt/Window.java
+++ b/src/newt/classes/com/jogamp/newt/Window.java
@@ -36,8 +36,8 @@ package com.jogamp.newt;
 import com.jogamp.newt.impl.Debug;
 import com.jogamp.newt.util.EDTUtil;
 
+import com.jogamp.common.util.*;
 import javax.media.nativewindow.*;
-import com.jogamp.nativewindow.impl.NWReflection;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -127,7 +127,7 @@ public abstract class Window implements NativeWindow
             if ( argsChecked < cstrArguments.length ) {
                 throw new NativeWindowException("WindowClass "+windowClass+" constructor mismatch at argument #"+argsChecked+"; Constructor: "+getTypeStrList(cstrArgumentTypes)+", arguments: "+getArgsStrList(cstrArguments));
             }
-            Window window = (Window) NWReflection.createInstance( windowClass, cstrArgumentTypes, cstrArguments ) ;
+            Window window = (Window) ReflectionUtil.createInstance( windowClass, cstrArgumentTypes, cstrArguments ) ;
             window.invalidate();
             window.screen   = screen;
             window.setUndecorated(undecorated);
@@ -144,7 +144,6 @@ public abstract class Window implements NativeWindow
             }
             return window;
         } catch (Throwable t) {
-            t.printStackTrace();
             throw new NativeWindowException(t);
         }
     }
diff --git a/src/newt/classes/com/jogamp/newt/impl/NEWTJNILibLoader.java b/src/newt/classes/com/jogamp/newt/impl/NEWTJNILibLoader.java
new file mode 100644
index 000000000..a4d234fd5
--- /dev/null
+++ b/src/newt/classes/com/jogamp/newt/impl/NEWTJNILibLoader.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * - Redistribution of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * 
+ * - Redistribution in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ * 
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ * 
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.jogamp.newt.impl;
+
+// FIXME: refactor Java SE dependencies
+//import java.awt.Toolkit;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.HashSet;
+import com.jogamp.common.jvm.JNILibLoaderBase;
+
+public class NEWTJNILibLoader extends JNILibLoaderBase {
+  
+  public static void loadNEWT() {
+    AccessController.doPrivileged(new PrivilegedAction() {
+      public Object run() {
+        loadLibrary("newt", null, true);
+        return null;
+      }
+    });
+  }
+
+}
diff --git a/src/newt/classes/com/jogamp/newt/impl/NativeLibLoader.java b/src/newt/classes/com/jogamp/newt/impl/NativeLibLoader.java
deleted file mode 100644
index 52e4c0dc3..000000000
--- a/src/newt/classes/com/jogamp/newt/impl/NativeLibLoader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * - Redistribution of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * 
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- * 
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.jogamp.newt.impl;
-
-// FIXME: refactor Java SE dependencies
-//import java.awt.Toolkit;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.HashSet;
-import com.jogamp.nativewindow.impl.NativeLibLoaderBase;
-
-public class NativeLibLoader extends NativeLibLoaderBase {
-  
-  public static void loadNEWT() {
-    AccessController.doPrivileged(new PrivilegedAction() {
-      public Object run() {
-        loadLibrary("newt", null, true);
-        return null;
-      }
-    });
-  }
-
-}
diff --git a/src/newt/classes/com/jogamp/newt/intel/gdl/Display.java b/src/newt/classes/com/jogamp/newt/intel/gdl/Display.java
index eb93943ee..a3e5501c4 100644
--- a/src/newt/classes/com/jogamp/newt/intel/gdl/Display.java
+++ b/src/newt/classes/com/jogamp/newt/intel/gdl/Display.java
@@ -40,7 +40,7 @@ public class Display extends com.jogamp.newt.Display {
     static int initCounter = 0;
 
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if (!Screen.initIDs()) {
             throw new NativeWindowException("Failed to initialize GDL Screen jmethodIDs");
diff --git a/src/newt/classes/com/jogamp/newt/macosx/MacDisplay.java b/src/newt/classes/com/jogamp/newt/macosx/MacDisplay.java
index 2f86125f8..0b5297685 100755
--- a/src/newt/classes/com/jogamp/newt/macosx/MacDisplay.java
+++ b/src/newt/classes/com/jogamp/newt/macosx/MacDisplay.java
@@ -41,7 +41,7 @@ import com.jogamp.newt.util.MainThread;
 
 public class MacDisplay extends Display {
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if(!initNSApplication()) {
             throw new NativeWindowException("Failed to initialize native Application hook");
diff --git a/src/newt/classes/com/jogamp/newt/opengl/broadcom/egl/Display.java b/src/newt/classes/com/jogamp/newt/opengl/broadcom/egl/Display.java
index a375181ac..999a407ec 100644
--- a/src/newt/classes/com/jogamp/newt/opengl/broadcom/egl/Display.java
+++ b/src/newt/classes/com/jogamp/newt/opengl/broadcom/egl/Display.java
@@ -41,7 +41,7 @@ import javax.media.nativewindow.egl.*;
 public class Display extends com.jogamp.newt.Display {
 
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if (!Window.initIDs()) {
             throw new NativeWindowException("Failed to initialize BCEGL Window jmethodIDs");
diff --git a/src/newt/classes/com/jogamp/newt/opengl/kd/KDDisplay.java b/src/newt/classes/com/jogamp/newt/opengl/kd/KDDisplay.java
index b09568237..6a28f992b 100755
--- a/src/newt/classes/com/jogamp/newt/opengl/kd/KDDisplay.java
+++ b/src/newt/classes/com/jogamp/newt/opengl/kd/KDDisplay.java
@@ -42,7 +42,7 @@ import javax.media.nativewindow.egl.*;
 public class KDDisplay extends Display {
 
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if (!KDWindow.initIDs()) {
             throw new NativeWindowException("Failed to initialize KDWindow jmethodIDs");
diff --git a/src/newt/classes/com/jogamp/newt/util/MainThread.java b/src/newt/classes/com/jogamp/newt/util/MainThread.java
index 6cd4f8c69..daa09edce 100644
--- a/src/newt/classes/com/jogamp/newt/util/MainThread.java
+++ b/src/newt/classes/com/jogamp/newt/util/MainThread.java
@@ -43,10 +43,10 @@ import java.security.*;
 
 import javax.media.nativewindow.*;
 
+import com.jogamp.common.util.*;
 import com.jogamp.newt.*;
 import com.jogamp.newt.impl.*;
 import com.jogamp.newt.macosx.MacDisplay;
-import com.jogamp.nativewindow.impl.NWReflection;
 
 /**
  * NEWT Utility class MainThread<P>
@@ -116,7 +116,7 @@ public class MainThread {
 
             // start user app ..
             try {
-                Class mainClass = NWReflection.getClass(mainClassName, true);
+                Class mainClass = ReflectionUtil.getClass(mainClassName, true);
                 if(null==mainClass) {
                     throw new RuntimeException(new ClassNotFoundException("MainThread couldn't find main class "+mainClassName));
                 }
@@ -159,7 +159,7 @@ public class MainThread {
             System.arraycopy(args, 1, mainClassArgs, 0, args.length-1);
         }
 
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
         
         shouldStop = false;
         tasks = new ArrayList();
diff --git a/src/newt/classes/com/jogamp/newt/windows/WindowsDisplay.java b/src/newt/classes/com/jogamp/newt/windows/WindowsDisplay.java
index 05cab1a0a..281022901 100755
--- a/src/newt/classes/com/jogamp/newt/windows/WindowsDisplay.java
+++ b/src/newt/classes/com/jogamp/newt/windows/WindowsDisplay.java
@@ -45,7 +45,7 @@ public class WindowsDisplay extends Display {
     private static long hInstance;
 
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if (!WindowsWindow.initIDs()) {
             throw new NativeWindowException("Failed to initialize WindowsWindow jmethodIDs");
diff --git a/src/newt/classes/com/jogamp/newt/x11/X11Display.java b/src/newt/classes/com/jogamp/newt/x11/X11Display.java
index 5fd6d9640..c8faefbf1 100755
--- a/src/newt/classes/com/jogamp/newt/x11/X11Display.java
+++ b/src/newt/classes/com/jogamp/newt/x11/X11Display.java
@@ -41,7 +41,7 @@ import com.jogamp.nativewindow.impl.x11.X11Util;
 
 public class X11Display extends Display {
     static {
-        NativeLibLoader.loadNEWT();
+        NEWTJNILibLoader.loadNEWT();
 
         if (!initIDs()) {
             throw new NativeWindowException("Failed to initialize X11Display jmethodIDs");
diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c
index 33c5324e2..296172f6e 100755
--- a/src/newt/native/X11Window.c
+++ b/src/newt/native/X11Window.c
@@ -159,11 +159,11 @@ static void _FatalError(JNIEnv *env, const char* msg, ...)
     va_end(ap);
 
     fprintf(stderr, buffer);
+    fprintf(stderr, "\n");
     (*env)->FatalError(env, buffer);
 }
 
-static const char * const ClazzNameRuntimeException = 
-                            "java/lang/RuntimeException";
+static const char * const ClazzNameRuntimeException = "java/lang/RuntimeException";
 static jclass    runtimeExceptionClz=NULL;
 
 static const char * const ClazzNameNewtWindow = 
@@ -200,6 +200,7 @@ static void _throwNewRuntimeException(Display * unlockDisplay, JNIEnv *env, cons
  */
 
 
+static JNIEnv * x11ErrorHandlerJNIEnv = NULL;
 static XErrorHandler origErrorHandler = NULL ;
 
 static int displayDispatchErrorHandler(Display *dpy, XErrorEvent *e)
@@ -213,15 +214,16 @@ static int displayDispatchErrorHandler(Display *dpy, XErrorEvent *e)
     {
         fprintf(stderr, "         BadWindow (%p): Window probably already removed\n", e->resourceid);
     } else {
-        return origErrorHandler(dpy, e);
+        _throwNewRuntimeException(NULL, x11ErrorHandlerJNIEnv, "NEWT X11 Error: Display %p, Code 0x%X", dpy, e->error_code);
     }
 
     return 0;
 }
 
-static void displayDispatchErrorHandlerEnable(int onoff) {
+static void displayDispatchErrorHandlerEnable(int onoff, JNIEnv * env) {
     if(onoff) {
         if(NULL==origErrorHandler) {
+            x11ErrorHandlerJNIEnv = env;
             origErrorHandler = XSetErrorHandler(displayDispatchErrorHandler);
         }
     } else {
@@ -329,13 +331,13 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_x11_X11Display_CompleteDisplay
 
     javaObjectAtom = (jlong) XInternAtom(dpy, "JOGL_JAVA_OBJECT", False);
     if(None==javaObjectAtom) {
-        _throwNewRuntimeException(dpy, env, "could not create Atom JOGL_JAVA_OBJECT, bail out!\n");
+        _throwNewRuntimeException(dpy, env, "could not create Atom JOGL_JAVA_OBJECT, bail out!");
         return;
     }
 
     windowDeleteAtom = (jlong) XInternAtom(dpy, "WM_DELETE_WINDOW", False);
     if(None==windowDeleteAtom) {
-        _throwNewRuntimeException(dpy, env, "could not create Atom WM_DELETE_WINDOW, bail out!\n");
+        _throwNewRuntimeException(dpy, env, "could not create Atom WM_DELETE_WINDOW, bail out!");
         return;
     }
 
@@ -371,7 +373,7 @@ static void setJavaWindowProperty(JNIEnv *env, Display *dpy, Window window, jlon
     {
         jobject test = (jobject) getPtrOut32Long(jogl_java_object_data);
         if( ! (jwindow==test) ) {
-            _throwNewRuntimeException(dpy, env, "Internal Error .. Encoded Window ref not the same %p != %p !\n", jwindow, test);
+            _throwNewRuntimeException(dpy, env, "Internal Error .. Encoded Window ref not the same %p != %p !", jwindow, test);
             return;
         }
     }
@@ -415,7 +417,7 @@ static jobject getJavaWindowProperty(JNIEnv *env, Display *dpy, Window window, j
 
 #ifdef VERBOSE_ON
     if(JNI_FALSE == (*env)->IsInstanceOf(env, jwindow, newtWindowClz)) {
-        _throwNewRuntimeException(dpy, env, "fetched Atom JOGL_JAVA_OBJECT window is not a NEWT Window: javaWindow 0x%X !\n", jwindow);
+        _throwNewRuntimeException(dpy, env, "fetched Atom JOGL_JAVA_OBJECT window is not a NEWT Window: javaWindow 0x%X !", jwindow);
     }
 #endif
     return jwindow;
@@ -457,20 +459,20 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_x11_X11Display_DispatchMessages
         num_events--;
 
         if( 0==evt.xany.window ) {
-            _throwNewRuntimeException(dpy, env, "event window NULL, bail out!\n");
+            _throwNewRuntimeException(dpy, env, "event window NULL, bail out!");
             return ;
         }
 
         if(dpy!=evt.xany.display) {
-            _throwNewRuntimeException(dpy, env, "wrong display, bail out!\n");
+            _throwNewRuntimeException(dpy, env, "wrong display, bail out!");
             return ;
         }
 
-        displayDispatchErrorHandlerEnable(1);
+        displayDispatchErrorHandlerEnable(1, env);
 
         jwindow = getJavaWindowProperty(env, dpy, evt.xany.window, javaObjectAtom);
 
-        displayDispatchErrorHandlerEnable(0);
+        displayDispatchErrorHandlerEnable(0, env);
 
         if(NULL==jwindow) {
             fprintf(stderr, "Warning: NEWT X11 DisplayDispatch %p, Couldn't handle event %d for invalid X11 window %p\n", 
@@ -685,7 +687,7 @@ JNIEXPORT jlong JNICALL Java_com_jogamp_newt_x11_X11Window_CreateWindow
     }
 
     if(visualID<0) {
-        _throwNewRuntimeException(NULL, env, "invalid VisualID ..\n");
+        _throwNewRuntimeException(NULL, env, "invalid VisualID ..");
         return 0;
     }
 
@@ -712,7 +714,7 @@ JNIEXPORT jlong JNICALL Java_com_jogamp_newt_x11_X11Window_CreateWindow
 
     if (visual==NULL)
     { 
-        _throwNewRuntimeException(dpy, env, "could not query Visual by given VisualID, bail out!\n");
+        _throwNewRuntimeException(dpy, env, "could not query Visual by given VisualID, bail out!");
         return 0;
     } 
 
@@ -797,11 +799,11 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_x11_X11Window_CloseWindow
 
     jwindow = getJavaWindowProperty(env, dpy, w, javaObjectAtom);
     if(NULL==jwindow) {
-        _throwNewRuntimeException(dpy, env, "could not fetch Java Window object, bail out!\n");
+        _throwNewRuntimeException(dpy, env, "could not fetch Java Window object, bail out!");
         return;
     }
     if ( JNI_FALSE == (*env)->IsSameObject(env, jwindow, obj) ) {
-        _throwNewRuntimeException(dpy, env, "Internal Error .. Window global ref not the same!\n");
+        _throwNewRuntimeException(dpy, env, "Internal Error .. Window global ref not the same!");
         return;
     }
     (*env)->DeleteGlobalRef(env, jwindow);
-- 
cgit v1.2.3