diff --git a/inc/Gtfs/Agency.php b/inc/Gtfs/Agency.php
new file mode 100644
index 0000000..43f1f3c
--- /dev/null
+++ b/inc/Gtfs/Agency.php
@@ -0,0 +1,307 @@
+<?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.Agency</code>
+ */
+class Agency extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The agency_id field is an ID that uniquely identifies a transit agency.
+     *
+     * Generated from protobuf field <code>string agency_id = 1;</code>
+     */
+    protected $agency_id = '';
+    /**
+     * The agency_name field contains the full name of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_name = 2;</code>
+     */
+    protected $agency_name = '';
+    /**
+     * The agency_url field contains the URL of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_url = 3;</code>
+     */
+    protected $agency_url = '';
+    /**
+     * The agency_timezone field contains the timezone where the transit agency is located.
+     *
+     * Generated from protobuf field <code>string agency_timezone = 4;</code>
+     */
+    protected $agency_timezone = '';
+    /**
+     * The agency_lang field contains a two-letter ISO 639-1 code for the primary language used by this transit agency.
+     *
+     * Generated from protobuf field <code>string agency_lang = 5;</code>
+     */
+    protected $agency_lang = '';
+    /**
+     * The agency_phone field contains a single voice telephone number for the specified agency.
+     *
+     * Generated from protobuf field <code>string agency_phone = 6;</code>
+     */
+    protected $agency_phone = '';
+    /**
+     * The agency_fare_url specifies the URL of a web page that allows a rider to purchase tickets or other fare instruments for that agency online.
+     *
+     * Generated from protobuf field <code>string agency_fare_url = 7;</code>
+     */
+    protected $agency_fare_url = '';
+    /**
+     * 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 $agency_id
+     *           The agency_id field is an ID that uniquely identifies a transit agency.
+     *     @type string $agency_name
+     *           The agency_name field contains the full name of the transit agency.
+     *     @type string $agency_url
+     *           The agency_url field contains the URL of the transit agency.
+     *     @type string $agency_timezone
+     *           The agency_timezone field contains the timezone where the transit agency is located.
+     *     @type string $agency_lang
+     *           The agency_lang field contains a two-letter ISO 639-1 code for the primary language used by this transit agency.
+     *     @type string $agency_phone
+     *           The agency_phone field contains a single voice telephone number for the specified agency.
+     *     @type string $agency_fare_url
+     *           The agency_fare_url specifies the URL of a web page that allows a rider to purchase tickets or other fare instruments for that agency online.
+     *     @type \Google\Protobuf\Any $extension
+     *           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 agency_id field is an ID that uniquely identifies a transit agency.
+     *
+     * Generated from protobuf field <code>string agency_id = 1;</code>
+     * @return string
+     */
+    public function getAgencyId()
+    {
+        return $this->agency_id;
+    }
+
+    /**
+     * The agency_id field is an ID that uniquely identifies a transit agency.
+     *
+     * Generated from protobuf field <code>string agency_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_name field contains the full name of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_name = 2;</code>
+     * @return string
+     */
+    public function getAgencyName()
+    {
+        return $this->agency_name;
+    }
+
+    /**
+     * The agency_name field contains the full name of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_name = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_url field contains the URL of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_url = 3;</code>
+     * @return string
+     */
+    public function getAgencyUrl()
+    {
+        return $this->agency_url;
+    }
+
+    /**
+     * The agency_url field contains the URL of the transit agency.
+     *
+     * Generated from protobuf field <code>string agency_url = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_url = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_timezone field contains the timezone where the transit agency is located.
+     *
+     * Generated from protobuf field <code>string agency_timezone = 4;</code>
+     * @return string
+     */
+    public function getAgencyTimezone()
+    {
+        return $this->agency_timezone;
+    }
+
+    /**
+     * The agency_timezone field contains the timezone where the transit agency is located.
+     *
+     * Generated from protobuf field <code>string agency_timezone = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyTimezone($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_timezone = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_lang field contains a two-letter ISO 639-1 code for the primary language used by this transit agency.
+     *
+     * Generated from protobuf field <code>string agency_lang = 5;</code>
+     * @return string
+     */
+    public function getAgencyLang()
+    {
+        return $this->agency_lang;
+    }
+
+    /**
+     * The agency_lang field contains a two-letter ISO 639-1 code for the primary language used by this transit agency.
+     *
+     * Generated from protobuf field <code>string agency_lang = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyLang($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_lang = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_phone field contains a single voice telephone number for the specified agency.
+     *
+     * Generated from protobuf field <code>string agency_phone = 6;</code>
+     * @return string
+     */
+    public function getAgencyPhone()
+    {
+        return $this->agency_phone;
+    }
+
+    /**
+     * The agency_phone field contains a single voice telephone number for the specified agency.
+     *
+     * Generated from protobuf field <code>string agency_phone = 6;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyPhone($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_phone = $var;
+
+        return $this;
+    }
+
+    /**
+     * The agency_fare_url specifies the URL of a web page that allows a rider to purchase tickets or other fare instruments for that agency online.
+     *
+     * Generated from protobuf field <code>string agency_fare_url = 7;</code>
+     * @return string
+     */
+    public function getAgencyFareUrl()
+    {
+        return $this->agency_fare_url;
+    }
+
+    /**
+     * The agency_fare_url specifies the URL of a web page that allows a rider to purchase tickets or other fare instruments for that agency online.
+     *
+     * Generated from protobuf field <code>string agency_fare_url = 7;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyFareUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_fare_url = $var;
+
+        return $this;
+    }
+
+    /**
+     * 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;
+    }
+
+    /**
+     * 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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Calendar.php b/inc/Gtfs/Calendar.php
new file mode 100644
index 0000000..2536d81
--- /dev/null
+++ b/inc/Gtfs/Calendar.php
@@ -0,0 +1,350 @@
+<?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.Calendar</code>
+ */
+class Calendar extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     */
+    protected $service_id = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
+     */
+    protected $monday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
+     */
+    protected $tuesday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
+     */
+    protected $wednesday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
+     */
+    protected $thursday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
+     */
+    protected $friday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
+     */
+    protected $saturday = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
+     */
+    protected $sunday = 0;
+    /**
+     * Generated from protobuf field <code>string start_date = 9;</code>
+     */
+    protected $start_date = '';
+    /**
+     * Generated from protobuf field <code>string end_date = 10;</code>
+     */
+    protected $end_date = '';
+    /**
+     * 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 $service_id
+     *           The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *     @type int $monday
+     *     @type int $tuesday
+     *     @type int $wednesday
+     *     @type int $thursday
+     *     @type int $friday
+     *     @type int $saturday
+     *     @type int $sunday
+     *     @type string $start_date
+     *     @type string $end_date
+     *     @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 trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     * @return string
+     */
+    public function getServiceId()
+    {
+        return $this->service_id;
+    }
+
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setServiceId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->service_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
+     * @return int
+     */
+    public function getMonday()
+    {
+        return $this->monday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setMonday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->monday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
+     * @return int
+     */
+    public function getTuesday()
+    {
+        return $this->tuesday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setTuesday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->tuesday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
+     * @return int
+     */
+    public function getWednesday()
+    {
+        return $this->wednesday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setWednesday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->wednesday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
+     * @return int
+     */
+    public function getThursday()
+    {
+        return $this->thursday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setThursday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->thursday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
+     * @return int
+     */
+    public function getFriday()
+    {
+        return $this->friday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setFriday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->friday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
+     * @return int
+     */
+    public function getSaturday()
+    {
+        return $this->saturday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setSaturday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->saturday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
+     * @return int
+     */
+    public function getSunday()
+    {
+        return $this->sunday;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setSunday($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
+        $this->sunday = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string start_date = 9;</code>
+     * @return string
+     */
+    public function getStartDate()
+    {
+        return $this->start_date;
+    }
+
+    /**
+     * Generated from protobuf field <code>string start_date = 9;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStartDate($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->start_date = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string end_date = 10;</code>
+     * @return string
+     */
+    public function getEndDate()
+    {
+        return $this->end_date;
+    }
+
+    /**
+     * Generated from protobuf field <code>string end_date = 10;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setEndDate($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->end_date = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Calendar/CalendarDay.php b/inc/Gtfs/Calendar/CalendarDay.php
new file mode 100644
index 0000000..12b6667
--- /dev/null
+++ b/inc/Gtfs/Calendar/CalendarDay.php
@@ -0,0 +1,51 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Calendar;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.Calendar.CalendarDay</code>
+ */
+class CalendarDay
+{
+    /**
+     * Generated from protobuf enum <code>NOT_AVAILABLE = 0;</code>
+     */
+    const NOT_AVAILABLE = 0;
+    /**
+     * Generated from protobuf enum <code>AVAILABLE = 1;</code>
+     */
+    const AVAILABLE = 1;
+
+    private static $valueToName = [
+        self::NOT_AVAILABLE => 'NOT_AVAILABLE',
+        self::AVAILABLE => 'AVAILABLE',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(CalendarDay::class, \Gtfs\Calendar_CalendarDay::class);
+
diff --git a/inc/Gtfs/CalendarDate.php b/inc/Gtfs/CalendarDate.php
new file mode 100644
index 0000000..a3f9240
--- /dev/null
+++ b/inc/Gtfs/CalendarDate.php
@@ -0,0 +1,161 @@
+<?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.CalendarDate</code>
+ */
+class CalendarDate extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     */
+    protected $service_id = '';
+    /**
+     * Generated from protobuf field <code>string date = 2;</code>
+     */
+    protected $date = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.CalendarDate.ExceptionType exception_type = 3;</code>
+     */
+    protected $exception_type = 0;
+    /**
+     * 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 $service_id
+     *           The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *     @type string $date
+     *     @type int $exception_type
+     *     @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 trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     * @return string
+     */
+    public function getServiceId()
+    {
+        return $this->service_id;
+    }
+
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string service_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setServiceId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->service_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string date = 2;</code>
+     * @return string
+     */
+    public function getDate()
+    {
+        return $this->date;
+    }
+
+    /**
+     * Generated from protobuf field <code>string date = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setDate($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->date = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.CalendarDate.ExceptionType exception_type = 3;</code>
+     * @return int
+     */
+    public function getExceptionType()
+    {
+        return $this->exception_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.CalendarDate.ExceptionType exception_type = 3;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setExceptionType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\CalendarDate_ExceptionType::class);
+        $this->exception_type = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/CalendarDate/ExceptionType.php b/inc/Gtfs/CalendarDate/ExceptionType.php
new file mode 100644
index 0000000..11a0024
--- /dev/null
+++ b/inc/Gtfs/CalendarDate/ExceptionType.php
@@ -0,0 +1,56 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\CalendarDate;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.CalendarDate.ExceptionType</code>
+ */
+class ExceptionType
+{
+    /**
+     * Generated from protobuf enum <code>UNUSED_UNKNOWN = 0;</code>
+     */
+    const UNUSED_UNKNOWN = 0;
+    /**
+     * Generated from protobuf enum <code>ADDED = 1;</code>
+     */
+    const ADDED = 1;
+    /**
+     * Generated from protobuf enum <code>REMOVED = 2;</code>
+     */
+    const REMOVED = 2;
+
+    private static $valueToName = [
+        self::UNUSED_UNKNOWN => 'UNUSED_UNKNOWN',
+        self::ADDED => 'ADDED',
+        self::REMOVED => 'REMOVED',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(ExceptionType::class, \Gtfs\CalendarDate_ExceptionType::class);
+
diff --git a/inc/Gtfs/CalendarDate_ExceptionType.php b/inc/Gtfs/CalendarDate_ExceptionType.php
new file mode 100644
index 0000000..46dcd0c
--- /dev/null
+++ b/inc/Gtfs/CalendarDate_ExceptionType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\CalendarDate\ExceptionType instead.
+     * @deprecated
+     */
+    class CalendarDate_ExceptionType {}
+}
+class_exists(CalendarDate\ExceptionType::class);
+@trigger_error('Gtfs\CalendarDate_ExceptionType is deprecated and will be removed in the next major release. Use Gtfs\CalendarDate\ExceptionType instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Calendar_CalendarDay.php b/inc/Gtfs/Calendar_CalendarDay.php
new file mode 100644
index 0000000..00964cc
--- /dev/null
+++ b/inc/Gtfs/Calendar_CalendarDay.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Calendar\CalendarDay instead.
+     * @deprecated
+     */
+    class Calendar_CalendarDay {}
+}
+class_exists(Calendar\CalendarDay::class);
+@trigger_error('Gtfs\Calendar_CalendarDay is deprecated and will be removed in the next major release. Use Gtfs\Calendar\CalendarDay instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/FareAttribute.php b/inc/Gtfs/FareAttribute.php
new file mode 100644
index 0000000..81e62ec
--- /dev/null
+++ b/inc/Gtfs/FareAttribute.php
@@ -0,0 +1,235 @@
+<?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.FareAttribute</code>
+ */
+class FareAttribute extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     */
+    protected $fare_id = '';
+    /**
+     * Generated from protobuf field <code>float price = 2;</code>
+     */
+    protected $price = 0.0;
+    /**
+     * Generated from protobuf field <code>string currency_type = 3;</code>
+     */
+    protected $currency_type = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.PaymentMethod payment_method = 4;</code>
+     */
+    protected $payment_method = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.Transfers transfers = 5;</code>
+     */
+    protected $transfers = 0;
+    /**
+     * Generated from protobuf field <code>int32 transfer_duration = 6;</code>
+     */
+    protected $transfer_duration = 0;
+    /**
+     * 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 $fare_id
+     *     @type float $price
+     *     @type string $currency_type
+     *     @type int $payment_method
+     *     @type int $transfers
+     *     @type int $transfer_duration
+     *     @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);
+    }
+
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     * @return string
+     */
+    public function getFareId()
+    {
+        return $this->fare_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFareId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->fare_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>float price = 2;</code>
+     * @return float
+     */
+    public function getPrice()
+    {
+        return $this->price;
+    }
+
+    /**
+     * Generated from protobuf field <code>float price = 2;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setPrice($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->price = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string currency_type = 3;</code>
+     * @return string
+     */
+    public function getCurrencyType()
+    {
+        return $this->currency_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>string currency_type = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setCurrencyType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->currency_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.PaymentMethod payment_method = 4;</code>
+     * @return int
+     */
+    public function getPaymentMethod()
+    {
+        return $this->payment_method;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.PaymentMethod payment_method = 4;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setPaymentMethod($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\FareAttribute_PaymentMethod::class);
+        $this->payment_method = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.Transfers transfers = 5;</code>
+     * @return int
+     */
+    public function getTransfers()
+    {
+        return $this->transfers;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute.Transfers transfers = 5;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setTransfers($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\FareAttribute_Transfers::class);
+        $this->transfers = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 transfer_duration = 6;</code>
+     * @return int
+     */
+    public function getTransferDuration()
+    {
+        return $this->transfer_duration;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 transfer_duration = 6;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setTransferDuration($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->transfer_duration = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/FareAttribute/PaymentMethod.php b/inc/Gtfs/FareAttribute/PaymentMethod.php
new file mode 100644
index 0000000..12d828f
--- /dev/null
+++ b/inc/Gtfs/FareAttribute/PaymentMethod.php
@@ -0,0 +1,51 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\FareAttribute;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.FareAttribute.PaymentMethod</code>
+ */
+class PaymentMethod
+{
+    /**
+     * Generated from protobuf enum <code>ONBOARD = 0;</code>
+     */
+    const ONBOARD = 0;
+    /**
+     * Generated from protobuf enum <code>PREBOARDING = 1;</code>
+     */
+    const PREBOARDING = 1;
+
+    private static $valueToName = [
+        self::ONBOARD => 'ONBOARD',
+        self::PREBOARDING => 'PREBOARDING',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(PaymentMethod::class, \Gtfs\FareAttribute_PaymentMethod::class);
+
diff --git a/inc/Gtfs/FareAttribute/Transfers.php b/inc/Gtfs/FareAttribute/Transfers.php
new file mode 100644
index 0000000..66d3f0e
--- /dev/null
+++ b/inc/Gtfs/FareAttribute/Transfers.php
@@ -0,0 +1,61 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\FareAttribute;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.FareAttribute.Transfers</code>
+ */
+class Transfers
+{
+    /**
+     * Generated from protobuf enum <code>NO = 0;</code>
+     */
+    const NO = 0;
+    /**
+     * Generated from protobuf enum <code>ONCE = 1;</code>
+     */
+    const ONCE = 1;
+    /**
+     * Generated from protobuf enum <code>TWICE = 2;</code>
+     */
+    const TWICE = 2;
+    /**
+     * Generated from protobuf enum <code>UNLIMITED = 3;</code>
+     */
+    const UNLIMITED = 3;
+
+    private static $valueToName = [
+        self::NO => 'NO',
+        self::ONCE => 'ONCE',
+        self::TWICE => 'TWICE',
+        self::UNLIMITED => 'UNLIMITED',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(Transfers::class, \Gtfs\FareAttribute_Transfers::class);
+
diff --git a/inc/Gtfs/FareAttribute_PaymentMethod.php b/inc/Gtfs/FareAttribute_PaymentMethod.php
new file mode 100644
index 0000000..216c76b
--- /dev/null
+++ b/inc/Gtfs/FareAttribute_PaymentMethod.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\FareAttribute\PaymentMethod instead.
+     * @deprecated
+     */
+    class FareAttribute_PaymentMethod {}
+}
+class_exists(FareAttribute\PaymentMethod::class);
+@trigger_error('Gtfs\FareAttribute_PaymentMethod is deprecated and will be removed in the next major release. Use Gtfs\FareAttribute\PaymentMethod instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/FareAttribute_Transfers.php b/inc/Gtfs/FareAttribute_Transfers.php
new file mode 100644
index 0000000..8dffd82
--- /dev/null
+++ b/inc/Gtfs/FareAttribute_Transfers.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\FareAttribute\Transfers instead.
+     * @deprecated
+     */
+    class FareAttribute_Transfers {}
+}
+class_exists(FareAttribute\Transfers::class);
+@trigger_error('Gtfs\FareAttribute_Transfers is deprecated and will be removed in the next major release. Use Gtfs\FareAttribute\Transfers instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/FareRule.php b/inc/Gtfs/FareRule.php
new file mode 100644
index 0000000..bc5f0ac
--- /dev/null
+++ b/inc/Gtfs/FareRule.php
@@ -0,0 +1,208 @@
+<?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.FareRule</code>
+ */
+class FareRule extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     */
+    protected $fare_id = '';
+    /**
+     * Generated from protobuf field <code>string route_id = 2;</code>
+     */
+    protected $route_id = '';
+    /**
+     * Generated from protobuf field <code>string origin_id = 3;</code>
+     */
+    protected $origin_id = '';
+    /**
+     * Generated from protobuf field <code>string destination_id = 4;</code>
+     */
+    protected $destination_id = '';
+    /**
+     * Generated from protobuf field <code>string contains_id = 5;</code>
+     */
+    protected $contains_id = '';
+    /**
+     * 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 $fare_id
+     *     @type string $route_id
+     *     @type string $origin_id
+     *     @type string $destination_id
+     *     @type string $contains_id
+     *     @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);
+    }
+
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     * @return string
+     */
+    public function getFareId()
+    {
+        return $this->fare_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string fare_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFareId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->fare_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string route_id = 2;</code>
+     * @return string
+     */
+    public function getRouteId()
+    {
+        return $this->route_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string route_id = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setRouteId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->route_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string origin_id = 3;</code>
+     * @return string
+     */
+    public function getOriginId()
+    {
+        return $this->origin_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string origin_id = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setOriginId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->origin_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string destination_id = 4;</code>
+     * @return string
+     */
+    public function getDestinationId()
+    {
+        return $this->destination_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string destination_id = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setDestinationId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->destination_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string contains_id = 5;</code>
+     * @return string
+     */
+    public function getContainsId()
+    {
+        return $this->contains_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string contains_id = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setContainsId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->contains_id = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/FeedEntity.php b/inc/Gtfs/FeedEntity.php
new file mode 100644
index 0000000..b77caca
--- /dev/null
+++ b/inc/Gtfs/FeedEntity.php
@@ -0,0 +1,445 @@
+<?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;
+
+/**
+ * A definition (or update) of an entity in the transit feed.
+ *
+ * Generated from protobuf message <code>gtfs.FeedEntity</code>
+ */
+class FeedEntity extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The ids are used only to provide incrementality support. The id should be
+     * unique within a FeedMessage. Consequent FeedMessages may contain
+     * FeedEntities with the same id. In case of a DIFFERENTIAL update the new
+     * FeedEntity with some id will replace the old FeedEntity with the same id
+     * (or delete it - see is_deleted below).
+     * The actual GTFS entities (e.g. stations, routes, trips) referenced by the
+     * feed must be specified by explicit selectors (see EntitySelector below for
+     * more info).
+     *
+     * Generated from protobuf field <code>string id = 1;</code>
+     */
+    protected $id = '';
+    /**
+     * Whether this entity is to be deleted. Relevant only for incremental
+     * fetches.
+     *
+     * Generated from protobuf field <code>bool is_deleted = 2;</code>
+     */
+    protected $is_deleted = false;
+    /**
+     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
+     */
+    protected $extension = null;
+    protected $element;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $id
+     *           The ids are used only to provide incrementality support. The id should be
+     *           unique within a FeedMessage. Consequent FeedMessages may contain
+     *           FeedEntities with the same id. In case of a DIFFERENTIAL update the new
+     *           FeedEntity with some id will replace the old FeedEntity with the same id
+     *           (or delete it - see is_deleted below).
+     *           The actual GTFS entities (e.g. stations, routes, trips) referenced by the
+     *           feed must be specified by explicit selectors (see EntitySelector below for
+     *           more info).
+     *     @type bool $is_deleted
+     *           Whether this entity is to be deleted. Relevant only for incremental
+     *           fetches.
+     *     @type \Gtfs\Agency $agency
+     *     @type \Gtfs\Stop $stop
+     *     @type \Gtfs\Route $route
+     *     @type \Gtfs\Trip $trip
+     *     @type \Gtfs\StopTime $stop_time
+     *     @type \Gtfs\Calendar $calendar
+     *     @type \Gtfs\CalendarDate $calendar_date
+     *     @type \Gtfs\FareAttribute $fare_attribute
+     *     @type \Gtfs\FareRule $fare_rule
+     *     @type \Gtfs\Shape $shape
+     *     @type \Gtfs\Frequency $frequency
+     *     @type \Gtfs\Transfer $transfer
+     *     @type \Google\Protobuf\Any $extension
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Proto\Gtfs::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * The ids are used only to provide incrementality support. The id should be
+     * unique within a FeedMessage. Consequent FeedMessages may contain
+     * FeedEntities with the same id. In case of a DIFFERENTIAL update the new
+     * FeedEntity with some id will replace the old FeedEntity with the same id
+     * (or delete it - see is_deleted below).
+     * The actual GTFS entities (e.g. stations, routes, trips) referenced by the
+     * feed must be specified by explicit selectors (see EntitySelector below for
+     * more info).
+     *
+     * Generated from protobuf field <code>string id = 1;</code>
+     * @return string
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * The ids are used only to provide incrementality support. The id should be
+     * unique within a FeedMessage. Consequent FeedMessages may contain
+     * FeedEntities with the same id. In case of a DIFFERENTIAL update the new
+     * FeedEntity with some id will replace the old FeedEntity with the same id
+     * (or delete it - see is_deleted below).
+     * The actual GTFS entities (e.g. stations, routes, trips) referenced by the
+     * feed must be specified by explicit selectors (see EntitySelector below for
+     * more info).
+     *
+     * Generated from protobuf field <code>string id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Whether this entity is to be deleted. Relevant only for incremental
+     * fetches.
+     *
+     * Generated from protobuf field <code>bool is_deleted = 2;</code>
+     * @return bool
+     */
+    public function getIsDeleted()
+    {
+        return $this->is_deleted;
+    }
+
+    /**
+     * Whether this entity is to be deleted. Relevant only for incremental
+     * fetches.
+     *
+     * Generated from protobuf field <code>bool is_deleted = 2;</code>
+     * @param bool $var
+     * @return $this
+     */
+    public function setIsDeleted($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->is_deleted = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Agency agency = 3;</code>
+     * @return \Gtfs\Agency
+     */
+    public function getAgency()
+    {
+        return $this->readOneof(3);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Agency agency = 3;</code>
+     * @param \Gtfs\Agency $var
+     * @return $this
+     */
+    public function setAgency($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Agency::class);
+        $this->writeOneof(3, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Stop stop = 4;</code>
+     * @return \Gtfs\Stop
+     */
+    public function getStop()
+    {
+        return $this->readOneof(4);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Stop stop = 4;</code>
+     * @param \Gtfs\Stop $var
+     * @return $this
+     */
+    public function setStop($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Stop::class);
+        $this->writeOneof(4, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Route route = 5;</code>
+     * @return \Gtfs\Route
+     */
+    public function getRoute()
+    {
+        return $this->readOneof(5);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Route route = 5;</code>
+     * @param \Gtfs\Route $var
+     * @return $this
+     */
+    public function setRoute($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Route::class);
+        $this->writeOneof(5, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Trip trip = 6;</code>
+     * @return \Gtfs\Trip
+     */
+    public function getTrip()
+    {
+        return $this->readOneof(6);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Trip trip = 6;</code>
+     * @param \Gtfs\Trip $var
+     * @return $this
+     */
+    public function setTrip($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Trip::class);
+        $this->writeOneof(6, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime stop_time = 7;</code>
+     * @return \Gtfs\StopTime
+     */
+    public function getStopTime()
+    {
+        return $this->readOneof(7);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime stop_time = 7;</code>
+     * @param \Gtfs\StopTime $var
+     * @return $this
+     */
+    public function setStopTime($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\StopTime::class);
+        $this->writeOneof(7, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar calendar = 8;</code>
+     * @return \Gtfs\Calendar
+     */
+    public function getCalendar()
+    {
+        return $this->readOneof(8);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Calendar calendar = 8;</code>
+     * @param \Gtfs\Calendar $var
+     * @return $this
+     */
+    public function setCalendar($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Calendar::class);
+        $this->writeOneof(8, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.CalendarDate calendar_date = 9;</code>
+     * @return \Gtfs\CalendarDate
+     */
+    public function getCalendarDate()
+    {
+        return $this->readOneof(9);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.CalendarDate calendar_date = 9;</code>
+     * @param \Gtfs\CalendarDate $var
+     * @return $this
+     */
+    public function setCalendarDate($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\CalendarDate::class);
+        $this->writeOneof(9, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute fare_attribute = 10;</code>
+     * @return \Gtfs\FareAttribute
+     */
+    public function getFareAttribute()
+    {
+        return $this->readOneof(10);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareAttribute fare_attribute = 10;</code>
+     * @param \Gtfs\FareAttribute $var
+     * @return $this
+     */
+    public function setFareAttribute($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\FareAttribute::class);
+        $this->writeOneof(10, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareRule fare_rule = 11;</code>
+     * @return \Gtfs\FareRule
+     */
+    public function getFareRule()
+    {
+        return $this->readOneof(11);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.FareRule fare_rule = 11;</code>
+     * @param \Gtfs\FareRule $var
+     * @return $this
+     */
+    public function setFareRule($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\FareRule::class);
+        $this->writeOneof(11, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Shape shape = 12;</code>
+     * @return \Gtfs\Shape
+     */
+    public function getShape()
+    {
+        return $this->readOneof(12);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Shape shape = 12;</code>
+     * @param \Gtfs\Shape $var
+     * @return $this
+     */
+    public function setShape($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Shape::class);
+        $this->writeOneof(12, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Frequency frequency = 13;</code>
+     * @return \Gtfs\Frequency
+     */
+    public function getFrequency()
+    {
+        return $this->readOneof(13);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Frequency frequency = 13;</code>
+     * @param \Gtfs\Frequency $var
+     * @return $this
+     */
+    public function setFrequency($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Frequency::class);
+        $this->writeOneof(13, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Transfer transfer = 14;</code>
+     * @return \Gtfs\Transfer
+     */
+    public function getTransfer()
+    {
+        return $this->readOneof(14);
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Transfer transfer = 14;</code>
+     * @param \Gtfs\Transfer $var
+     * @return $this
+     */
+    public function setTransfer($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\Transfer::class);
+        $this->writeOneof(14, $var);
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
+     * @return \Google\Protobuf\Any
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * 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;
+    }
+
+    /**
+     * @return string
+     */
+    public function getElement()
+    {
+        return $this->whichOneof("element");
+    }
+
+}
+
diff --git a/inc/Gtfs/FeedHeader.php b/inc/Gtfs/FeedHeader.php
new file mode 100644
index 0000000..88ae19e
--- /dev/null
+++ b/inc/Gtfs/FeedHeader.php
@@ -0,0 +1,314 @@
+<?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;
+
+/**
+ * Metadata about a feed, included in feed messages.
+ *
+ * Generated from protobuf message <code>gtfs.FeedHeader</code>
+ */
+class FeedHeader extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Version of the feed specification.
+     * The current version is 1.0.
+     *
+     * Generated from protobuf field <code>string gtfs_version = 1;</code>
+     */
+    protected $gtfs_version = '';
+    /**
+     * The feed_publisher_name field contains the full name of the organization that publishes the feed.
+     *
+     * Generated from protobuf field <code>string feed_publisher_name = 2;</code>
+     */
+    protected $feed_publisher_name = '';
+    /**
+     * The feed_publisher_url field contains the URL of the feed publishing organization's website.
+     *
+     * Generated from protobuf field <code>string feed_publisher_url = 3;</code>
+     */
+    protected $feed_publisher_url = '';
+    /**
+     * The feed_lang field contains a IETF BCP 47 language code specifying the default language used for the text in this feed.
+     *
+     * Generated from protobuf field <code>string feed_lang = 4;</code>
+     */
+    protected $feed_lang = '';
+    /**
+     * The feed provides complete and reliable schedule information for service in the period from the beginning of the
+     * feed_start_date day to the end of the feed_end_date day in YYYYMMDD
+     *
+     * Generated from protobuf field <code>string feed_start_date = 5;</code>
+     */
+    protected $feed_start_date = '';
+    /**
+     * Generated from protobuf field <code>string feed_end_date = 6;</code>
+     */
+    protected $feed_end_date = '';
+    /**
+     * The feed publisher can specify a string here that indicates the current version of their GTFS feed.
+     *
+     * Generated from protobuf field <code>string feed_version = 7;</code>
+     */
+    protected $feed_version = '';
+    /**
+     * 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 $gtfs_version
+     *           Version of the feed specification.
+     *           The current version is 1.0.
+     *     @type string $feed_publisher_name
+     *           The feed_publisher_name field contains the full name of the organization that publishes the feed.
+     *     @type string $feed_publisher_url
+     *           The feed_publisher_url field contains the URL of the feed publishing organization's website.
+     *     @type string $feed_lang
+     *           The feed_lang field contains a IETF BCP 47 language code specifying the default language used for the text in this feed.
+     *     @type string $feed_start_date
+     *           The feed provides complete and reliable schedule information for service in the period from the beginning of the
+     *           feed_start_date day to the end of the feed_end_date day in YYYYMMDD
+     *     @type string $feed_end_date
+     *     @type string $feed_version
+     *           The feed publisher can specify a string here that indicates the current version of their GTFS feed.
+     *     @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);
+    }
+
+    /**
+     * Version of the feed specification.
+     * The current version is 1.0.
+     *
+     * Generated from protobuf field <code>string gtfs_version = 1;</code>
+     * @return string
+     */
+    public function getGtfsVersion()
+    {
+        return $this->gtfs_version;
+    }
+
+    /**
+     * Version of the feed specification.
+     * The current version is 1.0.
+     *
+     * Generated from protobuf field <code>string gtfs_version = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setGtfsVersion($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->gtfs_version = $var;
+
+        return $this;
+    }
+
+    /**
+     * The feed_publisher_name field contains the full name of the organization that publishes the feed.
+     *
+     * Generated from protobuf field <code>string feed_publisher_name = 2;</code>
+     * @return string
+     */
+    public function getFeedPublisherName()
+    {
+        return $this->feed_publisher_name;
+    }
+
+    /**
+     * The feed_publisher_name field contains the full name of the organization that publishes the feed.
+     *
+     * Generated from protobuf field <code>string feed_publisher_name = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedPublisherName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_publisher_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * The feed_publisher_url field contains the URL of the feed publishing organization's website.
+     *
+     * Generated from protobuf field <code>string feed_publisher_url = 3;</code>
+     * @return string
+     */
+    public function getFeedPublisherUrl()
+    {
+        return $this->feed_publisher_url;
+    }
+
+    /**
+     * The feed_publisher_url field contains the URL of the feed publishing organization's website.
+     *
+     * Generated from protobuf field <code>string feed_publisher_url = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedPublisherUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_publisher_url = $var;
+
+        return $this;
+    }
+
+    /**
+     * The feed_lang field contains a IETF BCP 47 language code specifying the default language used for the text in this feed.
+     *
+     * Generated from protobuf field <code>string feed_lang = 4;</code>
+     * @return string
+     */
+    public function getFeedLang()
+    {
+        return $this->feed_lang;
+    }
+
+    /**
+     * The feed_lang field contains a IETF BCP 47 language code specifying the default language used for the text in this feed.
+     *
+     * Generated from protobuf field <code>string feed_lang = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedLang($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_lang = $var;
+
+        return $this;
+    }
+
+    /**
+     * The feed provides complete and reliable schedule information for service in the period from the beginning of the
+     * feed_start_date day to the end of the feed_end_date day in YYYYMMDD
+     *
+     * Generated from protobuf field <code>string feed_start_date = 5;</code>
+     * @return string
+     */
+    public function getFeedStartDate()
+    {
+        return $this->feed_start_date;
+    }
+
+    /**
+     * The feed provides complete and reliable schedule information for service in the period from the beginning of the
+     * feed_start_date day to the end of the feed_end_date day in YYYYMMDD
+     *
+     * Generated from protobuf field <code>string feed_start_date = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedStartDate($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_start_date = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string feed_end_date = 6;</code>
+     * @return string
+     */
+    public function getFeedEndDate()
+    {
+        return $this->feed_end_date;
+    }
+
+    /**
+     * Generated from protobuf field <code>string feed_end_date = 6;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedEndDate($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_end_date = $var;
+
+        return $this;
+    }
+
+    /**
+     * The feed publisher can specify a string here that indicates the current version of their GTFS feed.
+     *
+     * Generated from protobuf field <code>string feed_version = 7;</code>
+     * @return string
+     */
+    public function getFeedVersion()
+    {
+        return $this->feed_version;
+    }
+
+    /**
+     * The feed publisher can specify a string here that indicates the current version of their GTFS feed.
+     *
+     * Generated from protobuf field <code>string feed_version = 7;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFeedVersion($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->feed_version = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/FeedMessage.php b/inc/Gtfs/FeedMessage.php
new file mode 100644
index 0000000..26ace5f
--- /dev/null
+++ b/inc/Gtfs/FeedMessage.php
@@ -0,0 +1,99 @@
+<?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.FeedMessage</code>
+ */
+class FeedMessage extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Metadata about this feed and feed message.
+     *
+     * Generated from protobuf field <code>.gtfs.FeedHeader header = 1;</code>
+     */
+    protected $header = null;
+    /**
+     * Contents of the feed.
+     *
+     * Generated from protobuf field <code>repeated .gtfs.FeedEntity entity = 2;</code>
+     */
+    private $entity;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type \Gtfs\FeedHeader $header
+     *           Metadata about this feed and feed message.
+     *     @type \Gtfs\FeedEntity[]|\Google\Protobuf\Internal\RepeatedField $entity
+     *           Contents of the feed.
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Proto\Gtfs::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Metadata about this feed and feed message.
+     *
+     * Generated from protobuf field <code>.gtfs.FeedHeader header = 1;</code>
+     * @return \Gtfs\FeedHeader
+     */
+    public function getHeader()
+    {
+        return $this->header;
+    }
+
+    /**
+     * Metadata about this feed and feed message.
+     *
+     * Generated from protobuf field <code>.gtfs.FeedHeader header = 1;</code>
+     * @param \Gtfs\FeedHeader $var
+     * @return $this
+     */
+    public function setHeader($var)
+    {
+        GPBUtil::checkMessage($var, \Gtfs\FeedHeader::class);
+        $this->header = $var;
+
+        return $this;
+    }
+
+    /**
+     * Contents of the feed.
+     *
+     * Generated from protobuf field <code>repeated .gtfs.FeedEntity entity = 2;</code>
+     * @return \Google\Protobuf\Internal\RepeatedField
+     */
+    public function getEntity()
+    {
+        return $this->entity;
+    }
+
+    /**
+     * Contents of the feed.
+     *
+     * Generated from protobuf field <code>repeated .gtfs.FeedEntity entity = 2;</code>
+     * @param \Gtfs\FeedEntity[]|\Google\Protobuf\Internal\RepeatedField $var
+     * @return $this
+     */
+    public function setEntity($var)
+    {
+        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Gtfs\FeedEntity::class);
+        $this->entity = $arr;
+
+        return $this;
+    }
+
+}
+
diff --git a/inc/Gtfs/Frequency.php b/inc/Gtfs/Frequency.php
new file mode 100644
index 0000000..6d53d50
--- /dev/null
+++ b/inc/Gtfs/Frequency.php
@@ -0,0 +1,208 @@
+<?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.Frequency</code>
+ */
+class Frequency extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     */
+    protected $trip_id = '';
+    /**
+     * Generated from protobuf field <code>string start_time = 2;</code>
+     */
+    protected $start_time = '';
+    /**
+     * Generated from protobuf field <code>string end_time = 3;</code>
+     */
+    protected $end_time = '';
+    /**
+     * Generated from protobuf field <code>int32 headway_secs = 4;</code>
+     */
+    protected $headway_secs = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.Frequency.ScheduleType exact_times = 5;</code>
+     */
+    protected $exact_times = 0;
+    /**
+     * 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 $trip_id
+     *     @type string $start_time
+     *     @type string $end_time
+     *     @type int $headway_secs
+     *     @type int $exact_times
+     *     @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);
+    }
+
+    /**
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     * @return string
+     */
+    public function getTripId()
+    {
+        return $this->trip_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTripId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trip_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string start_time = 2;</code>
+     * @return string
+     */
+    public function getStartTime()
+    {
+        return $this->start_time;
+    }
+
+    /**
+     * Generated from protobuf field <code>string start_time = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStartTime($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->start_time = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string end_time = 3;</code>
+     * @return string
+     */
+    public function getEndTime()
+    {
+        return $this->end_time;
+    }
+
+    /**
+     * Generated from protobuf field <code>string end_time = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setEndTime($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->end_time = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 headway_secs = 4;</code>
+     * @return int
+     */
+    public function getHeadwaySecs()
+    {
+        return $this->headway_secs;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 headway_secs = 4;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setHeadwaySecs($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->headway_secs = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Frequency.ScheduleType exact_times = 5;</code>
+     * @return int
+     */
+    public function getExactTimes()
+    {
+        return $this->exact_times;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Frequency.ScheduleType exact_times = 5;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setExactTimes($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Frequency_ScheduleType::class);
+        $this->exact_times = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Frequency/ScheduleType.php b/inc/Gtfs/Frequency/ScheduleType.php
new file mode 100644
index 0000000..2fa70da
--- /dev/null
+++ b/inc/Gtfs/Frequency/ScheduleType.php
@@ -0,0 +1,51 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Frequency;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.Frequency.ScheduleType</code>
+ */
+class ScheduleType
+{
+    /**
+     * Generated from protobuf enum <code>NOT_EXACTLY = 0;</code>
+     */
+    const NOT_EXACTLY = 0;
+    /**
+     * Generated from protobuf enum <code>EXACTLY = 1;</code>
+     */
+    const EXACTLY = 1;
+
+    private static $valueToName = [
+        self::NOT_EXACTLY => 'NOT_EXACTLY',
+        self::EXACTLY => 'EXACTLY',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(ScheduleType::class, \Gtfs\Frequency_ScheduleType::class);
+
diff --git a/inc/Gtfs/Frequency_ScheduleType.php b/inc/Gtfs/Frequency_ScheduleType.php
new file mode 100644
index 0000000..679bb8c
--- /dev/null
+++ b/inc/Gtfs/Frequency_ScheduleType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Frequency\ScheduleType instead.
+     * @deprecated
+     */
+    class Frequency_ScheduleType {}
+}
+class_exists(Frequency\ScheduleType::class);
+@trigger_error('Gtfs\Frequency_ScheduleType is deprecated and will be removed in the next major release. Use Gtfs\Frequency\ScheduleType instead', E_USER_DEPRECATED);
+
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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Route/RouteType.php b/inc/Gtfs/Route/RouteType.php
new file mode 100644
index 0000000..9e9f6cc
--- /dev/null
+++ b/inc/Gtfs/Route/RouteType.php
@@ -0,0 +1,99 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Route;
+
+use UnexpectedValueException;
+
+/**
+ * The route_type field describes the type of transportation used on a route.
+ *
+ * Protobuf type <code>gtfs.Route.RouteType</code>
+ */
+class RouteType
+{
+    /**
+     * Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area.
+     *
+     * Generated from protobuf enum <code>TRAM = 0;</code>
+     */
+    const TRAM = 0;
+    /**
+     * Subway, Metro. Any underground rail system within a metropolitan area.
+     *
+     * Generated from protobuf enum <code>SUBWAY = 1;</code>
+     */
+    const SUBWAY = 1;
+    /**
+     * Rail. Used for intercity or long-distance travel.
+     *
+     * Generated from protobuf enum <code>RAIL = 2;</code>
+     */
+    const RAIL = 2;
+    /**
+     * Bus. Used for short- and long-distance bus routes.
+     *
+     * Generated from protobuf enum <code>BUS = 3;</code>
+     */
+    const BUS = 3;
+    /**
+     * Ferry. Used for short- and long-distance boat service.
+     *
+     * Generated from protobuf enum <code>FERRY = 4;</code>
+     */
+    const FERRY = 4;
+    /**
+     * Cable car. Used for street-level cable cars where the cable runs beneath the car.
+     *
+     * Generated from protobuf enum <code>CABLECAR = 5;</code>
+     */
+    const CABLECAR = 5;
+    /**
+     * Gondola, Suspended cable car. Typically used for aerial cable cars where the car is suspended from the cable.
+     *
+     * Generated from protobuf enum <code>GONDOLA = 6;</code>
+     */
+    const GONDOLA = 6;
+    /**
+     * Funicular. Any rail system designed for steep inclines.
+     *
+     * Generated from protobuf enum <code>FUNICULAR = 7;</code>
+     */
+    const FUNICULAR = 7;
+
+    private static $valueToName = [
+        self::TRAM => 'TRAM',
+        self::SUBWAY => 'SUBWAY',
+        self::RAIL => 'RAIL',
+        self::BUS => 'BUS',
+        self::FERRY => 'FERRY',
+        self::CABLECAR => 'CABLECAR',
+        self::GONDOLA => 'GONDOLA',
+        self::FUNICULAR => 'FUNICULAR',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(RouteType::class, \Gtfs\Route_RouteType::class);
+
diff --git a/inc/Gtfs/Route_RouteType.php b/inc/Gtfs/Route_RouteType.php
new file mode 100644
index 0000000..3b8a42c
--- /dev/null
+++ b/inc/Gtfs/Route_RouteType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Route\RouteType instead.
+     * @deprecated
+     */
+    class Route_RouteType {}
+}
+class_exists(Route\RouteType::class);
+@trigger_error('Gtfs\Route_RouteType is deprecated and will be removed in the next major release. Use Gtfs\Route\RouteType instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Shape.php b/inc/Gtfs/Shape.php
new file mode 100644
index 0000000..5396c4f
--- /dev/null
+++ b/inc/Gtfs/Shape.php
@@ -0,0 +1,208 @@
+<?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.Shape</code>
+ */
+class Shape extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string shape_id = 1;</code>
+     */
+    protected $shape_id = '';
+    /**
+     * Generated from protobuf field <code>float shape_pt_lat = 2;</code>
+     */
+    protected $shape_pt_lat = 0.0;
+    /**
+     * Generated from protobuf field <code>float shape_pt_lon = 3;</code>
+     */
+    protected $shape_pt_lon = 0.0;
+    /**
+     * Generated from protobuf field <code>int32 shape_pt_sequence = 4;</code>
+     */
+    protected $shape_pt_sequence = 0;
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 5;</code>
+     */
+    protected $shape_dist_traveled = 0.0;
+    /**
+     * 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 $shape_id
+     *     @type float $shape_pt_lat
+     *     @type float $shape_pt_lon
+     *     @type int $shape_pt_sequence
+     *     @type float $shape_dist_traveled
+     *     @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);
+    }
+
+    /**
+     * Generated from protobuf field <code>string shape_id = 1;</code>
+     * @return string
+     */
+    public function getShapeId()
+    {
+        return $this->shape_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string shape_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setShapeId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->shape_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_pt_lat = 2;</code>
+     * @return float
+     */
+    public function getShapePtLat()
+    {
+        return $this->shape_pt_lat;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_pt_lat = 2;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setShapePtLat($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->shape_pt_lat = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_pt_lon = 3;</code>
+     * @return float
+     */
+    public function getShapePtLon()
+    {
+        return $this->shape_pt_lon;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_pt_lon = 3;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setShapePtLon($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->shape_pt_lon = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 shape_pt_sequence = 4;</code>
+     * @return int
+     */
+    public function getShapePtSequence()
+    {
+        return $this->shape_pt_sequence;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 shape_pt_sequence = 4;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setShapePtSequence($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->shape_pt_sequence = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 5;</code>
+     * @return float
+     */
+    public function getShapeDistTraveled()
+    {
+        return $this->shape_dist_traveled;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 5;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setShapeDistTraveled($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->shape_dist_traveled = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Stop.php b/inc/Gtfs/Stop.php
new file mode 100644
index 0000000..ae0170b
--- /dev/null
+++ b/inc/Gtfs/Stop.php
@@ -0,0 +1,454 @@
+<?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.Stop</code>
+ */
+class Stop extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The stop_id field contains an ID that uniquely identifies a stop or station.
+     * Multiple routes may use the same stop. stop_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string stop_id = 1;</code>
+     */
+    protected $stop_id = '';
+    /**
+     * The stop_code field contains short text or a number that uniquely identifies the stop for passengers.
+     *
+     * Generated from protobuf field <code>string stop_code = 2;</code>
+     */
+    protected $stop_code = '';
+    /**
+     * The stop_name field contains the name of a stop or station.
+     *
+     * Generated from protobuf field <code>string stop_name = 3;</code>
+     */
+    protected $stop_name = '';
+    /**
+     * The stop_desc field contains a description of a stop.
+     *
+     * Generated from protobuf field <code>string stop_desc = 4;</code>
+     */
+    protected $stop_desc = '';
+    /**
+     * Degrees North, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float latitude = 5;</code>
+     */
+    protected $latitude = 0.0;
+    /**
+     * Degrees East, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float longitude = 6;</code>
+     */
+    protected $longitude = 0.0;
+    /**
+     * Generated from protobuf field <code>string zone_id = 7;</code>
+     */
+    protected $zone_id = '';
+    /**
+     * Generated from protobuf field <code>string stop_url = 8;</code>
+     */
+    protected $stop_url = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.Stop.LocationType location_type = 9;</code>
+     */
+    protected $location_type = 0;
+    /**
+     * Generated from protobuf field <code>string parent_station = 10;</code>
+     */
+    protected $parent_station = '';
+    /**
+     * Generated from protobuf field <code>string agency_timezone = 11;</code>
+     */
+    protected $agency_timezone = '';
+    /**
+     * The exact status of the vehicle with respect to the current stop.
+     * Ignored if current_stop_sequence is missing.
+     *
+     * Generated from protobuf field <code>.gtfs.Stop.WheelchairBoarding wheelchair_boarding = 12;</code>
+     */
+    protected $wheelchair_boarding = 0;
+    /**
+     * 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 $stop_id
+     *           The stop_id field contains an ID that uniquely identifies a stop or station.
+     *           Multiple routes may use the same stop. stop_id is dataset unique.
+     *     @type string $stop_code
+     *           The stop_code field contains short text or a number that uniquely identifies the stop for passengers.
+     *     @type string $stop_name
+     *           The stop_name field contains the name of a stop or station.
+     *     @type string $stop_desc
+     *           The stop_desc field contains a description of a stop.
+     *     @type float $latitude
+     *           Degrees North, in the WGS-84 coordinate system.
+     *     @type float $longitude
+     *           Degrees East, in the WGS-84 coordinate system.
+     *     @type string $zone_id
+     *     @type string $stop_url
+     *     @type int $location_type
+     *     @type string $parent_station
+     *     @type string $agency_timezone
+     *     @type int $wheelchair_boarding
+     *           The exact status of the vehicle with respect to the current stop.
+     *           Ignored if current_stop_sequence is missing.
+     *     @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 stop_id field contains an ID that uniquely identifies a stop or station.
+     * Multiple routes may use the same stop. stop_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string stop_id = 1;</code>
+     * @return string
+     */
+    public function getStopId()
+    {
+        return $this->stop_id;
+    }
+
+    /**
+     * The stop_id field contains an ID that uniquely identifies a stop or station.
+     * Multiple routes may use the same stop. stop_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string stop_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The stop_code field contains short text or a number that uniquely identifies the stop for passengers.
+     *
+     * Generated from protobuf field <code>string stop_code = 2;</code>
+     * @return string
+     */
+    public function getStopCode()
+    {
+        return $this->stop_code;
+    }
+
+    /**
+     * The stop_code field contains short text or a number that uniquely identifies the stop for passengers.
+     *
+     * Generated from protobuf field <code>string stop_code = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopCode($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_code = $var;
+
+        return $this;
+    }
+
+    /**
+     * The stop_name field contains the name of a stop or station.
+     *
+     * Generated from protobuf field <code>string stop_name = 3;</code>
+     * @return string
+     */
+    public function getStopName()
+    {
+        return $this->stop_name;
+    }
+
+    /**
+     * The stop_name field contains the name of a stop or station.
+     *
+     * Generated from protobuf field <code>string stop_name = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * The stop_desc field contains a description of a stop.
+     *
+     * Generated from protobuf field <code>string stop_desc = 4;</code>
+     * @return string
+     */
+    public function getStopDesc()
+    {
+        return $this->stop_desc;
+    }
+
+    /**
+     * The stop_desc field contains a description of a stop.
+     *
+     * Generated from protobuf field <code>string stop_desc = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopDesc($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_desc = $var;
+
+        return $this;
+    }
+
+    /**
+     * Degrees North, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float latitude = 5;</code>
+     * @return float
+     */
+    public function getLatitude()
+    {
+        return $this->latitude;
+    }
+
+    /**
+     * Degrees North, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float latitude = 5;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setLatitude($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->latitude = $var;
+
+        return $this;
+    }
+
+    /**
+     * Degrees East, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float longitude = 6;</code>
+     * @return float
+     */
+    public function getLongitude()
+    {
+        return $this->longitude;
+    }
+
+    /**
+     * Degrees East, in the WGS-84 coordinate system.
+     *
+     * Generated from protobuf field <code>float longitude = 6;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setLongitude($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->longitude = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string zone_id = 7;</code>
+     * @return string
+     */
+    public function getZoneId()
+    {
+        return $this->zone_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string zone_id = 7;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setZoneId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->zone_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_url = 8;</code>
+     * @return string
+     */
+    public function getStopUrl()
+    {
+        return $this->stop_url;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_url = 8;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_url = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Stop.LocationType location_type = 9;</code>
+     * @return int
+     */
+    public function getLocationType()
+    {
+        return $this->location_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Stop.LocationType location_type = 9;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setLocationType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Stop_LocationType::class);
+        $this->location_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string parent_station = 10;</code>
+     * @return string
+     */
+    public function getParentStation()
+    {
+        return $this->parent_station;
+    }
+
+    /**
+     * Generated from protobuf field <code>string parent_station = 10;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setParentStation($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->parent_station = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string agency_timezone = 11;</code>
+     * @return string
+     */
+    public function getAgencyTimezone()
+    {
+        return $this->agency_timezone;
+    }
+
+    /**
+     * Generated from protobuf field <code>string agency_timezone = 11;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setAgencyTimezone($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->agency_timezone = $var;
+
+        return $this;
+    }
+
+    /**
+     * The exact status of the vehicle with respect to the current stop.
+     * Ignored if current_stop_sequence is missing.
+     *
+     * Generated from protobuf field <code>.gtfs.Stop.WheelchairBoarding wheelchair_boarding = 12;</code>
+     * @return int
+     */
+    public function getWheelchairBoarding()
+    {
+        return $this->wheelchair_boarding;
+    }
+
+    /**
+     * The exact status of the vehicle with respect to the current stop.
+     * Ignored if current_stop_sequence is missing.
+     *
+     * Generated from protobuf field <code>.gtfs.Stop.WheelchairBoarding wheelchair_boarding = 12;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setWheelchairBoarding($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Stop_WheelchairBoarding::class);
+        $this->wheelchair_boarding = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Stop/LocationType.php b/inc/Gtfs/Stop/LocationType.php
new file mode 100644
index 0000000..204d537
--- /dev/null
+++ b/inc/Gtfs/Stop/LocationType.php
@@ -0,0 +1,76 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Stop;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.Stop.LocationType</code>
+ */
+class LocationType
+{
+    /**
+     * Stop (or Platform). A location where passengers board or disembark from a transit vehicle. Is called a platform when defined within a parent_station.
+     *
+     * Generated from protobuf enum <code>STOP = 0;</code>
+     */
+    const STOP = 0;
+    /**
+     * Station. A physical structure or area that contains one or more platform.
+     *
+     * Generated from protobuf enum <code>STATION = 1;</code>
+     */
+    const STATION = 1;
+    /**
+     * Entrance/Exit. A location where passengers can enter or exit a station from the street. If an entrance/exit belongs to multiple stations, it can be linked by pathways to both, but the data provider must pick one of them as parent.
+     *
+     * Generated from protobuf enum <code>ENTRANCE = 2;</code>
+     */
+    const ENTRANCE = 2;
+    /**
+     * Generic Node. A location within a station, not matching any other location_type, which can be used to link together pathways define in pathways.txt.
+     *
+     * Generated from protobuf enum <code>GENERIC_NODE = 3;</code>
+     */
+    const GENERIC_NODE = 3;
+    /**
+     * Boarding Area. A specific location on a platform, where passengers can board and/or alight vehicles.
+     *
+     * Generated from protobuf enum <code>BOARDING_AREA = 4;</code>
+     */
+    const BOARDING_AREA = 4;
+
+    private static $valueToName = [
+        self::STOP => 'STOP',
+        self::STATION => 'STATION',
+        self::ENTRANCE => 'ENTRANCE',
+        self::GENERIC_NODE => 'GENERIC_NODE',
+        self::BOARDING_AREA => 'BOARDING_AREA',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(LocationType::class, \Gtfs\Stop_LocationType::class);
+
diff --git a/inc/Gtfs/Stop/WheelchairBoarding.php b/inc/Gtfs/Stop/WheelchairBoarding.php
new file mode 100644
index 0000000..460a6dc
--- /dev/null
+++ b/inc/Gtfs/Stop/WheelchairBoarding.php
@@ -0,0 +1,62 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Stop;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.Stop.WheelchairBoarding</code>
+ */
+class WheelchairBoarding
+{
+    /**
+     * no accessibility information for the stop
+     *
+     * Generated from protobuf enum <code>UNKNOWN = 0;</code>
+     */
+    const UNKNOWN = 0;
+    /**
+     * some vehicles at this stop can be boarded by a rider in a wheelchair
+     *
+     * Generated from protobuf enum <code>ACCESSIBLE = 1;</code>
+     */
+    const ACCESSIBLE = 1;
+    /**
+     * wheelchair boarding is not possible at this stop
+     *
+     * Generated from protobuf enum <code>NOT_ACCESSIBLE = 2;</code>
+     */
+    const NOT_ACCESSIBLE = 2;
+
+    private static $valueToName = [
+        self::UNKNOWN => 'UNKNOWN',
+        self::ACCESSIBLE => 'ACCESSIBLE',
+        self::NOT_ACCESSIBLE => 'NOT_ACCESSIBLE',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(WheelchairBoarding::class, \Gtfs\Stop_WheelchairBoarding::class);
+
diff --git a/inc/Gtfs/StopTime.php b/inc/Gtfs/StopTime.php
new file mode 100644
index 0000000..c1605c9
--- /dev/null
+++ b/inc/Gtfs/StopTime.php
@@ -0,0 +1,323 @@
+<?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.StopTime</code>
+ */
+class StopTime extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     */
+    protected $trip_id = '';
+    /**
+     * Generated from protobuf field <code>string arrival_time = 2;</code>
+     */
+    protected $arrival_time = '';
+    /**
+     * Generated from protobuf field <code>string departure_time = 3;</code>
+     */
+    protected $departure_time = '';
+    /**
+     * Generated from protobuf field <code>string stop_id = 4;</code>
+     */
+    protected $stop_id = '';
+    /**
+     * Generated from protobuf field <code>string stop_sequence = 5;</code>
+     */
+    protected $stop_sequence = '';
+    /**
+     * Generated from protobuf field <code>string stop_headsign = 6;</code>
+     */
+    protected $stop_headsign = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType pickup_type = 7;</code>
+     */
+    protected $pickup_type = 0;
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType drop_off_type = 8;</code>
+     */
+    protected $drop_off_type = 0;
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 9;</code>
+     */
+    protected $shape_dist_traveled = 0.0;
+    /**
+     * 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 $trip_id
+     *           The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *     @type string $arrival_time
+     *     @type string $departure_time
+     *     @type string $stop_id
+     *     @type string $stop_sequence
+     *     @type string $stop_headsign
+     *     @type int $pickup_type
+     *     @type int $drop_off_type
+     *     @type float $shape_dist_traveled
+     *     @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 trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     * @return string
+     */
+    public function getTripId()
+    {
+        return $this->trip_id;
+    }
+
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTripId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trip_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string arrival_time = 2;</code>
+     * @return string
+     */
+    public function getArrivalTime()
+    {
+        return $this->arrival_time;
+    }
+
+    /**
+     * Generated from protobuf field <code>string arrival_time = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setArrivalTime($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->arrival_time = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string departure_time = 3;</code>
+     * @return string
+     */
+    public function getDepartureTime()
+    {
+        return $this->departure_time;
+    }
+
+    /**
+     * Generated from protobuf field <code>string departure_time = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setDepartureTime($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->departure_time = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_id = 4;</code>
+     * @return string
+     */
+    public function getStopId()
+    {
+        return $this->stop_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_id = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_sequence = 5;</code>
+     * @return string
+     */
+    public function getStopSequence()
+    {
+        return $this->stop_sequence;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_sequence = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopSequence($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_sequence = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_headsign = 6;</code>
+     * @return string
+     */
+    public function getStopHeadsign()
+    {
+        return $this->stop_headsign;
+    }
+
+    /**
+     * Generated from protobuf field <code>string stop_headsign = 6;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setStopHeadsign($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->stop_headsign = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType pickup_type = 7;</code>
+     * @return int
+     */
+    public function getPickupType()
+    {
+        return $this->pickup_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType pickup_type = 7;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setPickupType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\StopTime_AvailabilityType::class);
+        $this->pickup_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType drop_off_type = 8;</code>
+     * @return int
+     */
+    public function getDropOffType()
+    {
+        return $this->drop_off_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.StopTime.AvailabilityType drop_off_type = 8;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setDropOffType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\StopTime_AvailabilityType::class);
+        $this->drop_off_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 9;</code>
+     * @return float
+     */
+    public function getShapeDistTraveled()
+    {
+        return $this->shape_dist_traveled;
+    }
+
+    /**
+     * Generated from protobuf field <code>float shape_dist_traveled = 9;</code>
+     * @param float $var
+     * @return $this
+     */
+    public function setShapeDistTraveled($var)
+    {
+        GPBUtil::checkFloat($var);
+        $this->shape_dist_traveled = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/StopTime/AvailabilityType.php b/inc/Gtfs/StopTime/AvailabilityType.php
new file mode 100644
index 0000000..6f876cc
--- /dev/null
+++ b/inc/Gtfs/StopTime/AvailabilityType.php
@@ -0,0 +1,69 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\StopTime;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.StopTime.AvailabilityType</code>
+ */
+class AvailabilityType
+{
+    /**
+     * Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area.
+     *
+     * Generated from protobuf enum <code>REGULAR = 0;</code>
+     */
+    const REGULAR = 0;
+    /**
+     * Subway, Metro. Any underground rail system within a metropolitan area.
+     *
+     * Generated from protobuf enum <code>NOT_AVAILABLE = 1;</code>
+     */
+    const NOT_AVAILABLE = 1;
+    /**
+     * Rail. Used for intercity or long-distance travel.
+     *
+     * Generated from protobuf enum <code>PHONE = 2;</code>
+     */
+    const PHONE = 2;
+    /**
+     * Bus. Used for short- and long-distance bus routes.
+     *
+     * Generated from protobuf enum <code>DRIVER = 3;</code>
+     */
+    const DRIVER = 3;
+
+    private static $valueToName = [
+        self::REGULAR => 'REGULAR',
+        self::NOT_AVAILABLE => 'NOT_AVAILABLE',
+        self::PHONE => 'PHONE',
+        self::DRIVER => 'DRIVER',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(AvailabilityType::class, \Gtfs\StopTime_AvailabilityType::class);
+
diff --git a/inc/Gtfs/StopTime_AvailabilityType.php b/inc/Gtfs/StopTime_AvailabilityType.php
new file mode 100644
index 0000000..73c70ed
--- /dev/null
+++ b/inc/Gtfs/StopTime_AvailabilityType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\StopTime\AvailabilityType instead.
+     * @deprecated
+     */
+    class StopTime_AvailabilityType {}
+}
+class_exists(StopTime\AvailabilityType::class);
+@trigger_error('Gtfs\StopTime_AvailabilityType is deprecated and will be removed in the next major release. Use Gtfs\StopTime\AvailabilityType instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Stop_LocationType.php b/inc/Gtfs/Stop_LocationType.php
new file mode 100644
index 0000000..18cfb9e
--- /dev/null
+++ b/inc/Gtfs/Stop_LocationType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Stop\LocationType instead.
+     * @deprecated
+     */
+    class Stop_LocationType {}
+}
+class_exists(Stop\LocationType::class);
+@trigger_error('Gtfs\Stop_LocationType is deprecated and will be removed in the next major release. Use Gtfs\Stop\LocationType instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Stop_WheelchairBoarding.php b/inc/Gtfs/Stop_WheelchairBoarding.php
new file mode 100644
index 0000000..1fbb1a9
--- /dev/null
+++ b/inc/Gtfs/Stop_WheelchairBoarding.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Stop\WheelchairBoarding instead.
+     * @deprecated
+     */
+    class Stop_WheelchairBoarding {}
+}
+class_exists(Stop\WheelchairBoarding::class);
+@trigger_error('Gtfs\Stop_WheelchairBoarding is deprecated and will be removed in the next major release. Use Gtfs\Stop\WheelchairBoarding instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Transfer.php b/inc/Gtfs/Transfer.php
new file mode 100644
index 0000000..c3ee43b
--- /dev/null
+++ b/inc/Gtfs/Transfer.php
@@ -0,0 +1,181 @@
+<?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.Transfer</code>
+ */
+class Transfer extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string from_stop_id = 1;</code>
+     */
+    protected $from_stop_id = '';
+    /**
+     * Generated from protobuf field <code>string to_stop_id = 2;</code>
+     */
+    protected $to_stop_id = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.Transfer.TransferType transfer_type = 3;</code>
+     */
+    protected $transfer_type = 0;
+    /**
+     * Generated from protobuf field <code>int32 min_transfer_time = 4;</code>
+     */
+    protected $min_transfer_time = 0;
+    /**
+     * 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 $from_stop_id
+     *     @type string $to_stop_id
+     *     @type int $transfer_type
+     *     @type int $min_transfer_time
+     *     @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);
+    }
+
+    /**
+     * Generated from protobuf field <code>string from_stop_id = 1;</code>
+     * @return string
+     */
+    public function getFromStopId()
+    {
+        return $this->from_stop_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string from_stop_id = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setFromStopId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->from_stop_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string to_stop_id = 2;</code>
+     * @return string
+     */
+    public function getToStopId()
+    {
+        return $this->to_stop_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>string to_stop_id = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setToStopId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->to_stop_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Transfer.TransferType transfer_type = 3;</code>
+     * @return int
+     */
+    public function getTransferType()
+    {
+        return $this->transfer_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Transfer.TransferType transfer_type = 3;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setTransferType($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Transfer_TransferType::class);
+        $this->transfer_type = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 min_transfer_time = 4;</code>
+     * @return int
+     */
+    public function getMinTransferTime()
+    {
+        return $this->min_transfer_time;
+    }
+
+    /**
+     * Generated from protobuf field <code>int32 min_transfer_time = 4;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setMinTransferTime($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->min_transfer_time = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Transfer/TransferType.php b/inc/Gtfs/Transfer/TransferType.php
new file mode 100644
index 0000000..f78300f
--- /dev/null
+++ b/inc/Gtfs/Transfer/TransferType.php
@@ -0,0 +1,61 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Transfer;
+
+use UnexpectedValueException;
+
+/**
+ * Protobuf type <code>gtfs.Transfer.TransferType</code>
+ */
+class TransferType
+{
+    /**
+     * Generated from protobuf enum <code>RECOMMENDED = 0;</code>
+     */
+    const RECOMMENDED = 0;
+    /**
+     * Generated from protobuf enum <code>TIMED = 1;</code>
+     */
+    const TIMED = 1;
+    /**
+     * Generated from protobuf enum <code>MINIMUM = 2;</code>
+     */
+    const MINIMUM = 2;
+    /**
+     * Generated from protobuf enum <code>NOT_POSSIBLE = 3;</code>
+     */
+    const NOT_POSSIBLE = 3;
+
+    private static $valueToName = [
+        self::RECOMMENDED => 'RECOMMENDED',
+        self::TIMED => 'TIMED',
+        self::MINIMUM => 'MINIMUM',
+        self::NOT_POSSIBLE => 'NOT_POSSIBLE',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(TransferType::class, \Gtfs\Transfer_TransferType::class);
+
diff --git a/inc/Gtfs/Transfer_TransferType.php b/inc/Gtfs/Transfer_TransferType.php
new file mode 100644
index 0000000..8efb526
--- /dev/null
+++ b/inc/Gtfs/Transfer_TransferType.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Transfer\TransferType instead.
+     * @deprecated
+     */
+    class Transfer_TransferType {}
+}
+class_exists(Transfer\TransferType::class);
+@trigger_error('Gtfs\Transfer_TransferType is deprecated and will be removed in the next major release. Use Gtfs\Transfer\TransferType instead', E_USER_DEPRECATED);
+
diff --git a/inc/Gtfs/Trip.php b/inc/Gtfs/Trip.php
new file mode 100644
index 0000000..0452c4f
--- /dev/null
+++ b/inc/Gtfs/Trip.php
@@ -0,0 +1,346 @@
+<?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.Trip</code>
+ */
+class Trip extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * The route_id field contains an ID that uniquely identifies a route.
+     *
+     * Generated from protobuf field <code>string route_id = 1;</code>
+     */
+    protected $route_id = '';
+    /**
+     * The service_id contains an ID that uniquely identifies a set of dates when service is available for one or more routes.
+     *
+     * Generated from protobuf field <code>string service_id = 2;</code>
+     */
+    protected $service_id = '';
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 3;</code>
+     */
+    protected $trip_id = '';
+    /**
+     * The trip_headsign field contains the text that appears on a sign that identifies the trip's destination to passengers.
+     *
+     * Generated from protobuf field <code>string trip_headsign = 4;</code>
+     */
+    protected $trip_headsign = '';
+    /**
+     * The trip_short_name field contains the text that appears in schedules and sign boards to identify the trip to passengers.
+     *
+     * Generated from protobuf field <code>string trip_short_name = 5;</code>
+     */
+    protected $trip_short_name = '';
+    /**
+     * Generated from protobuf field <code>.gtfs.Trip.Direction direction_id = 6;</code>
+     */
+    protected $direction_id = 0;
+    /**
+     * The block_id field identifies the block to which the trip belongs.
+     * A block consists of two or more sequential trips made using the same vehicle,
+     * where a passenger can transfer from one trip to the next just by staying in the vehicle.
+     *
+     * Generated from protobuf field <code>string block_id = 7;</code>
+     */
+    protected $block_id = '';
+    /**
+     * The shape_id field contains an ID that defines a shape for the trip.
+     *
+     * Generated from protobuf field <code>string shape_id = 8;</code>
+     */
+    protected $shape_id = '';
+    /**
+     * 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.
+     *     @type string $service_id
+     *           The service_id contains an ID that uniquely identifies a set of dates when service is available for one or more routes.
+     *     @type string $trip_id
+     *           The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *     @type string $trip_headsign
+     *           The trip_headsign field contains the text that appears on a sign that identifies the trip's destination to passengers.
+     *     @type string $trip_short_name
+     *           The trip_short_name field contains the text that appears in schedules and sign boards to identify the trip to passengers.
+     *     @type int $direction_id
+     *     @type string $block_id
+     *           The block_id field identifies the block to which the trip belongs.
+     *           A block consists of two or more sequential trips made using the same vehicle,
+     *           where a passenger can transfer from one trip to the next just by staying in the vehicle.
+     *     @type string $shape_id
+     *           The shape_id field contains an ID that defines a shape for the trip.
+     *     @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.
+     *
+     * 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.
+     *
+     * 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 service_id contains an ID that uniquely identifies a set of dates when service is available for one or more routes.
+     *
+     * Generated from protobuf field <code>string service_id = 2;</code>
+     * @return string
+     */
+    public function getServiceId()
+    {
+        return $this->service_id;
+    }
+
+    /**
+     * The service_id contains an ID that uniquely identifies a set of dates when service is available for one or more routes.
+     *
+     * Generated from protobuf field <code>string service_id = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setServiceId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->service_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 3;</code>
+     * @return string
+     */
+    public function getTripId()
+    {
+        return $this->trip_id;
+    }
+
+    /**
+     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+     *
+     * Generated from protobuf field <code>string trip_id = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTripId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trip_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The trip_headsign field contains the text that appears on a sign that identifies the trip's destination to passengers.
+     *
+     * Generated from protobuf field <code>string trip_headsign = 4;</code>
+     * @return string
+     */
+    public function getTripHeadsign()
+    {
+        return $this->trip_headsign;
+    }
+
+    /**
+     * The trip_headsign field contains the text that appears on a sign that identifies the trip's destination to passengers.
+     *
+     * Generated from protobuf field <code>string trip_headsign = 4;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTripHeadsign($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trip_headsign = $var;
+
+        return $this;
+    }
+
+    /**
+     * The trip_short_name field contains the text that appears in schedules and sign boards to identify the trip to passengers.
+     *
+     * Generated from protobuf field <code>string trip_short_name = 5;</code>
+     * @return string
+     */
+    public function getTripShortName()
+    {
+        return $this->trip_short_name;
+    }
+
+    /**
+     * The trip_short_name field contains the text that appears in schedules and sign boards to identify the trip to passengers.
+     *
+     * Generated from protobuf field <code>string trip_short_name = 5;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTripShortName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trip_short_name = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Trip.Direction direction_id = 6;</code>
+     * @return int
+     */
+    public function getDirectionId()
+    {
+        return $this->direction_id;
+    }
+
+    /**
+     * Generated from protobuf field <code>.gtfs.Trip.Direction direction_id = 6;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setDirectionId($var)
+    {
+        GPBUtil::checkEnum($var, \Gtfs\Trip_Direction::class);
+        $this->direction_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The block_id field identifies the block to which the trip belongs.
+     * A block consists of two or more sequential trips made using the same vehicle,
+     * where a passenger can transfer from one trip to the next just by staying in the vehicle.
+     *
+     * Generated from protobuf field <code>string block_id = 7;</code>
+     * @return string
+     */
+    public function getBlockId()
+    {
+        return $this->block_id;
+    }
+
+    /**
+     * The block_id field identifies the block to which the trip belongs.
+     * A block consists of two or more sequential trips made using the same vehicle,
+     * where a passenger can transfer from one trip to the next just by staying in the vehicle.
+     *
+     * Generated from protobuf field <code>string block_id = 7;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setBlockId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->block_id = $var;
+
+        return $this;
+    }
+
+    /**
+     * The shape_id field contains an ID that defines a shape for the trip.
+     *
+     * Generated from protobuf field <code>string shape_id = 8;</code>
+     * @return string
+     */
+    public function getShapeId()
+    {
+        return $this->shape_id;
+    }
+
+    /**
+     * The shape_id field contains an ID that defines a shape for the trip.
+     *
+     * Generated from protobuf field <code>string shape_id = 8;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setShapeId($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->shape_id = $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;
+    }
+
+}
+
diff --git a/inc/Gtfs/Trip/Direction.php b/inc/Gtfs/Trip/Direction.php
new file mode 100644
index 0000000..d446b74
--- /dev/null
+++ b/inc/Gtfs/Trip/Direction.php
@@ -0,0 +1,53 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs\Trip;
+
+use UnexpectedValueException;
+
+/**
+ * The direction_id field contains a binary value that indicates the direction of travel for a trip.
+ *
+ * Protobuf type <code>gtfs.Trip.Direction</code>
+ */
+class Direction
+{
+    /**
+     * Generated from protobuf enum <code>OUTBOUND = 0;</code>
+     */
+    const OUTBOUND = 0;
+    /**
+     * Generated from protobuf enum <code>INBOUND = 1;</code>
+     */
+    const INBOUND = 1;
+
+    private static $valueToName = [
+        self::OUTBOUND => 'OUTBOUND',
+        self::INBOUND => 'INBOUND',
+    ];
+
+    public static function name($value)
+    {
+        if (!isset(self::$valueToName[$value])) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no name defined for value %s', __CLASS__, $value));
+        }
+        return self::$valueToName[$value];
+    }
+
+
+    public static function value($name)
+    {
+        $const = __CLASS__ . '::' . strtoupper($name);
+        if (!defined($const)) {
+            throw new UnexpectedValueException(sprintf(
+                    'Enum %s has no value defined for name %s', __CLASS__, $name));
+        }
+        return constant($const);
+    }
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(Direction::class, \Gtfs\Trip_Direction::class);
+
diff --git a/inc/Gtfs/Trip_Direction.php b/inc/Gtfs/Trip_Direction.php
new file mode 100644
index 0000000..b626b3c
--- /dev/null
+++ b/inc/Gtfs/Trip_Direction.php
@@ -0,0 +1,16 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace Gtfs;
+
+if (false) {
+    /**
+     * This class is deprecated. Use Gtfs\Trip\Direction instead.
+     * @deprecated
+     */
+    class Trip_Direction {}
+}
+class_exists(Trip\Direction::class);
+@trigger_error('Gtfs\Trip_Direction is deprecated and will be removed in the next major release. Use Gtfs\Trip\Direction instead', E_USER_DEPRECATED);
+
