diff --git a/GL/config.h b/GL/config.h
index b908a5a..5cd9d05 100644
--- a/GL/config.h
+++ b/GL/config.h
@@ -2,7 +2,7 @@
 #define CONFIG_H
 
 
-#define MAX_TEXTURE_COUNT 512
+#define MAX_TEXTURE_COUNT 512 //@Todo: or 1088 explain why increased. mrneo240
 
 
 #endif // CONFIG_H
diff --git a/GL/draw.c b/GL/draw.c
index 3e6cec7..8a5a26e 100644
--- a/GL/draw.c
+++ b/GL/draw.c
@@ -1288,7 +1288,7 @@ void APIENTRY glEnableClientState(GLenum cap) {
             (ENABLED_VERTEX_ATTRIBUTES |= UV_ENABLED_FLAG);
     break;
     default:
-        _glKosThrowError(GL_INVALID_ENUM, "glEnableClientState");
+        _glKosThrowError(GL_INVALID_ENUM, __func__);
     }
 }
 
@@ -1311,7 +1311,7 @@ void APIENTRY glDisableClientState(GLenum cap) {
             (ENABLED_VERTEX_ATTRIBUTES &= ~UV_ENABLED_FLAG);
     break;
     default:
-        _glKosThrowError(GL_INVALID_ENUM, "glDisableClientState");
+        _glKosThrowError(GL_INVALID_ENUM, __func__);
     }
 }
 
