diff --git a/CMakeLists.txt b/CMakeLists.txt
index e9eae80f9ab3301d9eafb44565e88e8d618cee94..7cd8628deee84a34fcbc62f806e47f312226b3ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,6 @@ INCLUDE(cmake/base.cmake)
 INCLUDE(cmake/boost.cmake)
 INCLUDE(cmake/eigen.cmake)
 INCLUDE(cmake/python.cmake)
-INCLUDE(CMakeDependentOption)
 
 SET(PROJECT_NAME pinocchio)
 SET(PROJECT_DESCRIPTION "Rigid multi body dynamics algorithms")
@@ -71,17 +70,12 @@ OPTION (BUILD_UTILS "Build the utils" OFF)
 OPTION (INITIALIZE_WITH_NAN "Initialize Eigen entries with NaN" OFF)
 OPTION (BUILD_TESTS_WITH_HPP "Build geom tests and benchmarks with hpp to do comparisons" OFF)
 OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" ON)
-CMAKE_DEPENDENT_OPTION(BUILD_PYTHON_PARSER "Build pinocchio with the Python parser" ON "BUILD_PYTHON_INTERFACE" ON)
 
 IF (INITIALIZE_WITH_NAN)
   MESSAGE (STATUS "Initialize with NaN all the Eigen entries.")
   ADD_DEFINITIONS(-DEIGEN_INITIALIZE_MATRICES_BY_NAN)
 ENDIF (INITIALIZE_WITH_NAN)
 
-IF(BUILD_PYTHON_PARSER)
-  SET(BUILD_PYTHON_INTERFACE ON)
-ENDIF(BUILD_PYTHON_PARSER)
-
 # ----------------------------------------------------
 # --- DEPENDANCIES -----------------------------------
 # ----------------------------------------------------
@@ -96,6 +90,7 @@ IF(EIGEN3_FOUND)
   IF(${EIGEN3_VERSION} VERSION_GREATER "3.2.9")
     ADD_DEFINITIONS(-DEIGEN3_FUTURE)
     SET(EIGEN3_FUTURE TRUE)
+    PKG_CONFIG_APPEND_CFLAGS("-DEIGEN3_FUTURE")
   ELSE(${EIGEN3_VERSION} VERSION_GREATER "3.2.9")
     SET(EIGEN3_FUTURE FALSE)
   ENDIF(${EIGEN3_VERSION} VERSION_GREATER "3.2.9")
@@ -106,6 +101,7 @@ IF(URDFDOM_FOUND)
   IF(${URDFDOM_VERSION} VERSION_LESS "0.3.0")
     ADD_DEFINITIONS(-DURDFDOM_COLLISION_WITH_GROUP_NAME)
     SET(URDFDOM_COLLISION_WITH_GROUP_NAME TRUE)
+    PKG_CONFIG_APPEND_CFLAGS("-DURDFDOM_COLLISION_WITH_GROUP_NAME")
   ENDIF(${URDFDOM_VERSION} VERSION_LESS "0.3.0")
 ENDIF(URDFDOM_FOUND)
 
@@ -113,9 +109,7 @@ SET(BOOST_REQUIERED_COMPONENTS filesystem system)
 SET(BOOST_BUILD_COMPONENTS unit_test_framework)
 SET(BOOST_OPTIONAL_COMPONENTS "")
 
-
 IF(BUILD_PYTHON_INTERFACE)
-  ADD_SEPARATE_DEPENDENCY("eigenpy >= 1.3.0")
   SET(BOOST_OPTIONAL_COMPONENTS ${BOOST_OPTIONAL_COMPONENTS} python)
   FINDPYTHON(2.7 EXACT REQUIRED)
   INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS}) 
@@ -225,12 +219,6 @@ SET(${PROJECT_NAME}_PARSERS_HEADERS
   parsers/srdf.hpp
   ) 
 
