diff --git a/modules/base/src/profile.cc b/modules/base/src/profile.cc
index e1dc2d246c32d463c7993f206ae5d1b9b5ea20f6..73b3540418e5716d14b69aebf23efd37f5d3b5c3 100644
--- a/modules/base/src/profile.cc
+++ b/modules/base/src/profile.cc
@@ -42,7 +42,7 @@ Profile::~Profile()
 {
   struct timeval end;
   gettimeofday(&end,NULL);
-  std::cout << msg_ << " finished in " <<delta_time(start_, end) 
+  std::cerr << msg_ << " finished in " <<delta_time(start_, end) 
             << "s" << std::endl;
 }
 
diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc
index b52d496f0c32a1b3008098b0c14a599cab98e502..019dbd49b60a459a2411de5799f7ac93cae9e03d 100644
--- a/modules/gfx/src/impl/cartoon_renderer.cc
+++ b/modules/gfx/src/impl/cartoon_renderer.cc
@@ -31,6 +31,8 @@
 #include <ost/gfx/entity.hh>
 #include <ost/gfx/impl/tabulated_trig.hh>
 
+#include <ost/profile.hh>
+
 namespace ost {
 
 namespace gfx {
@@ -56,6 +58,7 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset,
                                        SplineEntryListList& spline_list_list,
                                        bool)
 {
+  Profile p0("CartoonRenderer::PrepareRendering(s,va,sll,f)");
   if(options_==NULL) {
     LOG_DEBUG("CartoonRenderer: NULL options, not creating objects");
   }
@@ -121,6 +124,7 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset,
 
 void CartoonRenderer::PrepareRendering()
 {
+  Profile p0("CartoonRenderer::PrepareRendering()");
   TraceRendererBase::PrepareRendering();
   if(state_>0) {
     va_.Clear();
@@ -382,6 +386,7 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va,
                                        const SplineEntryListList& spline_list_list,
                                        bool is_sel)
 {
+  Profile p0("CartoonRenderer::RebuildSplineObj");
   LOG_DEBUG("CartoonRenderer: starting profile assembly");
   unsigned int detail = std::min(MAX_ARC_DETAIL,
                                  std::max(options_->GetArcDetail(),
@@ -541,12 +546,14 @@ TraceProfile CartoonRenderer::TransformAndAddProfile(const std::vector<TraceProf
 
 namespace {
 
-  float spread(const geom::Vec3& v1, geom::Vec3& v2, geom::Vec3& v3, geom::Vec3& v4)
+  float spread(Real* v1, Real* v2, Real* v3, Real* v4)
   {
-    return geom::Dot(geom::Normalize(geom::Cross(geom::Normalize(v3-v1),geom::Normalize(v2-v1))),
-		     geom::Normalize(geom::Cross(geom::Normalize(v3-v4),geom::Normalize(v2-v4))));
+    geom::Vec3 a(v3[0]-v1[0],v3[1]-v1[1],v3[2]-v1[2]);
+    geom::Vec3 b(v2[0]-v1[0],v2[1]-v1[1],v2[2]-v1[2]);
+    geom::Vec3 c(v3[0]-v4[0],v3[1]-v4[1],v3[2]-v4[2]);
+    geom::Vec3 d(v2[0]-v4[0],v2[1]-v4[1],v2[2]-v4[2]);
+    return geom::Dot(geom::Normalize(geom::Cross(a,b)),geom::Normalize(geom::Cross(c,d)));
   }
-
 }
 
 void CartoonRenderer::AssembleProfile(const TraceProfile& prof1,
@@ -563,18 +570,19 @@ void CartoonRenderer::AssembleProfile(const TraceProfile& prof1,
   */
   size_t size=prof1.size()-1;
 
+#if 0
   // first get the best correction offset
   float accum[]={0.0,0.0,0.0,0.0,0.0};
   for(size_t i=0;i<size;++i) {
     int i1=(i+0)%(size);
     int i2=(i+1)%(size);
-    geom::Vec3 v1=va.GetVert(prof1[i1].id);
-    geom::Vec3 v2=va.GetVert(prof1[i2].id);
+    Real* v1=va.GetVertP(prof1[i1].id);
+    Real* v2=va.GetVertP(prof1[i2].id);
     for(int k=-2;k<=2;++k) {
       int i3=(i+k+0+size)%(size);
       int i4=(i+k+1+size)%(size);
-      geom::Vec3 v3=va.GetVert(prof2[i3].id);
-      geom::Vec3 v4=va.GetVert(prof2[i4].id);
+      Real* v3=va.GetVertP(prof2[i3].id);
+      Real* v4=va.GetVertP(prof2[i4].id);
       accum[k+2]+=spread(v1,v2,v3,v4);
     }
   }
@@ -588,6 +596,9 @@ void CartoonRenderer::AssembleProfile(const TraceProfile& prof1,
     }
   }
   best_off=(best_off+(size))%(size);
+#else
+  int best_off=0;
+#endif
 
   // now assemble the triangles
   for(unsigned int i1=0;i1<size;++i1) {
diff --git a/modules/gfx/src/vertex_array.cc b/modules/gfx/src/vertex_array.cc
index ce0f4b73139f380ecb3b9b5fdb097d1990e25409..d2acd821d175e8729f4c3de8fa079c5c4f38509c 100644
--- a/modules/gfx/src/vertex_array.cc
+++ b/modules/gfx/src/vertex_array.cc
@@ -30,17 +30,22 @@
 #include "scene.hh"
 #include "vertex_array_helper.hh"
 #include "povray.hh"
+#include <ost/profile.hh>
 
 #if OST_SHADER_SUPPORT_ENABLED
 #include "shader.hh"
 #endif
 
 
+#ifdef NDEBUG
+#define VERTEX_ARRAY_CHECK_GL_ERROR(m)
+#else
 #define VERTEX_ARRAY_CHECK_GL_ERROR(m) \
   if((glerr=glGetError())!=0) {  \
     LOG_ERROR("Error during va buffer prep: " << m << " : " << gluErrorString(glerr)); \
     return false; \
   }
+#endif
 
 namespace ost { 
 
@@ -315,6 +320,12 @@ Vec3 IndexedVertexArray::GetVert(VertexID id) const
   return nrvo;
 } 
 
+Real* IndexedVertexArray::GetVertP(VertexID id)
+{
+  if(id>=entry_list_.size()) id=0;
+  return entry_list_[id].v;
+}
+
 void IndexedVertexArray::SetVert(VertexID id, const Vec3& v) 
 {
   if(id>=entry_list_.size()) return;
@@ -388,7 +399,7 @@ void IndexedVertexArray::SetOpacity(float o)
 void IndexedVertexArray::RenderGL() 
 {
   static bool use_buff=false;
-  
+
   if(!initialized_) {
     LOG_DEBUG("initializing vertex array lists");
 #if OST_SHADER_SUPPORT_ENABLED
@@ -1073,10 +1084,14 @@ bool IndexedVertexArray::prep_buff()
 {
   if(Scene::Instance().InOffscreenMode()) return false;
 #if OST_SHADER_SUPPORT_ENABLED
-  glEnableClientState(GL_VERTEX_ARRAY);
-  glEnableClientState(GL_NORMAL_ARRAY);
-  glEnableClientState(GL_COLOR_ARRAY);
-  glEnableClientState(GL_INDEX_ARRAY);
+  static bool init=false;
+  if(!init) {
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_NORMAL_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_INDEX_ARRAY);
+    init=true;
+  }
 
   int glerr=glGetError(); // clear error flag
   glBindBuffer(GL_ARRAY_BUFFER, buffer_id_[VA_VERTEX_BUFFER]);
diff --git a/modules/gfx/src/vertex_array.hh b/modules/gfx/src/vertex_array.hh
index 3883c2abe9e298be14c9f64a7d091d51b52e4bda..ed4cebb2aed96b652902b4ca49b680e82203ed94 100644
--- a/modules/gfx/src/vertex_array.hh
+++ b/modules/gfx/src/vertex_array.hh
@@ -140,6 +140,8 @@ class DLLEXPORT_OST_GFX IndexedVertexArray {
   geom::Vec3 GetVert(VertexID id) const;
   void SetVert(VertexID id, const geom::Vec3& vert);
 
+  Real* GetVertP(VertexID id);
+
   geom::Vec3 GetNormal(VertexID id) const;
   void SetNormal(VertexID id, const geom::Vec3& norm);