@@ -1324,7 +1324,7 @@ void APIENTRY glClientActiveTextureARB(GLenum texture) {
     //TRACE();
 
     if(texture < GL_TEXTURE0_ARB || texture > GL_TEXTURE0_ARB + MAX_TEXTURE_UNITS) {
-        _glKosThrowError(GL_INVALID_ENUM, "glClientActiveTextureARB");
+        _glKosThrowError(GL_INVALID_ENUM,  __func__);
     }
 
     if(_glKosHasError()) {
diff --git a/GL/error.c b/GL/error.c
index 459fa29..49732e5 100644
--- a/GL/error.c
+++ b/GL/error.c
@@ -57,6 +57,7 @@ void _glKosPrintError() {
     }
 
     fprintf(stderr, "GL ERROR: %s when calling %s\n", _glErrorEnumAsString(last_error), error_function);
+    _glKosResetError();
 }
 
 GLenum glGetError(void) {
diff --git a/GL/flush.c b/GL/flush.c
index 1d53999..0afd625 100644
--- a/GL/flush.c
+++ b/GL/flush.c
@@ -94,24 +94,28 @@ void APIENTRY glKosSwapBuffers() {
 
     TRACE();
 
-    profiler_push(__func__);
+    PROFILER_PUSH(__func__);
 
     pvr_wait_ready();
 
+
     pvr_scene_begin();
         QACR0 = QACRTA;
         QACR1 = QACRTA;
 
         pvr_list_begin(PVR_LIST_OP_POLY);
         pvr_list_submit(OP_LIST.vector.data, OP_LIST.vector.size);
+        printf("OP_POLY: data: %p size:%d\n",OP_LIST.vector.data,OP_LIST.vector.size);
         pvr_list_finish();
 
         pvr_list_begin(PVR_LIST_PT_POLY);
         pvr_list_submit(PT_LIST.vector.data, PT_LIST.vector.size);
+        printf("PT_POLY: data: %p size:%d\n",PT_LIST.vector.data,PT_LIST.vector.size);
         pvr_list_finish();
 
         pvr_list_begin(PVR_LIST_TR_POLY);
         pvr_list_submit(TR_LIST.vector.data, TR_LIST.vector.size);
+        printf("TR_POLY: data: %p size:%d\n",TR_LIST.vector.data,TR_LIST.vector.size);
         pvr_list_finish();
     pvr_scene_finish();
 
@@ -119,11 +123,12 @@ void APIENTRY glKosSwapBuffers() {
     aligned_vector_clear(&PT_LIST.vector);
     aligned_vector_clear(&TR_LIST.vector);
 
-    profiler_checkpoint("scene");
-    profiler_pop();
-
+    PROFILER_CHECKPOINT("scene");
+    PROFILER_POP();
+    #ifdef PROFILER_COMPILE
     if(frame_count++ > 100) {
         profiler_print_stats();
         frame_count = 0;
     }
+    #endif
 }
diff --git a/GL/framebuffer.c b/GL/framebuffer.c
index 1034c1a..d06d72f 100644
--- a/GL/framebuffer.c
+++ b/GL/framebuffer.c
@@ -186,7 +186,7 @@ GLboolean _glCalculateAverageTexel(const GLubyte* src, const GLuint srcWidth, co
         *d1 = (r << 11 | g << 5 | b);
     } else {
         fprintf(stderr, "ERROR: Unsupported PVR format for mipmap generation");
-        _glKosThrowError(GL_INVALID_OPERATION, "glGenerateMipmapEXT");
+        _glKosThrowError(GL_INVALID_OPERATION,  __func__);
         _glKosPrintError();
         return GL_FALSE;
     }
diff --git a/GL/matrix.c b/GL/matrix.c
index 85f0233..f70aac8 100644
--- a/GL/matrix.c
+++ b/GL/matrix.c
@@ -9,7 +9,7 @@
 #define DEG2RAD (0.01745329251994329576923690768489)
 
 /* Viewport mapping */
-static GLfloat gl_viewport_scale[3], gl_viewport_offset[3];
+//static GLfloat gl_viewport_scale[3], gl_viewport_offset[3];
 
 /* Depth range */
 static GLclampf gl_depthrange_near, gl_depthrange_far;
@@ -33,6 +33,10 @@ static const matrix_t IDENTITY = {
 
 void APIENTRY glDepthRange(GLclampf n, GLclampf f);
 
+matrix_t* _glGetModelViewMatrix() {
+    return (matrix_t*) stack_top(&MATRIX_STACKS[0]);
+}
+
 matrix_t* _glGetProjectionMatrix() {
     return (matrix_t*) stack_top(&MATRIX_STACKS[1]);
 }
diff --git a/GL/private.h b/GL/private.h
index 9a738e8..8fb07b0 100644
--- a/GL/private.h
+++ b/GL/private.h
@@ -6,7 +6,7 @@
 #include "../containers/named_array.h"
 #include "./clip.h"
 
-#define TRACE_ENABLED 1
+#define TRACE_ENABLED 0
 #define TRACE() if(TRACE_ENABLED) {fprintf(stderr, "%s\n", __func__);}
 
 #define VERTEX_ENABLED_FLAG     (1 << 0)
diff --git a/GL/profiler.h b/GL/profiler.h
index acaf8bf..113130f 100644
--- a/GL/profiler.h
+++ b/GL/profiler.h
@@ -16,3 +16,14 @@ void profiler_print_stats();
 
 void profiler_enable();
 void profiler_disable();
+
+#define PROFILER_COMPILE 0
+#ifdef PROFILER_COMPILE
+#define PROFILER_PUSH(S) profiler_push(S)
+#define PROFILER_CHECKPOINT(P) profiler_checkpoint(P)
+#define PROFILER_POP() profiler_pop()
+#else 
+#define PROFILER_PUSH(S) do {} while (0)
+#define PROFILER_CHECKPOINT(P) do {} while (0)
+#define PROFILER_POP() do {} while (0)
+#endif 
diff --git a/GL/state.c b/GL/state.c
index 5a38d78..0e5a2c8 100644
--- a/GL/state.c
+++ b/GL/state.c
@@ -135,8 +135,9 @@ GLboolean _glCheckValidEnum(GLint param, GLenum* values, const char* func) {
     }
 
     if(!found) {
-        _glKosThrowError(GL_INVALID_ENUM, func);
-        _glKosPrintError();
+        //_glKosThrowError(GL_INVALID_ENUM, func);
+        //_glKosPrintError();
+        printf("GL_INVALID_ENUM when calling %s\n",func);
         return GL_TRUE;
     }
 
@@ -567,9 +568,11 @@ void APIENTRY glGetFloatv(GLenum pname, GLfloat* params) {
     switch(pname) {
         case GL_PROJECTION_MATRIX:
             memcpy(params, _glGetProjectionMatrix(), sizeof(float) * 16);
+        case GL_MODELVIEW_MATRIX:
+            memcpy(params, _glGetModelViewMatrix(), sizeof(float) * 16);
         break;
         default:
-            _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv");
+            _glKosThrowError(GL_INVALID_ENUM, __func__);
             _glKosPrintError();
             break;
     }
@@ -611,7 +614,7 @@ void APIENTRY glGetIntegerv(GLenum pname, GLint *params) {
             }
         } break;
     default:
-        _glKosThrowError(GL_INVALID_ENUM, "glGetIntegerv");
+        _glKosThrowError(GL_INVALID_ENUM,  __func__);
         _glKosPrintError();
         break;
     }
diff --git a/GL/texture.c b/GL/texture.c
index 9623053..3edbd02 100644
--- a/GL/texture.c
+++ b/GL/texture.c
@@ -55,7 +55,7 @@ void _glApplyColorTable() {
     GLushort i = 0;
     for(; i < src->width; ++i) {
         GLubyte* entry = &src->data[i * 4];
-        pvr_set_pal_entry(i, PACK_ARGB8888(entry[3], entry[1], entry[2], entry[0]));
+        pvr_set_pal_entry(i, PACK_ARGB8888(entry[3], entry[0], entry[1], entry[2]));
     }
 }
 
@@ -241,14 +241,13 @@ void APIENTRY glBindTexture(GLenum  target, GLuint texture) {
         return;
     }
 
-    /* If this didn't come from glGenTextures, then we should initialize the
-     * texture the first time it's bound */
-    if(!named_array_used(&TEXTURE_OBJECTS, texture)) {
-        TextureObject* txr = named_array_reserve(&TEXTURE_OBJECTS, texture);
-        _glInitializeTextureObject(txr, texture);
-    }
-
     if(texture) {
+        /* If this didn't come from glGenTextures, then we should initialize the
+        * texture the first time it's bound */
+        if(!named_array_used(&TEXTURE_OBJECTS, texture)) {
+            TextureObject* txr = named_array_reserve(&TEXTURE_OBJECTS, texture);
+            _glInitializeTextureObject(txr, texture);
+        }
         TEXTURE_UNITS[ACTIVE_TEXTURE] = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, texture);
     } else {
         TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL;
@@ -264,9 +263,9 @@ void APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param) {
 
     GLubyte failures = 0;
 
-    failures += _glCheckValidEnum(target, target_values, __func__);
+    /*failures += _glCheckValidEnum(target, target_values, __func__);
     failures += _glCheckValidEnum(pname, pname_values, __func__);
-    failures += _glCheckValidEnum(param, param_values, __func__);
+    failures += _glCheckValidEnum(param, param_values, __func__);*/
 
     TextureObject* active = TEXTURE_UNITS[ACTIVE_TEXTURE];
 
@@ -591,7 +590,6 @@ static inline void _i8_to_i8(const GLubyte* source, GLubyte* dest) {
 }
 
 static TextureConversionFunc _determineConversion(GLint internalFormat, GLenum format, GLenum type) {
-    printf("attempted conversion: %x -> %x, %x \n", internalFormat, format, type);
     switch(internalFormat) {
     case GL_ALPHA: {
         if(type == GL_UNSIGNED_BYTE && format == GL_RGBA) {
@@ -690,8 +688,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
                            GLenum format, GLenum type, const GLvoid *data) {
 
     TRACE();
-    printf("glTexImage2D(%x, %d, %x, %d, %d, %d ,%x, %x, *data) \n", target, level, internalFormat,width, height, border, format, type);
-
+    
     if(target != GL_TEXTURE_2D) {
         _glKosThrowError(GL_INVALID_ENUM, "glTexImage2D-tex2d");
     }
@@ -870,6 +867,7 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
         }
     }
 }
+
 void APIENTRY glTexParameterf(GLenum target, GLenum pname, GLint param) {
     glTexParameteri(target, pname, (GLint)param);
 }
diff --git a/containers/named_array.c b/containers/named_array.c
index 3aac6b5..0214b43 100644
--- a/containers/named_array.c
+++ b/containers/named_array.c
@@ -12,6 +12,17 @@
 
 #include "named_array.h"
 
+#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
+#define BYTE_TO_BINARY(byte)  \
+  (byte & 0x80 ? '1' : '0'), \
+  (byte & 0x40 ? '1' : '0'), \
+  (byte & 0x20 ? '1' : '0'), \
+  (byte & 0x10 ? '1' : '0'), \
+  (byte & 0x08 ? '1' : '0'), \
+  (byte & 0x04 ? '1' : '0'), \
+  (byte & 0x02 ? '1' : '0'), \
+  (byte & 0x01 ? '1' : '0') 
+
 void named_array_init(NamedArray* array, unsigned int element_size, unsigned int max_elements) {
     array->element_size = element_size;
     array->max_element_count = max_elements;
@@ -31,11 +42,10 @@ void named_array_init(NamedArray* array, unsigned int element_size, unsigned int
 }
 
 char named_array_used(NamedArray* array, unsigned int id) {
-    id--;
-
+   
     unsigned int i = id / 8;
     unsigned int j = id % 8;
-
+    
     unsigned char v = array->used_markers[i] & (unsigned char) (1 << j);
     return !!(v);
 }
@@ -60,10 +70,9 @@ void* named_array_alloc(NamedArray* array, unsigned int* new_id) {
 
 void* named_array_reserve(NamedArray* array, unsigned int id) {
     if(!named_array_used(array, id)) {
-        unsigned int j = (id % 8) - 1;
+        unsigned int j = (id % 8);
         unsigned int i = id / 8;
-
-        assert(!named_array_used(array, id));
+        
         array->used_markers[i] |= (unsigned char) 1 << j;
         assert(named_array_used(array, id));