diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c
index 634bba8..93ba0b7 100644
--- a/src/mesa/main/api_arrayelt.c
+++ b/src/mesa/main/api_arrayelt.c
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.1
+ * Version:  5.1
  *
- * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -34,37 +34,31 @@
 #include "macros.h"
 #include "mtypes.h"
 
+
+typedef void (GLAPIENTRY *texarray_func)( GLenum, const void * );
+
+typedef struct {
+   GLint unit;
+   struct gl_client_array *array;
+   texarray_func func;
+} AEtexarray;
+
 typedef void (GLAPIENTRY *array_func)( const void * );
 
 typedef struct {
-   const struct gl_client_array *array;
+   struct gl_client_array *array;
    array_func func;
 } AEarray;
 
-typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
-
 typedef struct {
-   const struct gl_client_array *array;
-   attrib_func func;
-   GLuint index;
-} AEattrib;
-
-typedef struct {
+   AEtexarray texarrays[MAX_TEXTURE_COORD_UNITS + 1];
    AEarray arrays[32];
-   AEattrib attribs[VERT_ATTRIB_MAX + 1];
    GLuint NewState;
 } AEcontext;
 
 #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
-
-/*
- * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
- * in the range [0, 7].  Luckily these type tokens are sequentially
- * numbered in gl.h
- */
 #define TYPE_IDX(t) ((t) & 0xf)
 
-
 static void (GLAPIENTRY *colorfuncs[2][8])( const void * ) = {
    { (array_func)glColor3bv,
      (array_func)glColor3ubv,
@@ -114,6 +108,45 @@
      (array_func)glVertex4dv }
 };
 
+
+static void (GLAPIENTRY *multitexfuncs[4][8])( GLenum, const void * ) = {
+   { 0,
+     0,
+     (texarray_func)glMultiTexCoord1svARB,
+     0,
+     (texarray_func)glMultiTexCoord1ivARB,
+     0,
+     (texarray_func)glMultiTexCoord1fvARB,
+     (texarray_func)glMultiTexCoord1dvARB },
+
+   { 0,
+     0,
+     (texarray_func)glMultiTexCoord2svARB,
+     0,
+     (texarray_func)glMultiTexCoord2ivARB,
+     0,
+     (texarray_func)glMultiTexCoord2fvARB,
+     (texarray_func)glMultiTexCoord2dvARB },
+
+   { 0,
+     0,
+     (texarray_func)glMultiTexCoord3svARB,
+     0,
+     (texarray_func)glMultiTexCoord3ivARB,
+     0,
+     (texarray_func)glMultiTexCoord3fvARB,
+     (texarray_func)glMultiTexCoord3dvARB },
+
+   { 0,
+     0,
+     (texarray_func)glMultiTexCoord4svARB,
+     0,
+     (texarray_func)glMultiTexCoord4ivARB,
+     0,
+     (texarray_func)glMultiTexCoord4fvARB,
+     (texarray_func)glMultiTexCoord4dvARB }
+};
+
 static void (GLAPIENTRY *indexfuncs[8])( const void * ) = {
    0,
    (array_func)glIndexubv,
@@ -125,6 +158,7 @@
    (array_func)glIndexdv
 };
 
+
 static void (GLAPIENTRY *normalfuncs[8])( const void * ) = {
    (array_func)glNormal3bv,
    0,
@@ -213,442 +247,6 @@
 };
 
 