-IF(BUILD_PYTHON_PARSER)
-  LIST(APPEND ${PROJECT_NAME}_PARSERS_HEADERS
-     parsers/python.hpp
-     )
-ENDIF(BUILD_PYTHON_PARSER)
-
 IF(URDFDOM_FOUND)
   LIST(APPEND ${PROJECT_NAME}_PARSERS_HEADERS
     parsers/urdf.hpp
@@ -309,6 +297,7 @@ ENDFOREACH(header)
 ADD_SUBDIRECTORY(src)
 
 # --- BINDINGS -----------------------------------------------------------------
+SET(PYWRAP ${PROJECT_NAME}_pywrap)
 ADD_SUBDIRECTORY(bindings)
 
 # --- EXECUTABLES --------------------------------------------------------------
@@ -323,17 +312,6 @@ ADD_SUBDIRECTORY(benchmark)
 # --- PACKAGING ----------------------------------------------------------------
 PKG_CONFIG_APPEND_LIBS (${PROJECT_NAME})
 PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_REQUIERED_COMPONENTS})
-IF(BUILD_PYTHON_PARSER)
-  PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_OPTIONAL_COMPONENTS})
-ENDIF(BUILD_PYTHON_PARSER)
-
-IF(EIGEN3_FUTURE)
-  PKG_CONFIG_APPEND_CFLAGS("-DEIGEN3_FUTURE")
-ENDIF(EIGEN3_FUTURE)
-
-IF(URDFDOM_COLLISION_WITH_GROUP_NAME)
-  PKG_CONFIG_APPEND_CFLAGS("-DURDFDOM_COLLISION_WITH_GROUP_NAME")
-ENDIF(URDFDOM_COLLISION_WITH_GROUP_NAME)
 
 FOREACH(cflags ${CFLAGS_DEPENDENCIES})
   PKG_CONFIG_APPEND_CFLAGS(${cflags})
diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt
index 5d9271606adb612c79bb25c0a3a0db5d3012f85b..30ad08b96f4d4814346e67f10f03b1d891e1c57b 100644
--- a/bindings/CMakeLists.txt
+++ b/bindings/CMakeLists.txt
@@ -14,4 +14,6 @@
 # pinocchio If not, see
 # <http://www.gnu.org/licenses/>.
 
-ADD_SUBDIRECTORY(python)
+IF(BUILD_PYTHON_INTERFACE)
+  ADD_SUBDIRECTORY(python)
+ENDIF(BUILD_PYTHON_INTERFACE)
diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
index f18102a931a6b78ca83e9a5b23b4fabc4466a72c..b4545736904b28ade71fc055145a781bcd30c215 100644
--- a/bindings/python/CMakeLists.txt
+++ b/bindings/python/CMakeLists.txt
@@ -15,6 +15,8 @@
 # Pinocchio If not, see
 # <http://www.gnu.org/licenses/>.
 
+# --- MACROS --- #
+
 MACRO(ADD_GROUP GROUP_NAME FILENAMES)
   FOREACH(filename ${${FILENAMES}})
     GET_FILENAME_COMPONENT(filenamePath ${filename} PATH)
@@ -35,154 +37,200 @@ MACRO(ADD_SOURCE_GROUP FILENAMES)
   ADD_GROUP("Source Files" ${FILENAMES})
 ENDMACRO(ADD_SOURCE_GROUP FILENAMES)
 
