diff --git a/externals/gem2pdp/Makefile.in b/externals/gem2pdp/Makefile.in
index 2ce91797cffbf7b0865272ec9f41ddd31401b70b..58f12bd9f6460b5ab9099db9aa8588e6449fdafe 100644
--- a/externals/gem2pdp/Makefile.in
+++ b/externals/gem2pdp/Makefile.in
@@ -12,7 +12,7 @@ GEM2PDP_DISTRO = /mnt/c/ydegoyon.free.fr/gem2pdp-$(GEM2PDP_VERSION)
 GEM2PDP_TARBALL = $(GEM2PDP_DISTRO).tar.gz
 # build flags
 
-INCLUDES = @INCLUDES@ -I$(PD_DIR)/src -I. -I$(PDP_DIR)/include  -I$(GEM_DIR)/src 
+INCLUDES = @INCLUDES@ -I$(PD_DIR)/src -I. -I$(PDP_DIR)/include  -I$(GEM_DIR)/src -I$(GEM_DIR)/src/deprecated
 CFLAGS = -fPIC -DPD -O2 -funroll-loops -fomit-frame-pointer  -ffast-math \
     -Wall -W -Wno-unused -Wno-parentheses -Wno-switch \
     -DGEM2PDP_VERSION=\"$(GEM2PDP_VERSION)\" -g  @CFLAGS@
diff --git a/externals/gem2pdp/configure.ac b/externals/gem2pdp/configure.ac
index d4a203dbe6fb1c621f3da5531608a47cb159a8ab..74f3855b585b6e9f1e79a29a7d7d128c03e60cf1 100644
--- a/externals/gem2pdp/configure.ac
+++ b/externals/gem2pdp/configure.ac
@@ -29,9 +29,9 @@ then
 elif test -d ../../gem/Gem; 
 then
 	GEM_DIR=../../gem/Gem
-elif  test -d ../../Gem; 
+elif  test -d ../../gem/Gem; 
 then
-	GEM_DIR=../../Gem
+	GEM_DIR=../../gem/Gem
 else
    echo "Gem sources not found"
 fi
@@ -69,7 +69,7 @@ then
 fi
 
 echo -n "looking for gem sources (required) ... "
-if test -f $GEM_DIR/src/Base/GemBase.h
+if test -f $GEM_DIR/src/Base/CPPExtern.h
 then
   AC_SUBST(GEM_DIR)
   echo "ok." 
diff --git a/externals/gem2pdp/gem2pdp.cpp b/externals/gem2pdp/gem2pdp.cpp
index 1c6151154000d39b1b3c54e8ae6604deb06d2dbb..753d9e52136afde79b36244b61a3487b9f1d4af4 100644
--- a/externals/gem2pdp/gem2pdp.cpp
+++ b/externals/gem2pdp/gem2pdp.cpp
@@ -11,8 +11,8 @@
 #include "gem2pdp.h"
 #include "yuv.h"
 
-#include "Gem/Manager.h"
-#include "Gem/Cache.h"
+#include "Base/GemMan.h"
+#include "Base/GemCache.h"
 
 #if defined(GEM_VERSION_MAJOR) && defined (GEM_VERSION_MINOR) && (GEM_VERSION_MAJOR>0 || GEM_VERSION_MINOR>=91)
 # define GEM2PDP_LEGACY_GEM 0
@@ -35,6 +35,7 @@ gem2pdp :: gem2pdp(void)
   GemMan::getDimen(&m_width, &m_height);
 #endif
   m_image = NULL;
+  m_buffer = GL_FRONT_LEFT;
   m_pdpoutlet = outlet_new(this->x_obj, &s_anything);
 }
 
@@ -43,6 +44,52 @@ gem2pdp :: ~gem2pdp()
   if (m_image) cleanImage();
 }
 