-/**********************************************************************/
-
-/* GL_BYTE attributes */
-
-static void VertexAttrib1Nbv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, BYTE_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1bv(GLuint index, const GLbyte *v)
-{
-      _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Nbv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, BYTE_TO_FLOAT(v[0]),
-                                     BYTE_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2bv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Nbv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, BYTE_TO_FLOAT(v[0]),
-                                     BYTE_TO_FLOAT(v[1]),
-                                     BYTE_TO_FLOAT(v[2]));
-}
-
-static void VertexAttrib3bv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Nbv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, BYTE_TO_FLOAT(v[0]),
-                                     BYTE_TO_FLOAT(v[1]),
-                                     BYTE_TO_FLOAT(v[2]),
-                                     BYTE_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4bv(GLuint index, const GLbyte *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_UNSIGNED_BYTE attributes */
-
-static void VertexAttrib1Nubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, UBYTE_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1ubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Nubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, UBYTE_TO_FLOAT(v[0]),
-                                     UBYTE_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2ubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Nubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, UBYTE_TO_FLOAT(v[0]),
-                                     UBYTE_TO_FLOAT(v[1]),
-                                     UBYTE_TO_FLOAT(v[2]));
-}
-static void VertexAttrib3ubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Nubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, UBYTE_TO_FLOAT(v[0]),
-                                     UBYTE_TO_FLOAT(v[1]),
-                                     UBYTE_TO_FLOAT(v[2]),
-                                     UBYTE_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4ubv(GLuint index, const GLubyte *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_SHORT attributes */
-
-static void VertexAttrib1Nsv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, SHORT_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1sv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Nsv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, SHORT_TO_FLOAT(v[0]),
-                                     SHORT_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2sv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Nsv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, SHORT_TO_FLOAT(v[0]),
-                                     SHORT_TO_FLOAT(v[1]),
-                                     SHORT_TO_FLOAT(v[2]));
-}
-
-static void VertexAttrib3sv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Nsv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, SHORT_TO_FLOAT(v[0]),
-                                     SHORT_TO_FLOAT(v[1]),
-                                     SHORT_TO_FLOAT(v[2]),
-                                     SHORT_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4sv(GLuint index, const GLshort *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_UNSIGNED_SHORT attributes */
-
-static void VertexAttrib1Nusv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, USHORT_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1usv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Nusv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, USHORT_TO_FLOAT(v[0]),
-                                     USHORT_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2usv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Nusv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, USHORT_TO_FLOAT(v[0]),
-                                     USHORT_TO_FLOAT(v[1]),
-                                     USHORT_TO_FLOAT(v[2]));
-}
-
-static void VertexAttrib3usv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Nusv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, USHORT_TO_FLOAT(v[0]),
-                                     USHORT_TO_FLOAT(v[1]),
-                                     USHORT_TO_FLOAT(v[2]),
-                                     USHORT_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4usv(GLuint index, const GLushort *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_INT attributes */
-
-static void VertexAttrib1Niv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, INT_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1iv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Niv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, INT_TO_FLOAT(v[0]),
-                                     INT_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2iv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Niv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, INT_TO_FLOAT(v[0]),
-                                     INT_TO_FLOAT(v[1]),
-                                     INT_TO_FLOAT(v[2]));
-}
-
-static void VertexAttrib3iv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Niv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, INT_TO_FLOAT(v[0]),
-                                     INT_TO_FLOAT(v[1]),
-                                     INT_TO_FLOAT(v[2]),
-                                     INT_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4iv(GLuint index, const GLint *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_UNSIGNED_INT attributes */
-
-static void VertexAttrib1Nuiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, UINT_TO_FLOAT(v[0]));
-}
-
-static void VertexAttrib1uiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
-}
-
-static void VertexAttrib2Nuiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, UINT_TO_FLOAT(v[0]),
-                                     UINT_TO_FLOAT(v[1]));
-}
-
-static void VertexAttrib2uiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
-}
-
-static void VertexAttrib3Nuiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, UINT_TO_FLOAT(v[0]),
-                                     UINT_TO_FLOAT(v[1]),
-                                     UINT_TO_FLOAT(v[2]));
-}
-
-static void VertexAttrib3uiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
-}
-
-static void VertexAttrib4Nuiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, UINT_TO_FLOAT(v[0]),
-                                     UINT_TO_FLOAT(v[1]),
-                                     UINT_TO_FLOAT(v[2]),
-                                     UINT_TO_FLOAT(v[3]));
-}
-
-static void VertexAttrib4uiv(GLuint index, const GLuint *v)
-{
-   _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
-}
-
-/* GL_FLOAT attributes */
-
-static void VertexAttrib1fv(GLuint index, const GLfloat *v)
-{
-   _glapi_Dispatch->VertexAttrib1fvNV(index, v);
-}
-
-static void VertexAttrib2fv(GLuint index, const GLfloat *v)
-{
-   _glapi_Dispatch->VertexAttrib2fvNV(index, v);
-}
-
-static void VertexAttrib3fv(GLuint index, const GLfloat *v)
-{
-   _glapi_Dispatch->VertexAttrib3fvNV(index, v);
-}
-
-static void VertexAttrib4fv(GLuint index, const GLfloat *v)
-{
-   _glapi_Dispatch->VertexAttrib4fvNV(index, v);
-}
-
-/* GL_DOUBLE attributes */
-
-static void VertexAttrib1dv(GLuint index, const GLdouble *v)
-{
-   _glapi_Dispatch->VertexAttrib1dvNV(index, v);
-}
-
-static void VertexAttrib2dv(GLuint index, const GLdouble *v)
-{
-   _glapi_Dispatch->VertexAttrib2dvNV(index, v);
-}
-
-static void VertexAttrib3dv(GLuint index, const GLdouble *v)
-{
-   _glapi_Dispatch->VertexAttrib3dvNV(index, v);
-}
-
-static void VertexAttrib4dv(GLuint index, const GLdouble *v)
-{
-   _glapi_Dispatch->VertexAttrib4dvNV(index, v);
-}
-
-
-/*
- * Array [size][type] of VertexAttrib functions
- */
-static void (GLAPIENTRY *attribfuncs[2][4][8])( GLuint, const void * ) = {
-   {
-      /* non-normalized */
-      {
-         /* size 1 */
-         (attrib_func) VertexAttrib1bv,
-         (attrib_func) VertexAttrib1ubv,
-         (attrib_func) VertexAttrib1sv,
-         (attrib_func) VertexAttrib1usv,
-         (attrib_func) VertexAttrib1iv,
-         (attrib_func) VertexAttrib1uiv,
-         (attrib_func) VertexAttrib1fv,
-         (attrib_func) VertexAttrib1dv
-      },
-      {
-         /* size 2 */
-         (attrib_func) VertexAttrib2bv,
-         (attrib_func) VertexAttrib2ubv,
-         (attrib_func) VertexAttrib2sv,
-         (attrib_func) VertexAttrib2usv,
-         (attrib_func) VertexAttrib2iv,
-         (attrib_func) VertexAttrib2uiv,
-         (attrib_func) VertexAttrib2fv,
-         (attrib_func) VertexAttrib2dv
-      },
-      {
-         /* size 3 */
-         (attrib_func) VertexAttrib3bv,
-         (attrib_func) VertexAttrib3ubv,
-         (attrib_func) VertexAttrib3sv,
-         (attrib_func) VertexAttrib3usv,
-         (attrib_func) VertexAttrib3iv,
-         (attrib_func) VertexAttrib3uiv,
-         (attrib_func) VertexAttrib3fv,
-         (attrib_func) VertexAttrib3dv
-      },
-      {
-         /* size 4 */
-         (attrib_func) VertexAttrib4bv,
-         (attrib_func) VertexAttrib4ubv,
-         (attrib_func) VertexAttrib4sv,
-         (attrib_func) VertexAttrib4usv,
-         (attrib_func) VertexAttrib4iv,
-         (attrib_func) VertexAttrib4uiv,
-         (attrib_func) VertexAttrib4fv,
-         (attrib_func) VertexAttrib4dv
-      }
-   },
-   {
-      /* normalized (except for float/double) */
-      {
-         /* size 1 */
-         (attrib_func) VertexAttrib1Nbv,
-         (attrib_func) VertexAttrib1Nubv,
-         (attrib_func) VertexAttrib1Nsv,
-         (attrib_func) VertexAttrib1Nusv,
-         (attrib_func) VertexAttrib1Niv,
-         (attrib_func) VertexAttrib1Nuiv,
-         (attrib_func) VertexAttrib1fv,
-         (attrib_func) VertexAttrib1dv
-      },
-      {
-         /* size 2 */
-         (attrib_func) VertexAttrib2Nbv,
-         (attrib_func) VertexAttrib2Nubv,
-         (attrib_func) VertexAttrib2Nsv,
-         (attrib_func) VertexAttrib2Nusv,
-         (attrib_func) VertexAttrib2Niv,
-         (attrib_func) VertexAttrib2Nuiv,
-         (attrib_func) VertexAttrib2fv,
-         (attrib_func) VertexAttrib2dv
-      },
-      {
-         /* size 3 */
-         (attrib_func) VertexAttrib3Nbv,
-         (attrib_func) VertexAttrib3Nubv,
-         (attrib_func) VertexAttrib3Nsv,
-         (attrib_func) VertexAttrib3Nusv,
-         (attrib_func) VertexAttrib3Niv,
-         (attrib_func) VertexAttrib3Nuiv,
-         (attrib_func) VertexAttrib3fv,
-         (attrib_func) VertexAttrib3dv
-      },
-      {
-         /* size 4 */
-         (attrib_func) VertexAttrib4Nbv,
-         (attrib_func) VertexAttrib4Nubv,
-         (attrib_func) VertexAttrib4Nsv,
-         (attrib_func) VertexAttrib4Nusv,
-         (attrib_func) VertexAttrib4Niv,
-         (attrib_func) VertexAttrib4Nuiv,
-         (attrib_func) VertexAttrib4fv,
-         (attrib_func) VertexAttrib4dv
-      }
-   }
-};
-
-/**********************************************************************/
-
 
 GLboolean _ae_create_context( GLcontext *ctx )
 {
@@ -673,139 +271,68 @@
 }
 
 
