diff --git a/cfg/OpendriveGlobalPlanner.cfg b/cfg/OpendriveGlobalPlanner.cfg
index fdc842008583ac02c339de60ca5316427f528968..5278b8d9b2be68d0015e387b026a19dc902c40d7 100755
--- a/cfg/OpendriveGlobalPlanner.cfg
+++ b/cfg/OpendriveGlobalPlanner.cfg
@@ -20,6 +20,7 @@ gen.add("multi_hyp",       bool_t,   0, "Use multi hypothesis path search", Fals
 gen.add("resolution",      double_t, 0, "Resolution of the generated path", 0.1, 0.01, 1.0)
 gen.add("utm_zone",        int_t,    0, "UTM zone for geodesy lat/lon to UTM conversions", 31, 1, 60)
 gen.add("cost_type",       int_t,    0, "Cost type", 0, 0, 1, edit_method=enum_cost_type)
-gen.add("debug",  bool_t,    0, "Show debug messages", False)
+gen.add("lane_mode",       bool_t,   0, "Whether to use segment or lane planning", False)
+gen.add("debug",           bool_t,   0, "Show debug messages", False)
 
 exit(gen.generate(PACKAGE, "iri_opendrive_global_planner", "OpendriveGlobalPlanner"))
diff --git a/include/iri_opendrive_global_planner/opendrive_planner.h b/include/iri_opendrive_global_planner/opendrive_planner.h
index ade42e9dea22734cdd7d96b01819ae1775d32e5b..889c9378d3367c118dd34d8860cafc69d5ad5e1d 100644
--- a/include/iri_opendrive_global_planner/opendrive_planner.h
+++ b/include/iri_opendrive_global_planner/opendrive_planner.h
@@ -136,7 +136,7 @@ class OpendriveGlobalPlanner : public nav_core::BaseGlobalPlanner
 
     CRoadMapPlanner roadmap;        
     bool load_osm_paths(std::vector<TOSMPathData> &osm_paths);
-    std::vector<unsigned int> best_path;
+    std::vector<TLaneID> best_path;
     ros::Time best_path_stamp;
     double start_angle_tol;
     double start_dist_tol;
diff --git a/src/opendrive_planner.cpp b/src/opendrive_planner.cpp
index 3cc125573abf1072f4b0d74dcc38f8224d78c48c..bd60d1dbee88a1e2da37f4c7665e3fe56ad0152e 100644
--- a/src/opendrive_planner.cpp
+++ b/src/opendrive_planner.cpp
@@ -89,8 +89,9 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D*
     try{
       std::string opendrive_file;
       double resolution;
-      int cost_type;
+      int cost_type=COST_DIST;
       int utm_zone;
+      bool lane_mode=false;
 
       if(this->private_nh.getParam("resolution", resolution))
         this->roadmap.set_resolution(resolution);
@@ -105,6 +106,12 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D*
       else
         ROS_ERROR("OpendriveGlobalPlanner: utm zone not defined");
 
+      if(!this->private_nh.getParam("lane_mode",lane_mode))
+        ROS_ERROR("OpendriveGlobalPlanner: Desired planning mode not defined");
+      if(lane_mode)
+        this->roadmap.set_lane_mode();
+      else
+        this->roadmap.set_segment_mode();
       if(this->private_nh.getParam("opendrive_file", opendrive_file))
       {
         if(opendrive_file!="")
@@ -242,8 +249,7 @@ bool OpendriveGlobalPlanner::get_opendrive_nodes(iri_nav_module::get_opendrive_n
   res.opendrive_nodes.header.stamp=this->best_path_stamp;
   res.opendrive_nodes.nodes.resize(this->best_path.size());
   for(unsigned int i=0;i<this->best_path.size();i++)
-    res.opendrive_nodes.nodes[i]=this->best_path[i];
-  res.opendrive_nodes.nodes=this->best_path;
+    res.opendrive_nodes.nodes[i]=this->best_path[i].segment_id;
 
   return true;
 }
@@ -261,7 +267,11 @@ void OpendriveGlobalPlanner::reconfigureCB(iri_opendrive_global_planner::Opendri
     this->end_angle_tol=new_config.end_angle_tol;
     this->end_dist_tol=new_config.end_dist_tol;
     this->multi_hyp=new_config.multi_hyp;
-    if(new_config.opendrive_file!=this->config.opendrive_file)
+    if(new_config.lane_mode)
+      this->roadmap.set_lane_mode();
+    else
+      this->roadmap.set_segment_mode();
+    if(new_config.opendrive_file!=this->config.opendrive_file || new_config.lane_mode!=this->config.lane_mode)
     {
       if(new_config.opendrive_file.find("xodr")!=std::string::npos)
         roadmap.load_opendrive(new_config.opendrive_file);
@@ -338,7 +348,7 @@ bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, c
   double yaw,best_cost;
   unsigned int best_path_index;
   std::vector<double> x,y,heading;
-  std::vector< std::vector<unsigned int> > paths;
+  std::vector< std::vector<TLaneID> > paths;
   std::vector<double> costs;
   std::vector<TMapPose> start_candidates,end_candidates;
   geometry_msgs::PoseStamped start_out,goal_out,point;
@@ -435,7 +445,7 @@ bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, c
       {
         std::cout << "--- path " << i << ":" << std::endl;
         for(unsigned int j=0;j<paths[i].size();j++)
-          std::cout <<"--- " <<paths[i][j] << ",";
+          std::cout <<"--- (" << paths[i][j].segment_id << "," << paths[i][j].lane_id << "),";
         std::cout << std::endl;
       }
     }
@@ -446,7 +456,7 @@ bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, c
     {
       std::cout << "--- best path index: " << best_path_index << std::endl;
       for(unsigned int i=0;i<this->best_path.size();i++)
-        std::cout <<"--- "<< this->best_path[i] << ",";
+        std::cout <<"--- (" << this->best_path[i].segment_id << "," << this->best_path[i].lane_id << "),";
       std::cout << std::endl;
     }
     this->best_path_stamp=ros::Time::now();
@@ -536,14 +546,17 @@ bool OpendriveGlobalPlanner::load_osm_paths(std::vector<TOSMPathData> &osm_paths
       return false;
     name_space=categories[i]+"/min_turn_radius";
     if(!this->private_nh.getParam(name_space,osm_paths[i].min_turn_radius))
-      return false;
+      osm_paths[i].min_turn_radius=5.0;
     name_space=categories[i]+"/min_road_length";
     if(!this->private_nh.getParam(name_space,osm_paths[i].min_road_length))
-      return false;
+      osm_paths[i].min_road_length=0.1;
     name_space=categories[i]+"/use_default_lane_width";
     if(!this->private_nh.getParam(name_space,osm_paths[i].use_default_lane_width))
-      return false;
-    name_space=categories[i]+"/force_twoways";
+      osm_paths[i].use_default_lane_width=true;
+    name_space=categories[i]+"/default_lane_width";
+    if(!this->private_nh.getParam(name_space,osm_paths[i].default_lane_width))
+      osm_paths[i].default_lane_width=4.0;
+    name_space=categories[i]+"/force_twoway";
     if(!this->private_nh.getParam(name_space,osm_paths[i].force_two_ways))
       return false;
   }