diff --git a/inc/Gtfs/Route.php b/inc/Gtfs/Route.php
new file mode 100644
index 0000000..091ae1e
--- /dev/null
+++ b/inc/Gtfs/Route.php
@@ -0,0 +1,380 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>gtfs.Route</code>
+ */
+class Route extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The route_id field contains an ID that uniquely identifies a route.
+     * The route_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string route_id = 1;</code>
+     */
+    protected $route_id = '';
+    /**
+     * The agency_id field defines an agency for the specified route.
+     *
+     * Generated from protobuf field <code>string agency_id = 2;</code>
+     */
+    protected $agency_id = '';
+    /**
+     * The route_short_name contains the short name of a route.
+     *
+     * Generated from protobuf field <code>string route_short_name = 3;</code>
+     */
+    protected $route_short_name = '';
+    /**
+     * The route_long_name contains the full name of a route.
+     *
+     * Generated from protobuf field <code>string route_long_name = 4;</code>
+     */
+    protected $route_long_name = '';
+    /**
+     * The route_desc field contains a description of a route.
+     *
+     * Generated from protobuf field <code>string route_desc = 5;</code>
+     */
+    protected $route_desc = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
+     */
+    protected $route_type = 0;
+    /**
+     * The route_url field contains the URL of a web page about that particular route.
+     *
+     * Generated from protobuf field <code>string route_url = 7;</code>
+     */
+    protected $route_url = '';
+    /**
+     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
+     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
+     *
+     * Generated from protobuf field <code>string route_color = 8;</code>
+     */
+    protected $route_color = '';
+    /**
+     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
+     *
+     * Generated from protobuf field <code>string route_text_color = 9;</code>
+     */
+    protected $route_text_color = '';
+    /**
+     * The extensions namespace allows 3rd-party developers to extend the
+     * GTFS specification in order to add and evaluate new features and
+     * modifications to the spec.
+     *
+     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
+     */
+    protected $extension = null;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $route_id
+     *           The route_id field contains an ID that uniquely identifies a route.
+     *           The route_id is dataset unique.
+     *     @type string $agency_id
+     *           The agency_id field defines an agency for the specified route.
+     *     @type string $route_short_name
+     *           The route_short_name contains the short name of a route.
+     *     @type string $route_long_name
+     *           The route_long_name contains the full name of a route.
+     *     @type string $route_desc
+     *           The route_desc field contains a description of a route.
+     *     @type int $route_type
+     *     @type string $route_url
+     *           The route_url field contains the URL of a web page about that particular route.
+     *     @type string $route_color
+     *           In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
+     *           The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
+     *     @type string $route_text_color
+     *           The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
+     *     @type \Google\Protobuf\Any $extension
+     *           The extensions namespace allows 3rd-party developers to extend the
+     *           GTFS specification in order to add and evaluate new features and
+     *           modifications to the spec.
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Proto\Gtfs::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * The route_id field contains an ID that uniquely identifies a route.
+     * The route_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string route_id = 1;</code>
+     * @return string
+     */
+    public function getRouteId()
+    {
+        return $this->route_id;
+    }
+
+    /**
+     * The route_id field contains an ID that uniquely identifies a route.
+     * The route_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string route_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_id field defines an agency for the specified route.
+     *
+     * Generated from protobuf field <code>string agency_id = 2;</code>
+     * @return string
+     */
+    public function getAgencyId()
+    {
+        return $this->agency_id;
+    }
+
+    /**
+     * The agency_id field defines an agency for the specified route.
+     *
+     * Generated from protobuf field <code>string agency_id = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The route_short_name contains the short name of a route.
+     *
+     * Generated from protobuf field <code>string route_short_name = 3;</code>
+     * @return string
+     */
+    public function getRouteShortName()
+    {
+        return $this->route_short_name;
+    }
+
+    /**
+     * The route_short_name contains the short name of a route.
+     *
+     * Generated from protobuf field <code>string route_short_name = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteShortName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_short_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * The route_long_name contains the full name of a route.
+     *
+     * Generated from protobuf field <code>string route_long_name = 4;</code>
+     * @return string
+     */
+    public function getRouteLongName()
+    {
+        return $this->route_long_name;
+    }
+
+    /**
+     * The route_long_name contains the full name of a route.
+     *
+     * Generated from protobuf field <code>string route_long_name = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteLongName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_long_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * The route_desc field contains a description of a route.
+     *
+     * Generated from protobuf field <code>string route_desc = 5;</code>
+     * @return string
+     */
+    public function getRouteDesc()
+    {
+        return $this->route_desc;
+    }
+
+    /**
+     * The route_desc field contains a description of a route.
+     *
+     * Generated from protobuf field <code>string route_desc = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteDesc($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_desc = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
+     * @return int
+     */
+    public function getRouteType()
+    {
+        return $this->route_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setRouteType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Route_RouteType::class);
+        $this->route_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * The route_url field contains the URL of a web page about that particular route.
+     *
+     * Generated from protobuf field <code>string route_url = 7;</code>
+     * @return string
+     */
+    public function getRouteUrl()
+    {
+        return $this->route_url;
+    }
+
+    /**
+     * The route_url field contains the URL of a web page about that particular route.
+     *
+     * Generated from protobuf field <code>string route_url = 7;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_url = $var;
+
+        return $this;
+    }
+
+    /**
+     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
+     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
+     *
+     * Generated from protobuf field <code>string route_color = 8;</code>
+     * @return string
+     */
+    public function getRouteColor()
+    {
+        return $this->route_color;
+    }
+
+    /**
+     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
+     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
+     *
+     * Generated from protobuf field <code>string route_color = 8;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteColor($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_color = $var;
+
+        return $this;
+    }
+
+    /**
+     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
+     *
+     * Generated from protobuf field <code>string route_text_color = 9;</code>
+     * @return string
+     */
+    public function getRouteTextColor()
+    {
+        return $this->route_text_color;
+    }
+
+    /**
+     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
+     *
+     * Generated from protobuf field <code>string route_text_color = 9;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteTextColor($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_text_color = $var;
+
+        return $this;
+    }
+
+    /**
+     * The extensions namespace allows 3rd-party developers to extend the
+     * GTFS specification in order to add and evaluate new features and
+     * modifications to the spec.
+     *
+     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
+     * @return \Google\Protobuf\Any
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * The extensions namespace allows 3rd-party developers to extend the
+     * GTFS specification in order to add and evaluate new features and
+     * modifications to the spec.
+     *
+     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
+     * @param \Google\Protobuf\Any $var
+     * @return $this
+     */
+    public function setExtension($var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Any::class);
+        $this->extension = $var;
+
+        return $this;
+    }
+
+}
+