-/**
- * Make a list of per-vertex functions to call for each glArrayElement call.
- * These functions access the array data (i.e. glVertex, glColor, glNormal, etc);
- */
 static void _ae_update_state( GLcontext *ctx )
 {
    AEcontext *actx = AE_CONTEXT(ctx);
+   AEtexarray *ta = actx->texarrays;
    AEarray *aa = actx->arrays;
-   AEattrib *at = actx->attribs;
    GLuint i;
 
-   /* yuck, no generic array to correspond to color index or edge flag */
+   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
+      if (ctx->Array.TexCoord[i].Enabled) {
+	 ta->unit = i;
+	 ta->array = &ctx->Array.TexCoord[i];
+	 ta->func = multitexfuncs[ta->array->Size-1][TYPE_IDX(ta->array->Type)];
+	 ta++;
+      }
+
+   ta->func = 0;
+
+   if (ctx->Array.Color.Enabled) {
+      aa->array = &ctx->Array.Color;
+      aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
+      aa++;
+   }
+
+   if (ctx->Array.Normal.Enabled) {
+      aa->array = &ctx->Array.Normal;
+      aa->func = normalfuncs[TYPE_IDX(aa->array->Type)];
+      aa++;
+   }
+
    if (ctx->Array.Index.Enabled) {
       aa->array = &ctx->Array.Index;
       aa->func = indexfuncs[TYPE_IDX(aa->array->Type)];
       aa++;
    }
+
    if (ctx->Array.EdgeFlag.Enabled) {
       aa->array = &ctx->Array.EdgeFlag;
-      aa->func = (array_func) glEdgeFlagv;
+      aa->func = (array_func)glEdgeFlagv;
       aa++;
    }
 
-   /* all other arrays handled here */
-   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-      /* Note: we count down to zero so glVertex (attrib 0) is last!!! */
-      const GLuint index = VERT_ATTRIB_MAX - i - 1;
-      struct gl_client_array *attribArray = NULL;
-
-      /* Generic arrays take priority over conventional arrays if vertex program
-       * mode is enabled.
-       */
-      if (ctx->VertexProgram.Enabled
-          && ctx->Array.VertexAttrib[index].Enabled) {
-         if (index == 0) {
-            /* Special case: use glVertex() for vertex position so
-             * that it's always executed last.
-             */
-            aa->array = &ctx->Array.VertexAttrib[0];
-            aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
-            aa++;
-         }
-         else {
-            attribArray = &ctx->Array.VertexAttrib[index];
-         }
-      }
-      else {
-         switch (index) {
-         case VERT_ATTRIB_POS:
-            if (ctx->Array.Vertex.Enabled) {
-               aa->array = &ctx->Array.Vertex;
-               aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
-               aa++;
-            }
-            break;
-         case VERT_ATTRIB_NORMAL:
-            if (ctx->Array.Normal.Enabled) {
-               aa->array = &ctx->Array.Normal;
-               aa->func = normalfuncs[TYPE_IDX(aa->array->Type)];
-               aa++;
-            }
-            break;
-         case VERT_ATTRIB_COLOR0:
-            if (ctx->Array.Color.Enabled) {
-               aa->array = &ctx->Array.Color;
-               aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
-               aa++;
-            }
-            break;
-         case VERT_ATTRIB_COLOR1:
-            if (ctx->Array.SecondaryColor.Enabled) {
-               aa->array = &ctx->Array.SecondaryColor;
-               aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)];
-               aa++;
-            }
-            break;
-         case VERT_ATTRIB_FOG:
-            if (ctx->Array.FogCoord.Enabled) {
-               aa->array = &ctx->Array.FogCoord;
-               aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)];
-               aa++;
-            }
-            break;
-         case VERT_ATTRIB_TEX0:
-         case VERT_ATTRIB_TEX1:
-         case VERT_ATTRIB_TEX2:
-         case VERT_ATTRIB_TEX3:
-         case VERT_ATTRIB_TEX4:
-         case VERT_ATTRIB_TEX5:
-         case VERT_ATTRIB_TEX6:
-         case VERT_ATTRIB_TEX7:
-            /* use generic vertex attribs for texcoords */
-            if (ctx->Array.TexCoord[index - VERT_ATTRIB_TEX0].Enabled) {
-               attribArray = &ctx->Array.TexCoord[index - VERT_ATTRIB_TEX0];
-            }
-         default:
-            /* nothing */;
-         }
-      }
-
-      /* Save glVertexAttrib call (may be for glMultiTexCoord) */
-      if (attribArray) {
-         at->array = attribArray;
-         if (attribArray->Type == GL_FLOAT) {
-            switch (attribArray->Size) {
-            case 1:
-               at->func = (attrib_func) _glapi_Dispatch->VertexAttrib1fvNV;
-               break;
-            case 2:
-               at->func = (attrib_func) _glapi_Dispatch->VertexAttrib2fvNV;
-               break;
-            case 3:
-               at->func = (attrib_func) _glapi_Dispatch->VertexAttrib3fvNV;
-               break;
-            case 4:
-               at->func = (attrib_func) _glapi_Dispatch->VertexAttrib4fvNV;
-               break;
-            }
-         }
-         else
-         {
-            at->func = attribfuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
-         }
-
-         at->index = index;
-         at++;
-      }
+   if (ctx->Array.FogCoord.Enabled) {
+      aa->array = &ctx->Array.FogCoord;
+      aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)];
+      aa++;
    }