-IF(BUILD_PYTHON_INTERFACE)
-
-  SET(${PROJECT_NAME}_PYTHON_HEADERS
-    eigen_container.hpp
-    handler.hpp
-    python.hpp
-    se3.hpp
-    force.hpp
-    motion.hpp
-    inertia.hpp
-    joints-models.hpp
-    joints-variant.hpp
-    joint.hpp
-    joint-derived.hpp
-    frame.hpp
-    model.hpp
-    data.hpp
-    algorithm/algorithms.hpp 
-    parsers.hpp
-    explog.hpp
-    geometry-object.hpp
-    geometry-model.hpp
-    geometry-data.hpp
-    )
-
-  SET(${PROJECT_NAME}_PYTHON_SOURCES
-    module.cpp
-    expose-SE3.cpp
-    expose-motion.cpp
-    expose-force.cpp
-    expose-inertia.cpp
-    expose-explog.cpp
-    expose-joints.cpp
-    expose-frame.cpp
-    expose-model.cpp
-    expose-data.cpp
-    expose-parsers.cpp
-    algorithm/expose-algorithms.cpp
-    algorithm/expose-com.cpp
-    algorithm/expose-kinematics.cpp
-    algorithm/expose-dynamics.cpp
-    algorithm/expose-crba.cpp
-    algorithm/expose-rnea.cpp
-    algorithm/expose-aba.cpp
-    algorithm/expose-jacobian.cpp
-    algorithm/expose-joints.cpp
-    algorithm/expose-energy.cpp
-    algorithm/expose-frames.cpp
-    algorithm/expose-cat.cpp
-    )
-
-  LIST(APPEND ${PROJECT_NAME}_PYTHON_HEADERS
-    geometry-object.hpp
-    geometry-model.hpp
-    geometry-data.hpp
-    )
-
-  LIST(APPEND ${PROJECT_NAME}_PYTHON_SOURCES
-    expose-geometry.cpp
-    algorithm/expose-geometry.cpp
-    )
-
-  LIST(APPEND HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS})
-  LIST(REMOVE_DUPLICATES HEADERS)
-
-  MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python")
-  MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python/algorithm")
-  FOREACH(header ${${PROJECT_NAME}_PYTHON_HEADERS})
+MACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH)
+  FOREACH(header ${HEADERS})
     GET_FILENAME_COMPONENT(headerName ${header} NAME)
     GET_FILENAME_COMPONENT(headerPath ${header} PATH)
     EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK}
-      ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${header}
-      ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/bindings/python/${header})
-    INSTALL(FILES ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${header}
-      DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/bindings/python
+      ${CMAKE_CURRENT_SOURCE_DIR}/${header}
+      ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/${SUBPATH}/${header})
+    INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${header}
+      DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/SUBPATH
             PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE)
   ENDFOREACH(header)