+void gem2pdp :: bufferMess(int buffer)
+{
+  switch(buffer)
+  {
+      case 0:
+        m_buffer = GL_FRONT_LEFT;
+        break;
+      case 1:
+        m_buffer = GL_FRONT_RIGHT;
+        break;
+      case 2:
+        m_buffer = GL_BACK_LEFT;
+        break;
+      case 3:
+        m_buffer = GL_BACK_RIGHT;
+        break;
+      case 4:
+        m_buffer = GL_FRONT;
+        break;
+      case 5:
+        m_buffer = GL_BACK;
+        break;
+      case 6:
+        m_buffer = GL_LEFT;
+        break;
+      case 7:
+        m_buffer = GL_RIGHT;
+        break;
+      case 8:
+        m_buffer = GL_FRONT_AND_BACK;
+        break;
+      case 9:
+        m_buffer = GL_AUX0;
+        break;
+      case 10:
+        m_buffer = GL_AUX1;
+        break;
+      case 11:
+        m_buffer = GL_AUX2;
+        break;
+      case 12:
+        m_buffer = GL_AUX3;
+        break;
+  }
+}
+
 void gem2pdp :: bangMess()
 {
  t_int needNew=0, pbuffers;
@@ -50,7 +97,6 @@ void gem2pdp :: bangMess()
  short int *pY, *pU, *pV;
  unsigned char r,g,b,a;
  t_int cpt;
- void *idontknowwhatitis=NULL;
 
   if ( !GemMan::windowExists() )
   {
@@ -68,9 +114,6 @@ void gem2pdp :: bangMess()
   GemMan::getOffset(&m_x, &m_y);
   GemMan::getDimen(&m_width, &m_height);
 #endif
-  pbuffers = GemMan::m_buffer;
-  // GemMan::m_buffer = 1;
-  // GemMan::render(idontknowwhatitis);
   // post("gem2pdp : got dimensions : x=%d y=%d w=%d h=%d", m_x, m_y, m_width, m_height);
         
   if (m_width <= 0 || m_height <= 0)
@@ -105,6 +148,7 @@ void gem2pdp :: bangMess()
      post( "gem2pdp : allocated image : w=%d h=%d", m_image->xsize, m_image->ysize );
    }
 
+   glReadBuffer(m_buffer);
    glReadPixels(m_x, m_y, m_image->xsize, m_image->ysize,
     	    	m_image->format, m_image->type, m_image->data);    
            
@@ -141,10 +185,6 @@ void gem2pdp :: bangMess()
 
    pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0);
 
-   // restore buffer state
-   // GemMan::m_buffer = pbuffers;
-   // GemMan::render(idontknowwhatitis);
-
    // post("gem2pdp : read image"); 
 }
 
@@ -159,6 +199,8 @@ void gem2pdp :: obj_setupCallback(t_class *classPtr)
   ::post( "gem2pdp : a bridge between GEM and PDP/PiDiP v"GEM2PDP_VERSION" (ydegoyon@free.fr)" );
   class_addmethod(classPtr, (t_method)&gem2pdp::bangMessCallback,
     	    gensym("bang"), A_NULL);
+  class_addmethod(classPtr, (t_method)&gem2pdp::bufferMessCallback,
+    	    gensym("buffer"), A_FLOAT, A_NULL);
   class_sethelpsymbol( classPtr, gensym("gem2pdp.pd") );
 }
 
@@ -167,8 +209,14 @@ void gem2pdp :: bangMessCallback(void *data)
   GetMyClass(data)->bangMess();
 }
 
+void gem2pdp :: bufferMessCallback(void *data, t_floatarg buffer)
+{
+  GetMyClass(data)->bufferMess((int)buffer);
+}
+
 void gem2pdp :: render(GemState *state)
 {
-  GemMan::render(state);
+  m_gemstate=state;
+  // GemMan::render(state);
   return;
 }
diff --git a/externals/gem2pdp/gem2pdp.h b/externals/gem2pdp/gem2pdp.h
index f813a3a5e11f8f25be835162d079c5dcc69223c7..d9a6eb630f993f164e25413f3f97b28f3bed6d70 100644
--- a/externals/gem2pdp/gem2pdp.h
+++ b/externals/gem2pdp/gem2pdp.h
@@ -11,7 +11,7 @@
 #define INCLUDE_GEM2PDP_H_
 
 #include "Base/GemBase.h"
