diff --git a/include/opendrive/opendrive_lane.h b/include/opendrive/opendrive_lane.h
index 43cddca5a926f681eabcaab9779ff3c6f7bf6103..959667d6e858e1ba97d477f39047e10b96a80d3e 100644
--- a/include/opendrive/opendrive_lane.h
+++ b/include/opendrive/opendrive_lane.h
@@ -10,6 +10,7 @@
 class COpendriveLane
 {
   friend class COpendriveRoadSegment;
+  friend class COpendriveJunction;
   private:
     opendrive_mark_t right_mark;
     double speed;
diff --git a/include/road_segment.h b/include/road_segment.h
index 5164acf36121a078c5116e7f113cb58c45c86ff4..60c62f3d3157ec09a0373a9724782007edd132eb 100644
--- a/include/road_segment.h
+++ b/include/road_segment.h
@@ -41,7 +41,7 @@ class CRoadSegment
     CRoadSegment(unsigned int lanes_in,unsigned int lanes_out);
     unsigned int get_id(void);
     void set_resolution(double resolution);
-    double get_resolution(double resolution);
+    double get_resolution(void);
     bool has_parent_road(void);
     CRoad &get_parent_road(void);
     bool has_parent_junction(void);
@@ -53,6 +53,7 @@ class CRoadSegment
     unsigned int get_num_lanes_in(void);
     unsigned int get_num_lanes_out(void);
     double get_lane_width(void);
+    double get_lane_speed(void);
     unsigned int get_lane(double lateral_offset);
     void set_geometry(TPoint &start_point,TPoint &end_point);
     void get_start_point(TPoint &point);
@@ -61,6 +62,7 @@ class CRoadSegment
     void link_lanes(unsigned int lane1,unsigned int lane2);
     void unlink_lanes(unsigned int lane1,unsigned int lane2);
     bool are_lanes_linked(unsigned int lane1,unsigned int lane2);
+    void get_connectivity_matrix(Eigen::MatrixXd &connectivity);
     double get_length(void);
     bool get_point_at(double distance, double lateral_offset,TPoint &point);
     bool get_closest_point(TPoint &target_point,TPoint &closest_point,double &distance,double &lateral_offset,double angle_tol=std::numeric_limits<double>::max());
diff --git a/src/road_segment.cpp b/src/road_segment.cpp
index eab1f7d62d5595ccbad3b50d6f6a40bfd99fa4a5..33b3b6aa6adb767770cf36bd57ecd5e6e40ecdb3 100644
--- a/src/road_segment.cpp
+++ b/src/road_segment.cpp
@@ -140,7 +140,7 @@ void CRoadSegment::set_resolution(double resolution)
     this->spline.generate(this->resolution,(unsigned int)10);
 }
 
-double CRoadSegment::get_resolution(double resolution)
+double CRoadSegment::get_resolution(void)
 {
   return this->resolution;
 }
@@ -239,6 +239,37 @@ double CRoadSegment::get_lane_width(void)
   return width;
 }
 
+double CRoadSegment::get_lane_speed(void)
+{
+  double speed;
+
+  if(this->parent_road!=NULL)
+    return this->parent_road->get_lane_width();
+  else
+  {
+    if(this->get_num_prev_segments()==1)
+    {
+      CRoadSegment &prev_segment=this->get_prev_segment_by_index(0);
+      if(prev_segment.has_parent_road())
+        speed=prev_segment.get_parent_road().get_lane_speed();
+      else
+        speed=50.0;
+    }
+    else if(this->get_num_next_segments()==1)
+    {
+      CRoadSegment &next_segment=this->get_next_segment_by_index(0);
+      if(next_segment.has_parent_road())
+        speed=next_segment.get_parent_road().get_lane_speed();
+      else
+        speed=50.0;
+    }
+    else
+      speed=0.0;
+  }
+
+  return speed;
+}
+
 unsigned int CRoadSegment::get_lane(double lateral_offset)
 {
   unsigned int num_lanes;
@@ -314,6 +345,11 @@ bool CRoadSegment::are_lanes_linked(unsigned int lane1,unsigned int lane2)
      return false;
 }   
 
+void CRoadSegment::get_connectivity_matrix(Eigen::MatrixXd &connectivity)
+{
+  connectivity=this->connectivity;
+}
+
 double CRoadSegment::get_length(void)
 {
   return this->spline.get_length();