diff --git a/src/parsers/urdf/geometry.cpp b/src/parsers/urdf/geometry.cpp
index 7f2dc82cbb3dea347f3ac2dd2ddca688fcb5c084..b858ee0d31a31bbe2da407daa49d6c9c3dbb9c5a 100644
--- a/src/parsers/urdf/geometry.cpp
+++ b/src/parsers/urdf/geometry.cpp
@@ -192,6 +192,8 @@ namespace se3
 
           std::vector< boost::shared_ptr< T > > geometries_array = getLinkGeometryArray<T>(link);
 
+          if (!model.existBodyName(link_name))
+            throw std::invalid_argument("No link " + link_name + " in model");
           FrameIndex frame_id = model.getFrameId(link_name);
           SE3 body_placement = model.frames[frame_id].placement;
           assert(model.frames[frame_id].type == BODY);
diff --git a/src/parsers/urdf/model.cpp b/src/parsers/urdf/model.cpp
index 57ea3e30cbc5ffdcec4bb63b3bdea7a89508a232..b42df5c86962554dd83c23efef334b75baba9d6c 100644
--- a/src/parsers/urdf/model.cpp
+++ b/src/parsers/urdf/model.cpp
@@ -463,6 +463,8 @@ namespace se3
       ///
       void parseRootTree (::urdf::LinkConstPtr root_link, Model & model, const bool verbose) throw (std::invalid_argument)
       {
+        appendBodyToJoint(model, 0, root_link->inertial, SE3::Identity(), root_link->name);
+
         BOOST_FOREACH(::urdf::LinkPtr child, root_link->child_links)
         {
           parseTree(child, model, SE3::Identity(), verbose);