-
-  MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}")
-  
-  # --- COMPILE WRAPPER
-  SET(PYWRAP ${PROJECT_NAME}_pywrap)
-  ADD_LIBRARY(${PYWRAP} SHARED ${${PROJECT_NAME}_PYTHON_SOURCES} ${${PROJECT_NAME}_PYTHON_HEADERS})
-  ADD_HEADER_GROUP(${PROJECT_NAME}_PYTHON_HEADERS)
-  ADD_SOURCE_GROUP(${PROJECT_NAME}_PYTHON_SOURCES)
-  PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} eigenpy)
-
-  IF(URDFDOM_FOUND)
-    PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} urdfdom)
-  ENDIF(URDFDOM_FOUND)
-  IF(HPP_FCL_FOUND)
-    PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} hpp-fcl)
-  ENDIF(HPP_FCL_FOUND)
-  IF(LUA5_1_FOUND)
-    PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} lua5.1)
-  ENDIF(LUA5_1_FOUND)
-
-  TARGET_LINK_LIBRARIES(${PYWRAP} ${PROJECT_NAME})
-  TARGET_LINK_BOOST_PYTHON(${PYWRAP})
-
-  IF(APPLE)
-    # We need to change the extension for python bindings
-    SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES SUFFIX ".so")
-  ENDIF(APPLE)
-
-  SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES
-    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/python/${PROJECT_NAME}")
-
+ENDMACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH)
+
+# --- DEPENDENCIES --- #
+SET(PKG_CONFIG_PYWRAP_REQUIRES "eigenpy >= 1.3.1")
+FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
+  ADD_SEPARATE_DEPENDENCY(${dep})
+ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
+
+# --- LIBRARY --- #
+SET(${PYWRAP}_INSTALL_DIR "${PYTHON_SITELIB}/${PROJECT_NAME}")
+
+SET(${PROJECT_NAME}_PYTHON_HEADERS
+  eigen_container.hpp
+  handler.hpp
+  python.hpp
+  se3.hpp
+  force.hpp
+  motion.hpp
+  inertia.hpp
+  joints-models.hpp
+  joints-variant.hpp
+  joint.hpp
+  joint-derived.hpp
+  frame.hpp
+  model.hpp
+  data.hpp
+  algorithm/algorithms.hpp 
+  parsers.hpp
+  explog.hpp
+  geometry-object.hpp
+  geometry-model.hpp
+  geometry-data.hpp
+  )
+
+SET(${PROJECT_NAME}_PARSER_PYTHON_HEADERS
+  parsers/python.hpp
+  )
+
+SET(${PROJECT_NAME}_PARSER_PYTHON_SOURCES
+  parsers/python/model.cpp
+  )
+
+SET(${PROJECT_NAME}_PYTHON_SOURCES
+  module.cpp
+  expose-SE3.cpp
+  expose-motion.cpp
+  expose-force.cpp
+  expose-inertia.cpp
+  expose-explog.cpp
+  expose-joints.cpp
+  expose-frame.cpp
+  expose-model.cpp
+  expose-data.cpp
+  expose-parsers.cpp
+  algorithm/expose-algorithms.cpp
+  algorithm/expose-com.cpp
+  algorithm/expose-kinematics.cpp
+  algorithm/expose-dynamics.cpp
+  algorithm/expose-crba.cpp
+  algorithm/expose-rnea.cpp
+  algorithm/expose-aba.cpp
+  algorithm/expose-jacobian.cpp
+  algorithm/expose-joints.cpp
+  algorithm/expose-energy.cpp
+  algorithm/expose-frames.cpp
+  algorithm/expose-cat.cpp
+  )
+
+LIST(APPEND ${PROJECT_NAME}_PYTHON_HEADERS
+  geometry-object.hpp
+  geometry-model.hpp
+  geometry-data.hpp
+  )
+
+LIST(APPEND ${PROJECT_NAME}_PYTHON_SOURCES
+  expose-geometry.cpp
+  algorithm/expose-geometry.cpp
+  )
+
+LIST(APPEND HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS})
+LIST(REMOVE_DUPLICATES HEADERS)
+
+# Headers of the python binding
+MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python")
+MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python/algorithm")
+SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PYTHON_HEADERS}" "bindings/python")
+
+# Headers of the python parser
+MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/parsers/python")
+SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PARSER_PYTHON_HEADERS}" "")
+
+# --- COMPILE WRAPPER
+MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${PROJECT_NAME}")
+SET(${PYWRAP}_SOURCES ${${PROJECT_NAME}_PYTHON_SOURCES} ${${PROJECT_NAME}_PARSER_PYTHON_SOURCES})
+SET(${PYWRAP}_HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS} ${${PROJECT_NAME}_PARSER_PYTHON_HEADERS})
+
+ADD_LIBRARY(${PYWRAP} SHARED ${${PYWRAP}_SOURCES} ${${PYWRAP}_HEADERS})
+ADD_HEADER_GROUP(${PYWRAP}_PYTHON_HEADERS)
+ADD_SOURCE_GROUP(${PYWRAP}_PYTHON_SOURCES)
+PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} eigenpy)
+
+TARGET_LINK_LIBRARIES(${PYWRAP} ${PROJECT_NAME})
+TARGET_LINK_BOOST_PYTHON(${PYWRAP})
+
+IF(APPLE)
+  # We need to change the extension for python bindings
+  SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES SUFFIX ".so")
+ENDIF(APPLE)
+
+SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES
+  LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bindings/python/lib")
+
+INSTALL(FILES
+  "${CMAKE_BINARY_DIR}/bindings/python/lib/lib${PYWRAP}.so"
+  DESTINATION ${${PYWRAP}_INSTALL_DIR})
+
+# --- INSTALL SCRIPTS 
+SET(PYTHON_FILES
+  __init__.py
+  utils.py
+  robot_wrapper.py
+  romeo_wrapper.py
+  rpy.py
+  explog.py
+  )
+
+FOREACH(python ${PYTHON_FILES})
+  GET_FILENAME_COMPONENT(pythonFile ${python} NAME)
+  EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK}
+    ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}
+    ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile})
+    
+  # Tag pyc file as generated.
+  SET_SOURCE_FILES_PROPERTIES(
+    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c"
+    PROPERTIES GENERATED TRUE)
+    
+  EXECUTE_PROCESS(COMMAND
+    ${PYTHON_EXECUTABLE} -m py_compile
+    ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile})
+    
+  # Clean generated files.
+  SET_PROPERTY(
+    DIRECTORY APPEND PROPERTY
+    ADDITIONAL_MAKE_CLEAN_FILES
+    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c")
+    
   INSTALL(FILES
-    "${CMAKE_BINARY_DIR}/lib/python/${PROJECT_NAME}/lib${PYWRAP}.so"
-    DESTINATION ${PYTHON_SITELIB}/${PROJECT_NAME})
-  
-  # --- INSTALL SCRIPTS 
-  SET(PYTHON_FILES
-    __init__.py
-    utils.py
-    robot_wrapper.py
-    romeo_wrapper.py
-    rpy.py
-    explog.py
-    )
-  
-  FOREACH(python ${PYTHON_FILES})
-    GET_FILENAME_COMPONENT(pythonFile ${python} NAME)
-    EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK}
-      ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}
-      ${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile})
-      
-    # Tag pyc file as generated.
-    SET_SOURCE_FILES_PROPERTIES(
-      "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c"
-      PROPERTIES GENERATED TRUE)
-      
-    EXECUTE_PROCESS(COMMAND
-      ${PYTHON_EXECUTABLE} -m py_compile
-      ${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile})
-      
-    # Clean generated files.
-    SET_PROPERTY(
-      DIRECTORY APPEND PROPERTY
-      ADDITIONAL_MAKE_CLEAN_FILES
-      "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c")
-      
-    INSTALL(FILES
-      "${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}"
-      "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c"
-      DESTINATION ${PYTHON_SITELIB}/${PROJECT_NAME})
-  ENDFOREACH(python)
-
-ENDIF(BUILD_PYTHON_INTERFACE)
+    "${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}"
+    "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c"
+    DESTINATION ${${PYWRAP}_INSTALL_DIR})
+ENDFOREACH(python)
+
+# --- PACKAGING --- #
+
+# Format string
+SET(_PKG_CONFIG_PYWRAP_LIBDIR ${${PYWRAP}_INSTALL_DIR})
+SET(_PKG_CONFIG_PYWRAP_BINDIR ${${PYWRAP}_INSTALL_DIR})
+SET(_PKG_CONFIG_PYWRAP_CONFLICTS)
+SET(_PKG_CONFIG_PYWRAP_REQUIRES "${PROJECT_NAME}")
+FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
+  SET(_PKG_CONFIG_PYWRAP_REQUIRES "${_PKG_CONFIG_PYWRAP_REQUIRES}, ${dep}")
+ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES})
+
+SET(_PKG_CONFIG_PYWRAP_LIBS "-L\${libdir} -l${PYWRAP}")
+IF(APPLE)
+  SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} -Wl,-undefined,dynamic_lookup,${Boost_${UPPERCOMPONENT}_LIBRARY}")
+ELSE(APPLE)
+  SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} ${LIBINCL_KW}boost_python")
+ENDIF(APPLE)
+
+SET(_PKG_CONFIG_PYWRAP_CFLAGS "-I\${includedir} -I/usr/local/include")
+SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} -I${PYTHON_INCLUDE_DIRS}")
+FOREACH(cflags ${CFLAGS_DEPENDENCIES})
+  SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} ${cflags}")
+ENDFOREACH(cflags ${CFLAGS_DEPENDENCIES})
+
+CONFIGURE_FILE(
+   "${CMAKE_CURRENT_SOURCE_DIR}/pinocchiopy.pc.cmake"
+   "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc")
+
+INSTALL(
+    FILES "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc"
+    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
+    PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE)
 
