diff --git a/python/cplumed.pxd b/python/cplumed.pxd
index ab4be063531513f7b179664550566329b51f5915..5450a008dbf27d79e80d9271fe37e78261a617d2 100644
--- a/python/cplumed.pxd
+++ b/python/cplumed.pxd
@@ -22,9 +22,11 @@
 #
 # This create cython wrappers to the main bits of the PLUMED libraray
 #
-cdef extern from "Plumed.h" :
-     ctypedef struct plumed:
-         pass
-     plumed plumed_create()
-     void plumed_cmd(plumed p, const char*key, const void*val) except + 
-     void plumed_finalize(plumed p) except +
+
+cdef extern from "Plumed.h" namespace "PLMD":
+     cdef cppclass Plumed:
+         Plumed() except +
+         void cmd(const char*key, const void*val) except +
+         void cmd(const char*key) except +
+
+
diff --git a/python/plumed.pyx b/python/plumed.pyx
index f35d16bddbb4a19301379b8946191c0b5fff64dd..032764a2faab8046a27fe6a644b92a85d1a65731 100644
--- a/python/plumed.pyx
+++ b/python/plumed.pyx
@@ -29,25 +29,20 @@ import numpy as np
 cimport numpy as np
 
 cdef class Plumed:
-     cdef cplumed.plumed c_plumed
+     cdef cplumed.Plumed c_plumed
      def __cinit__(self):
-         self.c_plumed = cplumed.plumed_create()   #new cplumed.Plumed()
          cdef int pres = 8
-         cplumed.plumed_cmd(self.c_plumed, "setRealPrecision", <void*>&pres )  
-     def __dealloc__(self): 
-         cplumed.plumed_finalize(self.c_plumed)
-
+         self.c_plumed.cmd( "setRealPrecision", <void*>&pres )
      def cmd_ndarray_real(self, ckey, val):
          cdef double [:] abuffer = val.ravel()
-         cplumed.plumed_cmd(self.c_plumed, ckey, <void*>&abuffer[0])
+         self.c_plumed.cmd( ckey, <void*>&abuffer[0])
      def cmd_ndarray_int(self, ckey, val):
          cdef long [:] abuffer = val.ravel()
-         cplumed.plumed_cmd(self.c_plumed, ckey, <void*>&abuffer[0])
+         self.c_plumed.cmd( ckey, <void*>&abuffer[0])
      cdef cmd_float(self, ckey, double val ):
-         cplumed.plumed_cmd(self.c_plumed, ckey, <void*>&val )
+         self.c_plumed.cmd( ckey, <void*>&val )
      cdef cmd_int(self, ckey, int val):
-         cplumed.plumed_cmd(self.c_plumed, ckey, <void*>&val)
-
+         self.c_plumed.cmd( ckey, <void*>&val)
      def cmd( self, key, val=None ):
          cdef bytes py_bytes = key.encode()
          cdef char* ckey = py_bytes
@@ -55,7 +50,7 @@ cdef class Plumed:
          cdef np.int_t[:] ibuffer
          cdef np.float64_t[:] dbuffer
          if val is None :
-            cplumed.plumed_cmd( self.c_plumed, ckey, NULL )
+            self.c_plumed.cmd( ckey, NULL )
          elif isinstance(val, (int,long) ):
             if key=="getDataRank" :
                raise ValueError("when using cmd with getDataRank option value must a size one ndarray")
@@ -74,6 +69,6 @@ cdef class Plumed:
          elif isinstance(val, basestring ) :
               py_bytes = val.encode()
               cval = py_bytes 
-              cplumed.plumed_cmd( self.c_plumed, ckey, <void*>cval )
+              self.c_plumed.cmd( ckey, <void*>cval )
          else :
             raise ValueError("Unknown value type ({})".format(str(type(val))))