First prototype
diff --git a/proto/gtfs.proto b/proto/gtfs.proto
new file mode 100644
index 0000000..816ff22
--- /dev/null
+++ b/proto/gtfs.proto
@@ -0,0 +1,464 @@
+// Copyright 2012 Google Inc., Stichting OpenGeo, avm99963
+//
+// The content of this file is licensed under the Creative Commons Attribution
+// 3.0 License.
+//
+// Protocol definition file for a GTFS feed.
+
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+package gtfs;
+
+message FeedMessage {
+  // Metadata about this feed and feed message.
+  FeedHeader header = 1;
+
+  // Contents of the feed.
+  repeated FeedEntity entity = 2;
+}
+
+// Metadata about a feed, included in feed messages.
+message FeedHeader {
+  // Version of the feed specification.
+  // The current version is 1.0.
+  string gtfs_version = 1;
+
+  // The feed_publisher_name field contains the full name of the organization that publishes the feed.
+  string feed_publisher_name = 2;
+
+  // The feed_publisher_url field contains the URL of the feed publishing organization's website.
+  string feed_publisher_url = 3;
+
+  // The feed_lang field contains a IETF BCP 47 language code specifying the default language used for the text in this feed.
+  string feed_lang = 4;
+
+  // 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
+  string feed_start_date = 5;
+  string feed_end_date = 6;
+
+  // The feed publisher can specify a string here that indicates the current version of their GTFS feed.
+  string feed_version = 7;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+// A definition (or update) of an entity in the transit feed.
+message FeedEntity {
+  // 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).
+  string id = 1;
+
+  // Whether this entity is to be deleted. Relevant only for incremental
+  // fetches.
+  bool is_deleted = 2;
+
+  // Data about the entity itself. Exactly one of the following fields must be
+  // present (unless the entity is being deleted).
+  oneof element {
+    Agency agency = 3;
+    Stop stop = 4;
+    Route route = 5;
+    Trip trip = 6;
+    StopTime stop_time = 7;
+    Calendar calendar = 8;
+    CalendarDate calendar_date = 9;
+    FareAttribute fare_attribute = 10;
+    FareRule fare_rule = 11;
+    Shape shape = 12;
+    Frequency frequency = 13;
+    Transfer transfer = 14;
+  }
+
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+//
+// Entities used in the feed.
+//
+
+message Agency {
+  // The agency_id field is an ID that uniquely identifies a transit agency.
+  string agency_id = 1;
+
+  // The agency_name field contains the full name of the transit agency.
+  string agency_name = 2;
+
+  // The agency_url field contains the URL of the transit agency.
+  string agency_url = 3;
+
+  // The agency_timezone field contains the timezone where the transit agency is located.
+  string agency_timezone = 4;
+
+  // The agency_lang field contains a two-letter ISO 639-1 code for the primary language used by this transit agency.
+  string agency_lang = 5;
+
+  // The agency_phone field contains a single voice telephone number for the specified agency.
+  string agency_phone = 6;
+
+  // 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.
+  string agency_fare_url = 7;
+
+  // GTFS specification in order to add and evaluate new features and
+  // modifications to the spec.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Stop {
+  // 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.
+  string stop_id = 1;
+
+  // The stop_code field contains short text or a number that uniquely identifies the stop for passengers.
+  string stop_code = 2;
+
+  // The stop_name field contains the name of a stop or station.
+  string stop_name = 3;
+
+  // The stop_desc field contains a description of a stop.
+  string stop_desc = 4;
+
+  // Degrees North, in the WGS-84 coordinate system.
+  float latitude = 5;
+
+  // Degrees East, in the WGS-84 coordinate system.
+  float longitude = 6;
+
+  string zone_id = 7;
+  string stop_url = 8;
+  enum 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.
+    STOP = 0;
+
+    // Station. A physical structure or area that contains one or more platform.
+    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.
+    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.
+    GENERIC_NODE = 3;
+
+    // Boarding Area. A specific location on a platform, where passengers can board and/or alight vehicles.
+    BOARDING_AREA = 4;
+  }
+  LocationType location_type = 9;
+
+  string parent_station = 10;
+  string agency_timezone = 11;
+
+  enum WheelchairBoarding {
+    // no accessibility information for the stop
+    UNKNOWN = 0;
+
+    // some vehicles at this stop can be boarded by a rider in a wheelchair
+    ACCESSIBLE = 1;
+
+    // wheelchair boarding is not possible at this stop
+    NOT_ACCESSIBLE = 2;
+  }
+  // The exact status of the vehicle with respect to the current stop.
+  // Ignored if current_stop_sequence is missing.
+  WheelchairBoarding wheelchair_boarding = 12;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Route {
+  // The route_id field contains an ID that uniquely identifies a route.
+  // The route_id is dataset unique.
+  string route_id = 1;
+
+  // The agency_id field defines an agency for the specified route.
+  string agency_id = 2;
+
+  // The route_short_name contains the short name of a route.
+  string route_short_name = 3;
+
+  // The route_long_name contains the full name of a route.
+  string route_long_name = 4;
+
+  // The route_desc field contains a description of a route.
+  string route_desc = 5;
+
+  // The route_type field describes the type of transportation used on a route.
+  enum RouteType {
+    // Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area.
+    TRAM = 0;
+
+    // Subway, Metro. Any underground rail system within a metropolitan area.
+    SUBWAY = 1;
+
+    // Rail. Used for intercity or long-distance travel.
+    RAIL = 2;
+
+    // Bus. Used for short- and long-distance bus routes.
+    BUS = 3;
+
+    // Ferry. Used for short- and long-distance boat service.
+    FERRY = 4;
+
+    // Cable car. Used for street-level cable cars where the cable runs beneath the car.
+    CABLECAR = 5;
+
+    // Gondola, Suspended cable car. Typically used for aerial cable cars where the car is suspended from the cable.
+    GONDOLA = 6;
+
+    // Funicular. Any rail system designed for steep inclines.
+    FUNICULAR = 7;
+  }
+  RouteType route_type = 6;
+
+  // The route_url field contains the URL of a web page about that particular route.
+  string route_url = 7;
+
+  // 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.
+  string route_color = 8;
+
+  // The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
+  string route_text_color = 9;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+
+message Trip {
+  // The route_id field contains an ID that uniquely identifies a route.
+  string route_id = 1;
+
+  // The service_id contains an ID that uniquely identifies a set of dates when service is available for one or more routes.
+  string service_id = 2;
+
+  // The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+  string trip_id = 3;
+
+  // The trip_headsign field contains the text that appears on a sign that identifies the trip's destination to passengers.
+  string trip_headsign = 4;
+
+  // The trip_short_name field contains the text that appears in schedules and sign boards to identify the trip to passengers.
+  string trip_short_name = 5;
+
+  // The direction_id field contains a binary value that indicates the direction of travel for a trip.
+  enum Direction {
+    OUTBOUND = 0;
+
+    INBOUND = 1;
+  }
+  Direction direction_id = 6;
+
+  // 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.
+  string block_id = 7;
+
+  // The shape_id field contains an ID that defines a shape for the trip.
+  string shape_id = 8;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message StopTime {
+  // The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+  string trip_id = 1;
+
+  string arrival_time = 2;
+  string departure_time = 3;
+
+  // TODO: Brian why not make this:
+  // int32 arrival_time_secs = 2;
+  // int32 departure_time_secs = 3;
+
+  string stop_id = 4;
+  string stop_sequence = 5;
+
+  string stop_headsign = 6;
+
+  enum AvailabilityType {
+    // Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area.
+    REGULAR = 0;
+
+    // Subway, Metro. Any underground rail system within a metropolitan area.
+    NOT_AVAILABLE = 1;
+
+    // Rail. Used for intercity or long-distance travel.
+    PHONE = 2;
+
+    // Bus. Used for short- and long-distance bus routes.
+    DRIVER = 3;
+  }
+  AvailabilityType pickup_type = 7;
+
+  AvailabilityType drop_off_type = 8;
+
+  float shape_dist_traveled = 9;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Calendar {
+  // The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+  string service_id = 1;
+
+  enum CalendarDay {
+    NOT_AVAILABLE = 0;
+    AVAILABLE = 1;
+  }
+  CalendarDay monday = 2;
+  CalendarDay tuesday = 3;
+  CalendarDay wednesday = 4;
+  CalendarDay thursday = 5;
+  CalendarDay friday = 6;
+  CalendarDay saturday = 7;
+  CalendarDay sunday = 8;
+
+  string start_date = 9;
+  string end_date = 10;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message CalendarDate {
+  // The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
+  string service_id = 1;
+
+  string date = 2;
+
+  enum ExceptionType {
+    UNUSED_UNKNOWN = 0;
+    ADDED = 1;
+    REMOVED = 2;
+  }
+  ExceptionType exception_type = 3;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message FareAttribute {
+  string fare_id = 1;
+  float price = 2;
+  string currency_type = 3;
+
+  enum PaymentMethod {
+    ONBOARD = 0;
+    PREBOARDING = 1;
+  }
+  PaymentMethod payment_method = 4;
+
+  enum Transfers {
+    NO = 0;
+    ONCE = 1;
+    TWICE = 2;
+    UNLIMITED = 3;
+  }
+  Transfers transfers = 5;
+
+  int32 transfer_duration = 6;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message FareRule {
+  string fare_id = 1;
+  string route_id = 2;
+  string origin_id = 3;
+  string destination_id = 4;
+  string contains_id = 5;
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Shape {
+  string shape_id = 1;
+  float shape_pt_lat = 2;
+  float shape_pt_lon = 3;
+  int32 shape_pt_sequence = 4;
+  float shape_dist_traveled = 5;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Frequency {
+  string trip_id = 1;
+  string start_time = 2;
+  string end_time = 3;
+  int32 headway_secs = 4;
+  enum ScheduleType {
+    NOT_EXACTLY = 0;
+    EXACTLY = 1;
+  }
+  ScheduleType exact_times = 5;
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}
+
+message Transfer {
+  string from_stop_id = 1;
+  string to_stop_id = 2;
+  enum TransferType {
+    RECOMMENDED = 0;
+    TIMED = 1;
+    MINIMUM = 2;
+    NOT_POSSIBLE = 3;
+  }
+  TransferType transfer_type = 3;
+
+  int32 min_transfer_time = 4;
+
+  // 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.
+  google.protobuf.Any extension = 2000;
+  reserved 1000 to 1999;
+}