diff --git a/src/parsers/python.hpp b/bindings/python/parsers/python.hpp
similarity index 100%
rename from src/parsers/python.hpp
rename to bindings/python/parsers/python.hpp
diff --git a/src/parsers/python.cpp b/bindings/python/parsers/python/model.cpp
similarity index 78%
rename from src/parsers/python.cpp
rename to bindings/python/parsers/python/model.cpp
index 56a81ff59b817d046eeb653240a6214d71e51e78..21f46874e5e246496d6a1f0a12bebd515937e0a5 100644
--- a/src/parsers/python.cpp
+++ b/bindings/python/parsers/python/model.cpp
@@ -16,6 +16,7 @@
 // <http://www.gnu.org/licenses/>.
 
 #include "pinocchio/parsers/python.hpp"
+#include "pinocchio/bindings/python/model.hpp"
 
 #include <iostream>
 #include <Python.h>
@@ -30,18 +31,13 @@ namespace se3
     Model buildModel(const std::string & filename, const std::string & model_name, bool verbose) throw (bp::error_already_set)
     {
       Py_Initialize();
-      // Get a dict for the global namespace to exec further python code with
       bp::object main_module = bp::import("__main__");
+      // Get a dict for the global namespace to exec further python code with
       bp::dict globals = bp::extract<bp::dict>(main_module.attr("__dict__"));
 
       // We need to link to the pinocchio PyWrap. We delegate the dynamic loading to the python interpreter.
-      bp::exec("import pinocchio", globals);
-
-      // Create a new Model, get a shared_ptr to it, and include this pointer
-      // into the global namespace. See python/handler.hpp for more details.
-      boost::shared_ptr<Model> model(new Model());
-      bp::object obj(model);
-      globals[model_name] = obj;
+      
+      bp::object cpp_module( (bp::handle<>(PyImport_AddModule("libpinocchio_pywrap"))) );
 
       // That's it, you can exec your python script, starting with a model you
       // can update as you want.
@@ -53,13 +49,25 @@ namespace se3
         PyErr_PrintEx(0);
       }
       
