First prototype
diff --git a/inc/GPBMetadata/Proto/Gtfs.php b/inc/GPBMetadata/Proto/Gtfs.php
new file mode 100644
index 0000000..d65da4d
--- /dev/null
+++ b/inc/GPBMetadata/Proto/Gtfs.php
@@ -0,0 +1,178 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gtfs.proto
+
+namespace GPBMetadata\Proto;
+
+class Gtfs
+{
+    public static $is_initialized = false;
+
+    public static function initOnce() {
+        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
+
+        if (static::$is_initialized == true) {
+          return;
+        }
+        \GPBMetadata\Google\Protobuf\Any::initOnce();
+        $pool->internalAddGeneratedFile(hex2bin(
+            "0af0230a1070726f746f2f677466732e70726f746f12046774667322510a" .
+            "0b466565644d65737361676512200a0668656164657218012001280b3210" .
+            "2e677466732e4665656448656164657212200a06656e7469747918022003" .
+            "280b32102e677466732e46656564456e7469747922e6010a0a4665656448" .
+            "656164657212140a0c677466735f76657273696f6e180120012809121b0a" .
+            "13666565645f7075626c69736865725f6e616d65180220012809121a0a12" .
+            "666565645f7075626c69736865725f75726c18032001280912110a096665" .
+            "65645f6c616e6718042001280912170a0f666565645f73746172745f6461" .
+            "746518052001280912150a0d666565645f656e645f646174651806200128" .
+            "0912140a0c666565645f76657273696f6e18072001280912280a09657874" .
+            "656e73696f6e18d00f2001280b32142e676f6f676c652e70726f746f6275" .
+            "662e416e794a0608e80710d00f2291040a0a46656564456e74697479120a" .
+            "0a02696418012001280912120a0a69735f64656c65746564180220012808" .
+            "121e0a066167656e637918032001280b320c2e677466732e4167656e6379" .
+            "4800121a0a0473746f7018042001280b320a2e677466732e53746f704800" .
+            "121c0a05726f75746518052001280b320b2e677466732e526f7574654800" .
+            "121a0a047472697018062001280b320a2e677466732e5472697048001223" .
+            "0a0973746f705f74696d6518072001280b320e2e677466732e53746f7054" .
+            "696d65480012220a0863616c656e64617218082001280b320e2e67746673" .
+            "2e43616c656e6461724800122b0a0d63616c656e6461725f646174651809" .
+            "2001280b32122e677466732e43616c656e646172446174654800122d0a0e" .
+            "666172655f617474726962757465180a2001280b32132e677466732e4661" .
+            "7265417474726962757465480012230a09666172655f72756c65180b2001" .
+            "280b320e2e677466732e4661726552756c654800121c0a05736861706518" .
+            "0c2001280b320b2e677466732e5368617065480012240a09667265717565" .
+            "6e6379180d2001280b320f2e677466732e4672657175656e637948001222" .
+            "0a087472616e73666572180e2001280b320e2e677466732e5472616e7366" .
+            "6572480012280a09657874656e73696f6e18d00f2001280b32142e676f6f" .
+            "676c652e70726f746f6275662e416e7942090a07656c656d656e744a0608" .
+            "e80710d00f22d3010a064167656e637912110a096167656e63795f696418" .
+            "012001280912130a0b6167656e63795f6e616d6518022001280912120a0a" .
+            "6167656e63795f75726c18032001280912170a0f6167656e63795f74696d" .
+            "657a6f6e6518042001280912130a0b6167656e63795f6c616e6718052001" .
+            "280912140a0c6167656e63795f70686f6e6518062001280912170a0f6167" .
+            "656e63795f666172655f75726c18072001280912280a09657874656e7369" .
+            "6f6e18d00f2001280b32142e676f6f676c652e70726f746f6275662e416e" .
+            "794a0608e80710d00f2288040a0453746f70120f0a0773746f705f696418" .
+            "012001280912110a0973746f705f636f646518022001280912110a097374" .
+            "6f705f6e616d6518032001280912110a0973746f705f6465736318042001" .
+            "280912100a086c6174697475646518052001280212110a096c6f6e676974" .
+            "756465180620012802120f0a077a6f6e655f696418072001280912100a08" .
+            "73746f705f75726c180820012809122e0a0d6c6f636174696f6e5f747970" .
+            "6518092001280e32172e677466732e53746f702e4c6f636174696f6e5479" .
+            "706512160a0e706172656e745f73746174696f6e180a2001280912170a0f" .
+            "6167656e63795f74696d657a6f6e65180b20012809123a0a13776865656c" .
+            "63686169725f626f617264696e67180c2001280e321d2e677466732e5374" .
+            "6f702e576865656c6368616972426f617264696e6712280a09657874656e" .
+            "73696f6e18d00f2001280b32142e676f6f676c652e70726f746f6275662e" .
+            "416e7922580a0c4c6f636174696f6e5479706512080a0453544f50100012" .
+            "0b0a0753544154494f4e1001120c0a08454e5452414e4345100212100a0c" .
+            "47454e455249435f4e4f4445100312110a0d424f415244494e475f415245" .
+            "41100422450a12576865656c6368616972426f617264696e67120b0a0755" .
+            "4e4b4e4f574e1000120e0a0a41434345535349424c45100112120a0e4e4f" .
+            "545f41434345535349424c4510024a0608e80710d00f22fd020a05526f75" .
+            "746512100a08726f7574655f696418012001280912110a096167656e6379" .
+            "5f696418022001280912180a10726f7574655f73686f72745f6e616d6518" .
+            "032001280912170a0f726f7574655f6c6f6e675f6e616d65180420012809" .
+            "12120a0a726f7574655f6465736318052001280912290a0a726f7574655f" .
+            "7479706518062001280e32152e677466732e526f7574652e526f75746554" .
+            "79706512110a09726f7574655f75726c18072001280912130a0b726f7574" .
+            "655f636f6c6f7218082001280912180a10726f7574655f746578745f636f" .
+            "6c6f7218092001280912280a09657874656e73696f6e18d00f2001280b32" .
+            "142e676f6f676c652e70726f746f6275662e416e7922690a09526f757465" .
+            "5479706512080a045452414d1000120a0a06535542574159100112080a04" .
+            "5241494c100212070a03425553100312090a0546455252591004120c0a08" .
+            "4341424c454341521005120b0a07474f4e444f4c411006120d0a0946554e" .
+            "4943554c415210074a0608e80710d00f2297020a045472697012100a0872" .
+            "6f7574655f696418012001280912120a0a736572766963655f6964180220" .
+            "012809120f0a07747269705f696418032001280912150a0d747269705f68" .
+            "6561647369676e18042001280912170a0f747269705f73686f72745f6e61" .
+            "6d65180520012809122a0a0c646972656374696f6e5f696418062001280e" .
+            "32142e677466732e547269702e446972656374696f6e12100a08626c6f63" .
+            "6b5f696418072001280912100a0873686170655f69641808200128091228" .
+            "0a09657874656e73696f6e18d00f2001280b32142e676f6f676c652e7072" .
+            "6f746f6275662e416e7922260a09446972656374696f6e120c0a084f5554" .
+            "424f554e441000120b0a07494e424f554e4410014a0608e80710d00f2290" .
+            "030a0853746f7054696d65120f0a07747269705f69641801200128091214" .
+            "0a0c6172726976616c5f74696d6518022001280912160a0e646570617274" .
+            "7572655f74696d65180320012809120f0a0773746f705f69641804200128" .
+            "0912150a0d73746f705f73657175656e636518052001280912150a0d7374" .
+            "6f705f686561647369676e18062001280912340a0b7069636b75705f7479" .
+            "706518072001280e321f2e677466732e53746f7054696d652e417661696c" .
+            "6162696c6974795479706512360a0d64726f705f6f66665f747970651808" .
+            "2001280e321f2e677466732e53746f7054696d652e417661696c6162696c" .
+            "69747954797065121b0a1373686170655f646973745f74726176656c6564" .
+            "18092001280212280a09657874656e73696f6e18d00f2001280b32142e67" .
+            "6f6f676c652e70726f746f6275662e416e7922490a10417661696c616269" .
+            "6c69747954797065120b0a07524547554c4152100012110a0d4e4f545f41" .
+            "5641494c41424c45100112090a0550484f4e451002120a0a064452495645" .
+            "5210034a0608e80710d00f22e3030a0843616c656e64617212120a0a7365" .
+            "72766963655f6964180120012809122a0a066d6f6e64617918022001280e" .
+            "321a2e677466732e43616c656e6461722e43616c656e646172446179122b" .
+            "0a077475657364617918032001280e321a2e677466732e43616c656e6461" .
+            "722e43616c656e646172446179122d0a097765646e657364617918042001" .
+            "280e321a2e677466732e43616c656e6461722e43616c656e646172446179" .
+            "122c0a08746875727364617918052001280e321a2e677466732e43616c65" .
+            "6e6461722e43616c656e646172446179122a0a0666726964617918062001" .
+            "280e321a2e677466732e43616c656e6461722e43616c656e646172446179" .
+            "122c0a08736174757264617918072001280e321a2e677466732e43616c65" .
+            "6e6461722e43616c656e646172446179122a0a0673756e64617918082001" .
+            "280e321a2e677466732e43616c656e6461722e43616c656e646172446179" .
+            "12120a0a73746172745f6461746518092001280912100a08656e645f6461" .
+            "7465180a2001280912280a09657874656e73696f6e18d00f2001280b3214" .
+            "2e676f6f676c652e70726f746f6275662e416e79222f0a0b43616c656e64" .
+            "617244617912110a0d4e4f545f415641494c41424c451000120d0a094156" .
+            "41494c41424c4510014a0608e80710d00f22d9010a0c43616c656e646172" .
+            "4461746512120a0a736572766963655f6964180120012809120c0a046461" .
+            "746518022001280912380a0e657863657074696f6e5f7479706518032001" .
+            "280e32202e677466732e43616c656e646172446174652e45786365707469" .
+            "6f6e5479706512280a09657874656e73696f6e18d00f2001280b32142e67" .
+            "6f6f676c652e70726f746f6275662e416e79223b0a0d457863657074696f" .
+            "6e5479706512120a0e554e555345445f554e4b4e4f574e100012090a0541" .
+            "444445441001120b0a0752454d4f56454410024a0608e80710d00f22e802" .
+            "0a0d46617265417474726962757465120f0a07666172655f696418012001" .
+            "2809120d0a05707269636518022001280212150a0d63757272656e63795f" .
+            "7479706518032001280912390a0e7061796d656e745f6d6574686f641804" .
+            "2001280e32212e677466732e466172654174747269627574652e5061796d" .
+            "656e744d6574686f6412300a097472616e736665727318052001280e321d" .
+            "2e677466732e466172654174747269627574652e5472616e736665727312" .
+            "190a117472616e736665725f6475726174696f6e18062001280512280a09" .
+            "657874656e73696f6e18d00f2001280b32142e676f6f676c652e70726f74" .
+            "6f6275662e416e79222d0a0d5061796d656e744d6574686f64120b0a074f" .
+            "4e424f4152441000120f0a0b505245424f415244494e47100122370a0954" .
+            "72616e736665727312060a024e4f100012080a044f4e4345100112090a05" .
+            "54574943451002120d0a09554e4c494d4954454410034a0608e80710d00f" .
+            "229f010a084661726552756c65120f0a07666172655f6964180120012809" .
+            "12100a08726f7574655f696418022001280912110a096f726967696e5f69" .
+            "6418032001280912160a0e64657374696e6174696f6e5f69641804200128" .
+            "0912130a0b636f6e7461696e735f696418052001280912280a0965787465" .
+            "6e73696f6e18d00f2001280b32142e676f6f676c652e70726f746f627566" .
+            "2e416e794a0608e80710d00f22af010a05536861706512100a0873686170" .
+            "655f696418012001280912140a0c73686170655f70745f6c617418022001" .
+            "280212140a0c73686170655f70745f6c6f6e18032001280212190a117368" .
+            "6170655f70745f73657175656e6365180420012805121b0a137368617065" .
+            "5f646973745f74726176656c656418052001280212280a09657874656e73" .
+            "696f6e18d00f2001280b32142e676f6f676c652e70726f746f6275662e41" .
+            "6e794a0608e80710d00f22eb010a094672657175656e6379120f0a077472" .
+            "69705f696418012001280912120a0a73746172745f74696d651802200128" .
+            "0912100a08656e645f74696d6518032001280912140a0c68656164776179" .
+            "5f7365637318042001280512310a0b65786163745f74696d657318052001" .
+            "280e321c2e677466732e4672657175656e63792e5363686564756c655479" .
+            "706512280a09657874656e73696f6e18d00f2001280b32142e676f6f676c" .
+            "652e70726f746f6275662e416e79222c0a0c5363686564756c6554797065" .
+            "120f0a0b4e4f545f45584143544c591000120b0a0745584143544c591001" .
+            "4a0608e80710d00f2280020a085472616e7366657212140a0c66726f6d5f" .
+            "73746f705f696418012001280912120a0a746f5f73746f705f6964180220" .
+            "01280912320a0d7472616e736665725f7479706518032001280e321b2e67" .
+            "7466732e5472616e736665722e5472616e736665725479706512190a116d" .
+            "696e5f7472616e736665725f74696d6518042001280512280a0965787465" .
+            "6e73696f6e18d00f2001280b32142e676f6f676c652e70726f746f627566" .
+            "2e416e7922490a0c5472616e7366657254797065120f0a0b5245434f4d4d" .
+            "454e444544100012090a0554494d45441001120b0a074d494e494d554d10" .
+            "0212100a0c4e4f545f504f535349424c4510034a0608e80710d00f620670" .
+            "726f746f33"
+        ), true);
+
+        static::$is_initialized = true;
+    }
+}
+
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);
+
diff --git a/inc/api.php b/inc/api.php
new file mode 100644
index 0000000..fd9b40f
--- /dev/null
+++ b/inc/api.php
@@ -0,0 +1,106 @@
+<?php
+class api {
+  private function writeJSON($array) {
+    echo json_encode($array);
+  }
+
+  private function error($error = null) {
+    self::writeJSON(["status" => "error", "error" => $error]);
+    exit();
+  }
+
+  private function returnData($data) {
+    self::writeJSON(["status" => "ok", "data" => $data]);
+    exit();
+  }
+
+  private function transformRouteShortName($name) {
+    if ($name == "L9N") return "L9";
+    if ($name == "L10N") return "L10";
+    return $name;
+  }
+
+  public static function handleRequest() {
+    global $_GET, $_POST, $conf;
+
+    header("Content-Type: application/json");
+
+    if (!isset($_GET["action"])) self::error("actionNotProvided");
+
+    $gtfs = new gtfs();
+
+    switch ($_GET["action"]) {
+      case "routes":
+      self::returnData($gtfs->getRoutes());
+      break;
+
+      case "trips":
+      if (!isset($_GET["route"])) self::error("missingArguments");
+      $route = $_GET["route"];
+
+      self::returnData($gtfs->getTrips($route));
+      break;
+
+      case "stations":
+      self::returnData($gtfs->getStations(true));
+
+      /*$estacionsFull = tmbApi::request("transit/linies/metro/".$linia."/estacions");
+      if ($estacionsFull === false || !isset($estacionsFull["features"])) self::error("unexpected");
+
+      $estacions = [];
+      foreach ($estacionsFull["features"] as $estacio) {
+        if (!isset($estacio["properties"])) self::error("unexpected");
+        $estacions[] = [
+          "id" => $estacio["properties"]["CODI_ESTACIO"] ?? null,
+          "nom" => $estacio["properties"]["NOM_ESTACIO"] ?? "",
+          "color" => $estacio["properties"]["COLOR_LINIA"] ?? "000",
+          "ordre" => $estacio["properties"]["ORDRE_ESTACIO"] ?? 0
+        ];
+      }
+
+      usort($estacions, function ($a, $b) {
+        return $a["ordre"] - $b["ordre"];
+      });*/
+      break;
+
+      case "getTimes":
+      if (!isset($_GET["stop"])) self::error("missingArguments");
+
+      $stop = $gtfs->getStop($_GET["stop"]);
+      $times = $gtfs->getStopTimes($_GET["stop"]);
+
+      $schedules = [];
+      $routes = [];
+      foreach ($times as $time) {
+        if ($time["trip_headsign"] == $stop["stop_name"]) continue;
+        $schedules[] = [
+          "destination" => $time["trip_headsign"],
+          "arrivalTime" => gtfs::time2seconds($time["arrival_time"]),
+          "departureTime" => gtfs::time2seconds($time["departure_time"]),
+          "route" => self::transformRouteShortName($time["route_short_name"]),
+          "color" => $time["route_color"],
+          "textColor" => $time["route_text_color"]
+        ];
+
+        if (!in_array($time["route_short_name"], $routes)) $routes[] = $time["route_short_name"];
+      }
+
+      $timeSinceMidnight = gtfs::timeSinceMidnight();
+
+      usort($schedules, function($a, $b) use ($timeSinceMidnight) {
+        return ($a["departureTime"] - $b["departureTime"]) % (24*60*60);
+      });
+
+      $data = [
+        "schedules" => $schedules,
+        "numRoutes" => count($routes)
+      ];
+
+      self::returnData($data);
+      break;
+
+      default:
+      self::error("actionNotImplemented");
+    }
+  }
+}
diff --git a/inc/csv.php b/inc/csv.php
new file mode 100644
index 0000000..d974713
--- /dev/null
+++ b/inc/csv.php
@@ -0,0 +1,29 @@
+<?php
+class csv {
+  public static $fields = ["dni", "name", "category", "email", "companies"];
+
+  public static function csv2array($file, $check = null, $onlyField = null) {
+    $return = [];
+
+    $flag = true;
+    $headers = [];
+    while (($line = fgetcsv($file, null, ",")) !== false) {
+      if ($flag) {
+        $headers = $line;
+        $flag = false;
+      } else {
+        $item = [];
+
+        foreach ($headers as $j => $field) {
+          $item[$field] = trim($line[$j]);
+        }
+
+        if ($check === null || $check($item)) $return[] = ($onlyField === null ? $item : ($item[$onlyField] ?? null));
+      }
+    }
+
+    fclose($file);
+
+    return $return;
+  }
+}
diff --git a/inc/gtfs.php b/inc/gtfs.php
new file mode 100644
index 0000000..b4c49da
--- /dev/null
+++ b/inc/gtfs.php
@@ -0,0 +1,190 @@
+<?php
+class gtfs {
+  //private static $files = ["calendar_dates", "calendar", "routes", "stop_times", "stops", "trips"];
+
+  private $db;
+
+  private static $dow = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
+
+  function __construct($path = null) {
+    global $conf;
+
+    try {
+      $this->db = new PDO('sqlite:'.($conf["databaseFile"]));
+    } catch (PDOException $e) {
+      die("SQLite error: $e\n");
+    }
+  }
+
+  static function timeSinceMidnight() {
+    //return 8*60*60 + 9*60; //TESTING
+    return (time() - mktime(0, 0, 0));
+  }
+
+  static function today() {
+    return date("Ymd");
+  }
+
+  static function time2seconds($time) {
+    $timeSinceMidnight = self::timeSinceMidnight();
+
+    $boom = explode(":", $time);
+    if (count($boom) != 3) return null;
+
+    return ((($boom[0]*60) + $boom[1])*60 + $boom[2]) % (24*60*60);
+  }
+
+  private function fetchAll($sql) {
+    $query = $this->db->query($sql);
+    if (!$query) return false;
+
+    return $query->fetchAll(PDO::FETCH_ASSOC);
+  }
+
+  private function fetchAllPrepared($sql, $values) {
+    $query = $this->db->prepare($sql);
+    if (!$query) return false;
+
+    $query->execute($values);
+    return $query->fetchAll(PDO::FETCH_ASSOC);
+  }
+
+  private function fetchTable($table, $filters = [], $orderedField = null) {
+    $order = ($orderedField === null ? "" : " ORDER BY $orderedField");
+
+    if (!count($filters)) {
+      return $this->fetchAll("SELECT * FROM $table".$order);
+    }
+
+    $whereConditions = [];
+    $values = [];
+    foreach ($filters as $filter) {
+      $whereConditions[] = $filter[0]." = ?";
+      $values[] = $filter[1];
+    }
+
+    return $this->fetchAllPrepared("SELECT * FROM $table WHERE ".implode(" AND ", $whereConditions).$order, $values);
+  }
+
+  function getRoutes() {
+    return $this->fetchTable("routes");
+  }
+
+  function getTrips($route) {
+    return $this->fetchTable("trips", [["route_id", $route]]);
+  }
+
+  function getStations($ordered = false) {
+    return $this->fetchTable("stops", [["location_type", Gtfs\Stop\LocationType::STATION]], ($ordered ? "stop_name" : null));
+  }
+
+  function getStop($stop) {
+    $results = $this->fetchTable("stops", [["stop_id", $stop]]);
+
+    if (!count($results)) return null;
+
+    return $results[0];
+  }
+
+  function getPlatforms($stop) {
+    $results = $this->fetchTable("stops", [["parent_station", $stop], ["location_type", Gtfs\Stop\LocationType::STOP]], "stop_id");
+
+    return $results;
+  }
+
+  const TIME_LIMIT = 160;
+  function getStopTimes($stop, $timeLimit = self::TIME_LIMIT) {
+    $stops = $this->getPlatforms($stop);
+
+    $values = [];
+    foreach ($stops as $s) {
+      $values[] = $s["stop_id"]; // Stops
+    }
+
+    $rdow = (int)date("w");
+    $dow = self::$dow[$rdow]; // Today's day of week
+    $dow2 = self::$dow[($rdow + 1) % 7]; // Tomorrow's day of week
+
+    if (!count($stops)) return [];
+
+    $sql = "SELECT st.*, t.*, r.*, c.*, cd.*, strftime('%Y%m%d', 'now', 'localtime') as today, strftime('%Y%m%d', 'now', 'localtime', '1 day') as tomorrow, time('now', 'localtime') as now
+      FROM stop_times st
+      INNER JOIN trips t
+        ON st.trip_id = t.trip_id
+      INNER JOIN routes r
+        ON t.route_id = r.route_id
+      LEFT JOIN calendar c
+        ON t.service_id = c.service_id
+      LEFT JOIN calendar_dates cd
+        ON t.service_id = cd.service_id
+      WHERE
+      st.stop_id IN (".implode(", ", array_fill(0, count($stops), "?")).") AND
+      (
+        cd.service_id IS NULL OR
+        cd.exception_type = ".(int)Gtfs\CalendarDate\ExceptionType::ADDED."
+      ) AND
+      (
+        (
+          (
+            (
+              time(now) < time('00:00:00', '-".(int)$timeLimit." minutes') AND
+              st.departure_time BETWEEN time(now) AND time(now, '".(int)$timeLimit." minutes')
+            ) OR
+            (
+              time(now) >= time('00:00:00', '-".(int)$timeLimit." minutes') AND
+              st.departure_time BETWEEN time(now) AND strftime('24:%M:%S', now, '".(int)$timeLimit." minutes')
+            )
+          ) AND
+          (
+            c.service_id IS NULL OR
+            (
+              c.start_date <= today AND
+              c.end_date >= today AND
+              c.$dow = ".(int)Gtfs\Calendar\CalendarDay::AVAILABLE."
+            )
+          ) AND
+          (
+            cd.service_id IS NULL OR
+            cd.date = today
+          )
+        ) OR
+        (
+          (
+            (
+              time(now) < time('00:00:00', '-".(int)$timeLimit." minutes') AND
+              st.departure_time BETWEEN ((strftime('%H', now) + 24) || strftime(':%M:%S', now)) AND ((strftime('%H', now, '".(int)$timeLimit." minutes') + 24) || strftime(':%M:%S', now, '".(int)$timeLimit." minutes'))
+            ) OR
+            (
+              time(now) >= time('00:00:00', '-".(int)$timeLimit." minutes') AND
+              st.departure_time BETWEEN time(now) AND strftime('24:%M:%S', now, '".(int)$timeLimit." minutes')
+            )
+          ) AND
+          (
+            c.service_id IS NULL OR
+            (
+              c.start_date <= tomorrow AND
+              c.end_date >= tomorrow AND
+              c.$dow2 = ".(int)Gtfs\Calendar\CalendarDay::AVAILABLE."
+            )
+          ) AND
+          (
+            cd.service_id IS NULL OR
+            cd.date = tomorrow
+          )
+        )
+      )
+      ORDER BY departure_time ASC";
+
+    $result = $this->fetchAllPrepared($sql, $values);
+    if ($result === false) {
+      echo implode("\n", $this->db->errorInfo());
+      exit();
+    }
+
+    return $result;
+  }
+
+  function __destruct() {
+    $this->db = null;
+  }
+}
diff --git a/inc/gtfsHandler.php b/inc/gtfsHandler.php
new file mode 100644
index 0000000..a6d8aa1
--- /dev/null
+++ b/inc/gtfsHandler.php
@@ -0,0 +1,321 @@
+<?php
+class gtfsHandler {
+  public static $databases = [
+    "agency" => [
+      "columns" => [
+        "agency_id" => "TEXT",
+        "agency_name" => "TEXT NOT NULL",
+        "agency_url" => "TEXT NOT NULL",
+        "agency_timezone" => "TEXT NOT NULL",
+        "agency_lang" => "TEXT",
+        "agency_phone" => "TEXT",
+        "agency_fare_url" => "TEXT",
+        "agency_email" => "TEXT"
+      ]
+    ],
+    "attributions" => [
+      "columns" => [
+        "attribution_id" => "TEXT PRIMARY KEY",
+        "agency_id" => "TEXT",
+        "route_id" => "TEXT",
+        "trip_id" => "TEXT",
+        "organization_name" => "TEXT NOT NULL",
+        "is_producer" => "INT",
+        "is_operator" => "INT",
+        "is_authority" => "INT",
+        "attribution_url" => "TEXT",
+        "attribution_email" => "TEXT",
+        "attribution_phone" => "TEXT"
+      ]
+    ],
+    "stops" => [
+      "columns" => [
+        "stop_id" => "TEXT PRIMARY KEY",
+        "stop_code" => "TEXT",
+        "stop_name" => "TEXT",
+        "stop_desc" => "TEXT",
+        "stop_lat" => "TEXT",
+        "stop_lon" => "TEXT",
+        "zone_id" => "TEXT",
+        "stop_url" => "TEXT",
+        "location_type" => "INT",
+        "parent_station" => "TEXT",
+        "stop_timezone" => "TEXT",
+        "wheelchair_boarding" => "INT",
+        "level_id" => "TEXT",
+        "platform_code" => "TEXT"
+      ],
+      "indexes" => ["parent_station"]
+    ],
+    "routes" => [
+      "columns" => [
+        "route_id" => "TEXT PRIMARY KEY",
+        "agency_id" => "TEXT",
+        "route_short_name" => "TEXT",
+        "route_long_name" => "TEXT",
+        "route_desc" => "TEXT",
+        "route_type" => "INT NOT NULL",
+        "route_url" => "TEXT",
+        "route_color" => "TEXT",
+        "route_text_color" => "TEXT",
+        "route_sort_order" => "INT"
+      ]
+    ],
+    "trips" => [
+      "columns" => [
+        "route_id" => "TEXT NOT NULL",
+        "service_id" => "TEXT NOT NULL",
+        "trip_id" => "TEXT PRIMARY KEY",
+        "trip_headsign" => "TEXT",
+        "trip_short_name" => "TEXT",
+        "direction_id" => "INT",
+        "block_id" => "TEXT",
+        "shape_id" => "TEXT",
+        "wheelchair_accessible" => "INT",
+        "bikes_allowed" => "INT"
+      ],
+      "indexes" => ["route_id", "service_id"]
+    ],
+    "stop_times" => [
+      "columns" => [
+        "trip_id" => "TEXT NOT NULL",
+        "arrival_time" => "TEXT",
+        "departure_time" => "TEXT",
+        "stop_id" => "TEXT NOT NULL",
+        "stop_sequence" => "INT NOT NULL",
+        "stop_headsign" => "TEXT",
+        "pickup_type" => "INT",
+        "drop_off_type" => "INT",
+        "shape_dist_traveled" => "INT",
+        "timepoint" => "INT"
+      ],
+      "indexes" => ["trip_id", "stop_id"],
+      "times" => ["arrival_time", "departure_time"]
+    ],
+    "calendar" => [
+      "columns" => [
+        "service_id" => "TEXT PRIMARY KEY",
+        "monday" => "INT NOT NULL",
+        "tuesday" => "INT NOT NULL",
+        "wednesday" => "INT NOT NULL",
+        "thursday" => "INT NOT NULL",
+        "friday" => "INT NOT NULL",
+        "saturday" => "INT NOT NULL",
+        "sunday" => "INT NOT NULL",
+        "start_date" => "INT NOT NULL",
+        "end_date" => "INT NOT NULL"
+      ],
+      "indexes" => ["start_date", "end_date"]
+    ],
+    "calendar_dates" => [
+      "columns" => [
+        "service_id" => "TEXT NOT NULL",
+        "date" => "INT NOT NULL",
+        "exception_type" => "INT NOT NULL"
+      ],
+      "indexes" => ["service_id", "date"]
+    ],
+    "fare_attributes" => [
+      "columns" => [
+        "fare_id" => "TEXT NOT NULL PRIMARY KEY",
+        "price" => "FLOAT NOT NULL",
+        "currency_type" => "INT NOT NULL",
+        "payment_method" => "INT NOT NULL",
+        "transfers" => "TEXT NOT NULL",
+        "agency_id" => "TEXT",
+        "transfer_duration" => "INT"
+      ]
+    ],
+    "fare_rules" => [
+      "columns" => [
+        "fare_id" => "TEXT NOT NULL",
+        "route_id" => "TEXT",
+        "origin_id" => "TEXT",
+        "destination_id" => "TEXT",
+        "contains_id" => "TEXT",
+      ]
+    ],
+    "shapes" => [
+      "columns" => [
+        "shape_id" => "TEXT PRIMARY KEY",
+        "shape_pt_lat" => "FLOAT NOT NULL",
+        "shape_pt_lon" => "FLOAT NOT NULL",
+        "shape_pt_sequence" => "INT NOT NULL",
+        "shape_dist_traveled" => "FLOAT NOT NULL"
+      ]
+    ],
+    "frequencies" => [
+      "columns" => [
+        "trip_id" => "TEXT NOT NULL",
+        "start_time" => "TEXT NOT NULL",
+        "end_time" => "TEXT NOT NULL",
+        "headway_secs" => "INT NOT NULL",
+        "exact_times" => "INT"
+      ],
+      "indexes" => ["trip_id"]
+    ],
+    "transfers" => [
+      "columns" => [
+        "from_stop_id" => "TEXT NOT NULL",
+        "to_stop_id" => "TEXT NOT NULL",
+        "transfer_type" => "INT NOT NULL",
+        "min_transfer_time" => "INT"
+      ],
+      "indexes" => ["from_stop_id", "to_stop_id"]
+    ],
+    "pathways" => [
+      "columns" => [
+        "pathway_id" => "TEXT PRIMARY KEY",
+        "from_stop_id" => "TEXT NOT NULL",
+        "to_stop_id" => "TEXT NOT NULL",
+        "pathway_mode" => "INT NOT NULL",
+        "is_bidirectional" => "INT NOT NULL",
+        "length" => "FLOAT",
+        "traversal_time" => "INT",
+        "stair_count" => "INT",
+        "max_slope" => "FLOAT",
+        "min_width" => "FLOAT",
+        "signposted_as" => "TEXT",
+        "reversed_signposted_as" => "TEXT"
+      ]
+    ],
+    "levels" => [
+      "columns" => [
+        "level_id" => "TEXT PRIMARY KEY",
+        "level_index" => "FLOAT NOT NULL",
+        "level_name" => "TEXT"
+      ]
+    ],
+    "feed_info" => [
+      "columns" => [
+        "feed_publisher_name" => "TEXT NOT NULL",
+        "feed_publisher_url" => "TEXT NOT NULL",
+        "feed_lang" => "TEXT NOT NULL",
+        "feed_start_date" => "INT",
+        "feed_end_date" => "INT",
+        "feed_version" => "TEXT",
+        "feed_contact_email" => "TEXT",
+        "feed_contact_url" => "TEXT"
+      ]
+    ]
+  ];
+
+  public static function fixTime($time) {
+    return str_pad($time, 8, "0", STR_PAD_LEFT);
+  }
+
+  public static function underscoreToCamelCase($string) {
+    return lcfirst(str_replace('_', '', ucwords($string, '_')));
+  }
+
+  public static function camelCaseToUnderscore($string) {
+    return strtolower(preg_replace("/([a-z])([A-Z])/", "$1_$2", $name));
+  }
+
+  public static function getFieldType($table, $field) {
+    if (!isset(self::$databases[$table]) || !isset(self::$databases[$table]["columns"][$field])) return false;
+
+    $definition = self::$databases[$table]["columns"][$field];
+
+    return explode(",", explode(" ", $definition)[0])[0];
+  }
+
+  private static function addRowsToTable($dbName, &$dbTemplate, &$stream) {
+    global $db;
+
+    $db->beginTransaction();
+
+    $query = null;
+
+    $headers = [];
+    $times = [];
+    $flag = true;
+    while (($line = fgetcsv($stream, null, ",")) !== false) {
+      if ($flag) {
+        $headers = $line;
+        $sql = "INSERT INTO $dbName (".implode(", ", $headers).") VALUES (".implode(", ", array_fill(0, count($headers), "?")).")";
+        if (isset($dbTemplate["times"])) {
+          foreach ($dbTemplate["times"] as $field) {
+            $times[] = array_search($field, $headers);
+          }
+        }
+        $query = $db->prepare($sql);
+        $flag = false;
+        continue;
+      }
+
+      $values = array_map(function($value) {
+        return trim($value);
+      }, $line);
+
+      foreach ($times as $time) {
+        $values[$time] = self::fixTime($values[$time]);
+      }
+
+      $query->execute($values);
+    }
+
+    $db->commit();
+
+    fclose($stream);
+  }
+
+  private static function setUpDatabase(&$zip) {
+    global $conf, $db;
+
+    @unlink($conf["databaseFile"]);
+    $db = new PDO('sqlite:'.($conf["databaseFile"]));
+
+    $db->beginTransaction();
+
+    foreach (self::$databases as $dbName => $dbTemplate) {
+      $definitions = [];
+      foreach ($dbTemplate["columns"] as $column => $definition) {
+        $definitions[] = $column." ".$definition;
+      }
+
+      $sql = "CREATE TABLE $dbName (".implode(", ", $definitions).")";
+      if ($db->query($sql)) {
+        echo "[info] Created table $dbName.\n";
+      } else {
+        echo "[error] Couldn't create table $dbName:\n".implode("\n", $db->errorInfo())."\n";
+        $db->rollBack();
+        exit();
+      }
+
+      if (isset($dbTemplate["indexes"])) {
+        foreach ($dbTemplate["indexes"] as $index) {
+          $sql = "CREATE INDEX ${dbName}_${index} ON $dbName ($index)";
+          if ($db->query($sql)) {
+            echo "[info] Created index $index.\n";
+          } else {
+            echo "[error] Couldn't create index $index:\n".implode("\n", $db->errorInfo())."\n";
+            $db->rollBack();
+            exit();
+          }
+        }
+      }
+    }
+
+    $db->commit();
+
+    foreach (self::$databases as $dbName => $dbTemplate) {
+      $stream = $zip->getStream($dbName.".txt");
+      if (!$stream) {
+        echo "[warning] The $dbName file does not exist.\n";
+        continue;
+      }
+
+      self::addRowsToTable($dbName, $dbTemplate, $stream);
+      echo "[info] Added rows to $dbName.\n";
+    }
+  }
+
+  public static function createDatabase($file) {
+    $zip = new ZipArchive();
+    $zip->open($file);
+
+    echo "[info] Setting up database:\n";
+    self::setUpDatabase($zip);
+  }
+}
diff --git a/inc/security.php b/inc/security.php
new file mode 100644
index 0000000..d90629f
--- /dev/null
+++ b/inc/security.php
@@ -0,0 +1,6 @@
+<?php
+class security {
+  public static function htmlsafe($string) {
+    return htmlspecialchars($string);
+  }
+}
diff --git a/inc/tmbApi.php b/inc/tmbApi.php
new file mode 100644
index 0000000..8c7aab7
--- /dev/null
+++ b/inc/tmbApi.php
@@ -0,0 +1,44 @@
+<?php
+class tmbApi {
+  const API_ENDPOINT = "https://api.tmb.cat/v1/";
+
+  public static function httpRequest($url, $method = "GET", $params = [], $file = null) {
+    $curl = curl_init();
+    curl_setopt_array($curl, [
+      CURLOPT_RETURNTRANSFER => 1,
+      CURLOPT_URL => $url
+    ]);
+
+    if ($method === "POST") {
+      curl_setopt($curl, CURLOPT_POST, 1);
+      if (!empty($params)) curl_setopt($curl, CURLOPT_POST_PARAMS, $params);
+    }
+
+
+    if ($file !== null) {
+      curl_setopt($curl, CURLOPT_FILE, $file);
+    }
+
+    $response = curl_exec($curl);
+    curl_close($curl);
+
+    if ($file === null) return $response;
+    return true;
+  }
+
+  public static function httpJSONRequest($url, $method = "GET", $params = []) {
+    $json = json_decode(self::httpRequest($url, $method, $params), true);
+    if (json_last_error() !== JSON_ERROR_NONE) return false;
+
+    return $json;
+  }
+
+  public static function request($action, $file = null) {
+    global $conf;
+
+    $url = self::API_ENDPOINT.$action."?app_id=".urlencode($conf["tmbApi"]["appId"])."&app_key=".urlencode($conf["tmbApi"]["appKey"]);
+
+    if ($file === null) return self::httpJSONRequest($url);
+    self::httpRequest($url, "GET", [], $file);
+  }
+}
diff --git a/inc/views.php b/inc/views.php
new file mode 100644
index 0000000..f1683e3
--- /dev/null
+++ b/inc/views.php
@@ -0,0 +1,26 @@
+<?php
+class views {
+  const VIEW_L9N_OLD = 0;
+  const VIEW_L9N_NEW = 1;
+  const VIEW_L9S = 2;
+
+  public static $views = [self::VIEW_L9N_OLD, self::VIEW_L9N_NEW, self::VIEW_L9S];
+  public static $viewsNames = [
+    self::VIEW_L9N_OLD => "VIEW_L9N_OLD",
+    self::VIEW_L9N_NEW => "VIEW_L9N_NEW",
+    self::VIEW_L9S => "VIEW_L9S"
+  ];
+  public static $viewsInclude = [
+    self::VIEW_L9N_OLD => "l9n.php",
+    self::VIEW_L9N_NEW => "l9n.php",
+    self::VIEW_L9S => "l9s.php"
+  ];
+
+  public static function renderPage($view) {
+    if (!in_array($view, self::$views)) return;
+
+    $gtfs = new gtfs();
+
+    require_once(__DIR__."/../views/".self::$viewsInclude[$view]);
+  }
+}