-   ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
-   ASSERT(aa - actx->arrays < 32);
-   at->func = NULL;  /* terminate the list */
-   aa->func = NULL;  /* terminate the list */
 
+   if (ctx->Array.SecondaryColor.Enabled) {
+      aa->array = &ctx->Array.SecondaryColor;
+      aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)];
+      aa++;
+   }
+
+   /* Must be last
+    */
+   if (ctx->Array.Vertex.Enabled) {
+      aa->array = &ctx->Array.Vertex;
+      aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
+      aa++;
+   }
+
+   aa->func = 0;
    actx->NewState = 0;
 }
 
@@ -813,26 +340,26 @@
 void GLAPIENTRY _ae_loopback_array_elt( GLint elt )
 {
    GET_CURRENT_CONTEXT(ctx);
-   const AEcontext *actx = AE_CONTEXT(ctx);
-   const AEarray *aa;
-   const AEattrib *at;
+   AEcontext *actx = AE_CONTEXT(ctx);
+   AEtexarray *ta;
+   AEarray *aa;
 
    if (actx->NewState)
       _ae_update_state( ctx );
 
-   /* generic attributes */
-   for (at = actx->attribs; at->func; at++) {
-      const GLubyte *src = at->array->BufferObj->Data
-                         + (GLuint) at->array->Ptr
-                         + elt * at->array->StrideB;
-      at->func( at->index, src );
+   for (ta = actx->texarrays ; ta->func ; ta++) {
+      GLubyte *src = ta->array->BufferObj->Data
+                   + (GLuint) ta->array->Ptr
+                   + elt * ta->array->StrideB;
+      ta->func( ta->unit + GL_TEXTURE0_ARB, src);
    }
 
-   /* conventional arrays */
-   for (aa = actx->arrays; aa->func ; aa++) {
-      const GLubyte *src = aa->array->BufferObj->Data
-                         + (GLuint) aa->array->Ptr
-                         + elt * aa->array->StrideB;
+   /* Must be last
+    */
+   for (aa = actx->arrays ; aa->func ; aa++) {
+      GLubyte *src = aa->array->BufferObj->Data
+                   + (GLuint) aa->array->Ptr
+                   + elt * aa->array->StrideB;
       aa->func( src );
    }
 }