+      Model * model_ptr;
+      try
+      {
+        bp::object obj_model = globals[model_name];
+        ModelHandler model_handler = bp::extract<ModelHandler>(obj_model);
+        model_ptr = model_handler.ptr();
+      }
+      catch (bp::error_already_set & e)
+      {
+        PyErr_PrintEx(0);
+      }
       if (verbose)
       {
-        std::cout << "Your model has been built. It has " << model->nv;
+        std::cout << "Your model has been built. It has " << model_ptr->nv;
         std::cout << " degrees of freedom." << std::endl;
       }
       
-      return *model;
+//      Py_Finalize();
+      return *model_ptr;
     }
   } // namespace python
 } // namespace se3
diff --git a/bindings/python/pinocchiopy.pc.cmake b/bindings/python/pinocchiopy.pc.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6f99a18421d5f57b8ccd9a0dd9991d0e2919bb80
--- /dev/null
+++ b/bindings/python/pinocchiopy.pc.cmake
@@ -0,0 +1,19 @@
+prefix=${_PKG_CONFIG_PREFIX}
+exec_prefix=${_PKG_CONFIG_EXEC_PREFIX}
+libdir=${_PKG_CONFIG_PYWRAP_LIBDIR}
+bindir=${_PKG_CONFIG_PYWRAP_BINDIR}
+pkglibdir=${_PKG_CONFIG_PKGLIBDIR}
+includedir=${_PKG_CONFIG_INCLUDEDIR}
+datarootdir=${_PKG_CONFIG_DATAROOTDIR}
+pkgdatarootdir=${_PKG_CONFIG_PKGDATAROOTDIR}
+docdir=${_PKG_CONFIG_DOCDIR}
+doxygendocdir=${_PKG_CONFIG_DOXYGENDOCDIR}
+
+Name: pinocchiopy
+Description: Python bindings of Pinocchio
+URL: ${_PKG_CONFIG_URL}
+Version: ${_PKG_CONFIG_VERSION}
+Requires: ${_PKG_CONFIG_PYWRAP_REQUIRES}
+Conflicts: ${_PKG_CONFIG_PYWRAP_CONFLICTS}
+Libs: ${_PKG_CONFIG_PYWRAP_LIBS}
+Cflags: ${_PKG_CONFIG_PYWRAP_CFLAGS}
diff --git a/models/simple_model.py b/models/simple_model.py
index 6fbf0661b35411256671d8705226a305ab885e7f..c79d26a5ddfa2e35b551c1da03736520d299eed0 100644
--- a/models/simple_model.py
+++ b/models/simple_model.py
@@ -36,10 +36,10 @@ def color(body_number=1):
 
 
 class ModelWrapper(object):