-#include "Gem/Image.h"
+#include "Base/GemPixUtil.h"
 #include "pdp.h"
 
 class GEM_EXTERN gem2pdp : public GemBase
@@ -30,14 +30,18 @@ class GEM_EXTERN gem2pdp : public GemBase
    t_outlet     *m_pdpoutlet;
    virtual ~gem2pdp(void);
    virtual void bangMess(void);
+   virtual void bufferMess(int);
    virtual void render(GemState *state);
    void         cleanImage();
    int        m_packet0;
    t_pdp        *m_header;
    short int    *m_data;
+   void         *m_gemstate;
+   GLenum       m_buffer;
     	
  private:
    static void 	bangMessCallback(void *data);
+   static void 	bufferMessCallback(void *data, t_floatarg buffer);
 };
 
 #endif
diff --git a/externals/gem2pdp/pdp2gem.cpp b/externals/gem2pdp/pdp2gem.cpp
index 5931818f21fc9bd18b1e7f091931c5d91ec62e06..dcbb3aeaafe163f0f55feac0f96881f5fa072965 100644
--- a/externals/gem2pdp/pdp2gem.cpp
+++ b/externals/gem2pdp/pdp2gem.cpp
@@ -10,7 +10,8 @@
 
 
 #include "pdp2gem.h"
-#include "Gem/State.h"
+#include "Base/GemState.h"
+#include "Base/GemVersion.h"
 #include "yuv.h"
 
 CPPEXTERN_NEW_WITH_ONE_ARG(pdp2gem, t_symbol *, A_DEFSYM)
@@ -235,13 +236,17 @@ void pdp2gem :: startRendering()
 
 void pdp2gem :: render(GemState *state)
 {
-  if ( m_data )
+  if ( m_data && state )
   {
     // lock mutex
     pthread_mutex_lock(m_mutex);
 
     m_pixBlock.newimage = 1;
+#if GEM_VERSION_MINOR >= 93
+    state->set(GemState::_PIX, &m_pixBlock);
+#else
     state->image = &m_pixBlock;
+#endif
   }
 }
 
diff --git a/externals/gem2pdp/pdp2gem.h b/externals/gem2pdp/pdp2gem.h
index b8811610b5dcbb5b5bebedd7bb32ea234e1f209f..e440dfd0782e35146855dbfc76862c3c60dfcde9 100644
--- a/externals/gem2pdp/pdp2gem.h
+++ b/externals/gem2pdp/pdp2gem.h
@@ -21,7 +21,7 @@
 #include <stdio.h>
 
 #include "Base/GemBase.h"
-#include "Gem/Image.h"
+#include "Base/GemPixUtil.h"
 #include "pdp.h"
 #include <pthread.h>
 
diff --git a/externals/gem2pdp/pix_2pdp.cpp b/externals/gem2pdp/pix_2pdp.cpp
index aff640e71b1144e367d99e0e63d405a0380cd3e8..c244cc3caccd738b0d76ddba7bc3c60b836d79cd 100644
--- a/externals/gem2pdp/pix_2pdp.cpp
+++ b/externals/gem2pdp/pix_2pdp.cpp
@@ -57,6 +57,10 @@ void pix_2pdp::bangMess()
     // make pdp packet
     psize = gem_xsize * gem_ysize;
     m_packet0 = pdp_packet_new_image_YCrCb( gem_xsize, gem_ysize);
+    if(!m_packet0) {
+      error("couldn't allocate new pdp packet...");
+      return;
+    }
     m_header = pdp_packet_header(m_packet0);
     m_data = (short int *)pdp_packet_data(m_packet0);
 
@@ -88,8 +92,9 @@ void pix_2pdp::bangMess()
             *(pV) = ( yuv_RGBtoV( (g1<<16) +  (g2<<8) +  g3 ) - 128 ) << 8;
             *(pU) = ( yuv_RGBtoU( (g1<<16) +  (g2<<8) +  g3 ) - 128 ) << 8;
             pY++;
-            if ( (px%2==0) && (py%2==0) )
+            if ( (px%2==0) && (py%2==0) ) {
               pV++; pU++;
+	    }
           }
         }
         pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0);