-    def __init__(self, model, name=None, display=False):
+    def __init__(self, name=None, display=False):
         self.visuals = [('universe', se3.SE3.Identity(), se3.SE3.Identity().translation)]
         self.name = self.__class__.__name__ if name is None else name
-        self.model = model
+        self.model = se3.Model.BuildEmptyModel()
         self.display = display
         self.add_joints()
 
@@ -149,4 +149,5 @@ class SimplestWalker(ModelWrapper):
          },
     ]
 
-SimplestWalker(model)
+walker = SimplestWalker()
+model = walker.model
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2cf9291bd5209366d5a6e13b65c0234891aefeae..a99fa96d0767873ea26bca6e6374801aacbd157b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -51,12 +51,6 @@ SET(${PROJECT_NAME}_PARSERS_SOURCES
   parsers/sample-models.cpp
   )
 
-IF(BUILD_PYTHON_PARSER)
-  LIST(APPEND ${PROJECT_NAME}_PARSERS_SOURCES
-    parsers/python.cpp
-    )
-ENDIF(BUILD_PYTHON_PARSER)
-
 IF(URDFDOM_FOUND)
   LIST(APPEND ${PROJECT_NAME}_PARSERS_SOURCES
     parsers/urdf/model.cpp
@@ -86,10 +80,6 @@ IF(UNIX)
     PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME} eigen3)
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY})
 
-    IF(BUILD_PYTHON_PARSER)
-      TARGET_LINK_BOOST_PYTHON(${PROJECT_NAME})
-    ENDIF(BUILD_PYTHON_PARSER)
-
     IF(URDFDOM_FOUND)
       PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME} urdfdom)
     ENDIF(URDFDOM_FOUND)
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 34b468b45cb145ec37862006bec47047c423d5c2..da6a9bb418d0f0ddbc1ed47024e68e05df741895 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -36,11 +36,6 @@ MACRO(ADD_UNIT_TEST NAME PKGS)
   TARGET_LINK_LIBRARIES(${NAME} ${PROJECT_NAME})
   TARGET_LINK_LIBRARIES(${NAME} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
 
-  IF(BUILD_PYTHON_INTERFACE)
-    TARGET_LINK_BOOST_PYTHON(${NAME})
-    TARGET_LINK_LIBRARIES(${NAME} ${PYTHON_LIBRARIES})
-  ENDIF(BUILD_PYTHON_INTERFACE)
-
   ADD_TEST(NAME ${NAME} COMMAND ${NAME})
   ADD_DEPENDENCIES(check ${NAME})
 ENDMACRO(ADD_UNIT_TEST)
@@ -98,8 +93,15 @@ IF(LUA5_1_FOUND)
 ENDIF(LUA5_1_FOUND)
 
 IF(BUILD_PYTHON_INTERFACE)
-  ADD_UNIT_TEST(python_parser eigen3)
+  IF (BUILD_UNIT_TESTS)
+    ADD_EXECUTABLE(python_parser python_parser.cpp)
+  ELSE (BUILD_UNIT_TESTS)
+    ADD_EXECUTABLE(python_parser EXCLUDE_FROM_ALL python_parser.cpp)
+  ENDIF (BUILD_UNIT_TESTS)
   ADD_TEST_CFLAGS(python_parser '-DPINOCCHIO_SOURCE_DIR=\\\"${${PROJECT_NAME}_SOURCE_DIR}\\\"')
+  TARGET_LINK_LIBRARIES(python_parser ${PYWRAP})
+  TARGET_LINK_LIBRARIES(python_parser ${PYTHON_LIBRARIES})
+  TARGET_LINK_LIBRARIES(python_parser ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
 ENDIF(BUILD_PYTHON_INTERFACE)
 
 # Work in progress