From 18bcee24e93e1cf8de86fa74159501ab0047a813 Mon Sep 17 00:00:00 2001
From: lazarog98 <lazarog98@mi.fu-berlin.de>
Date: Fri, 3 Mar 2023 12:50:38 +0000
Subject: [PATCH] Resolve "Create a roadnetwork proto for roadnetwork data"

---
 .gitignore                                    |   26 +
 .vscode/settings.json                         |    3 +
 README.md                                     |   18 +-
 mapbuilder/pom.xml                            |   80 +
 mapbuilder/src/main/java/map/builder/App.java |   13 +
 .../java/map/builder/protos/Location.java     |  591 ++++++
 .../map/builder/protos/LocationOrBuilder.java |   29 +
 .../main/java/map/builder/protos/Node.java    |  909 +++++++++
 .../map/builder/protos/NodeOrBuilder.java     |   66 +
 .../java/map/builder/protos/Restriction.java  |  587 ++++++
 .../builder/protos/RestrictionOrBuilder.java  |   29 +
 .../java/map/builder/protos/RoadCategory.java |  184 ++
 .../java/map/builder/protos/RoadNetwork.java  | 1750 +++++++++++++++++
 .../builder/protos/RoadNetworkOrBuilder.java  |  141 ++
 .../map/builder/protos/RoadNetworkProto.java  |  108 +
 .../main/java/map/builder/protos/Segment.java | 1275 ++++++++++++
 .../map/builder/protos/SegmentOrBuilder.java  |  115 ++
 .../builder/protos/schema/roadnetwork.proto   |   75 +
 .../src/test/java/map/builder/AppTest.java    |   20 +
 19 files changed, 6018 insertions(+), 1 deletion(-)
 create mode 100644 .vscode/settings.json
 create mode 100644 mapbuilder/pom.xml
 create mode 100644 mapbuilder/src/main/java/map/builder/App.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/Location.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/LocationOrBuilder.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/Node.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/NodeOrBuilder.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/Restriction.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/RestrictionOrBuilder.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/RoadCategory.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/RoadNetwork.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/RoadNetworkOrBuilder.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/RoadNetworkProto.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/Segment.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/SegmentOrBuilder.java
 create mode 100644 mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
 create mode 100644 mapbuilder/src/test/java/map/builder/AppTest.java

diff --git a/.gitignore b/.gitignore
index c16d8eb..71f7833 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,29 @@
 **/.idea/
 
 **ubyte*
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+replay_pid*
+Footer
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c5f3f6b
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+    "java.configuration.updateBuildConfiguration": "interactive"
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 921d624..83b0880 100644
--- a/README.md
+++ b/README.md
@@ -8,4 +8,20 @@ Legend:
 * oval - data source
     * blue oval - data generated by us
 * rectangle - a service
-* green outline - microservice
\ No newline at end of file
+* green outline - microservice
+
+## Development 
+
+##### To generate classes from proto definition, one has to execute from the root directory
+
+First install the protobuf compiler with : 
+
+```sh
+sudo apt install protobuf-compiler
+```
+
+If you want to build the protos from source schema, you should use the command : 
+
+```sh
+protoc -I=./mapbuilder/src/main/java/map/builder/protos/ --java_out=./ ./mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+```
\ No newline at end of file
diff --git a/mapbuilder/pom.xml b/mapbuilder/pom.xml
new file mode 100644
index 0000000..eec293a
--- /dev/null
+++ b/mapbuilder/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>map.builder</groupId>
+  <artifactId>mapbuilder</artifactId>
+  <version>1.4</version>
+
+  <name>mapbuilder</name>
+  <!-- FIXME change it to the project's website -->
+  <url>http://www.example.com</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>1.7</maven.compiler.source>
+    <maven.compiler.target>1.7</maven.compiler.target>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>3.21.12</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
+      <plugins>
+        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
+        <plugin>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>3.1.0</version>
+        </plugin>
+        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>3.0.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.8.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.22.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>3.0.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.5.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.8.2</version>
+        </plugin>
+        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
+        <plugin>
+          <artifactId>maven-site-plugin</artifactId>
+          <version>3.7.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-project-info-reports-plugin</artifactId>
+          <version>3.0.0</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
diff --git a/mapbuilder/src/main/java/map/builder/App.java b/mapbuilder/src/main/java/map/builder/App.java
new file mode 100644
index 0000000..bd4567f
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/App.java
@@ -0,0 +1,13 @@
+package map.builder;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/Location.java b/mapbuilder/src/main/java/map/builder/protos/Location.java
new file mode 100644
index 0000000..3240e9c
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/Location.java
@@ -0,0 +1,591 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ * A location is geographical point. The coordinate system used is WGS 84
+ * </pre>
+ *
+ * Protobuf type {@code protos.Location}
+ */
+public final class Location extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:protos.Location)
+    LocationOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Location.newBuilder() to construct.
+  private Location(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Location() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Location();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Location(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 13: {
+
+            lat_ = input.readFloat();
+            break;
+          }
+          case 21: {
+
+            lon_ = input.readFloat();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Location_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Location_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            map.builder.protos.Location.class, map.builder.protos.Location.Builder.class);
+  }
+
+  public static final int LAT_FIELD_NUMBER = 1;
+  private float lat_;
+  /**
+   * <pre>
+   * lat corresponds to the latitude of the point
+   * </pre>
+   *
+   * <code>float lat = 1;</code>
+   * @return The lat.
+   */
+  @java.lang.Override
+  public float getLat() {
+    return lat_;
+  }
+
+  public static final int LON_FIELD_NUMBER = 2;
+  private float lon_;
+  /**
+   * <pre>
+   * lon corresponds to the longitude of the point
+   * </pre>
+   *
+   * <code>float lon = 2;</code>
+   * @return The lon.
+   */
+  @java.lang.Override
+  public float getLon() {
+    return lon_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (lat_ != 0F) {
+      output.writeFloat(1, lat_);
+    }
+    if (lon_ != 0F) {
+      output.writeFloat(2, lon_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (lat_ != 0F) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeFloatSize(1, lat_);
+    }
+    if (lon_ != 0F) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeFloatSize(2, lon_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof map.builder.protos.Location)) {
+      return super.equals(obj);
+    }
+    map.builder.protos.Location other = (map.builder.protos.Location) obj;
+
+    if (java.lang.Float.floatToIntBits(getLat())
+        != java.lang.Float.floatToIntBits(
+            other.getLat())) return false;
+    if (java.lang.Float.floatToIntBits(getLon())
+        != java.lang.Float.floatToIntBits(
+            other.getLon())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + LAT_FIELD_NUMBER;
+    hash = (53 * hash) + java.lang.Float.floatToIntBits(
+        getLat());
+    hash = (37 * hash) + LON_FIELD_NUMBER;
+    hash = (53 * hash) + java.lang.Float.floatToIntBits(
+        getLon());
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static map.builder.protos.Location parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Location parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Location parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Location parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Location parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Location parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Location parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Location parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Location parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Location parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Location parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Location parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(map.builder.protos.Location prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A location is geographical point. The coordinate system used is WGS 84
+   * </pre>
+   *
+   * Protobuf type {@code protos.Location}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:protos.Location)
+      map.builder.protos.LocationOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Location_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Location_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              map.builder.protos.Location.class, map.builder.protos.Location.Builder.class);
+    }
+
+    // Construct using map.builder.protos.Location.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      lat_ = 0F;
+
+      lon_ = 0F;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Location_descriptor;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Location getDefaultInstanceForType() {
+      return map.builder.protos.Location.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Location build() {
+      map.builder.protos.Location result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Location buildPartial() {
+      map.builder.protos.Location result = new map.builder.protos.Location(this);
+      result.lat_ = lat_;
+      result.lon_ = lon_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof map.builder.protos.Location) {
+        return mergeFrom((map.builder.protos.Location)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(map.builder.protos.Location other) {
+      if (other == map.builder.protos.Location.getDefaultInstance()) return this;
+      if (other.getLat() != 0F) {
+        setLat(other.getLat());
+      }
+      if (other.getLon() != 0F) {
+        setLon(other.getLon());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      map.builder.protos.Location parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (map.builder.protos.Location) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private float lat_ ;
+    /**
+     * <pre>
+     * lat corresponds to the latitude of the point
+     * </pre>
+     *
+     * <code>float lat = 1;</code>
+     * @return The lat.
+     */
+    @java.lang.Override
+    public float getLat() {
+      return lat_;
+    }
+    /**
+     * <pre>
+     * lat corresponds to the latitude of the point
+     * </pre>
+     *
+     * <code>float lat = 1;</code>
+     * @param value The lat to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLat(float value) {
+      
+      lat_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * lat corresponds to the latitude of the point
+     * </pre>
+     *
+     * <code>float lat = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearLat() {
+      
+      lat_ = 0F;
+      onChanged();
+      return this;
+    }
+
+    private float lon_ ;
+    /**
+     * <pre>
+     * lon corresponds to the longitude of the point
+     * </pre>
+     *
+     * <code>float lon = 2;</code>
+     * @return The lon.
+     */
+    @java.lang.Override
+    public float getLon() {
+      return lon_;
+    }
+    /**
+     * <pre>
+     * lon corresponds to the longitude of the point
+     * </pre>
+     *
+     * <code>float lon = 2;</code>
+     * @param value The lon to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLon(float value) {
+      
+      lon_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * lon corresponds to the longitude of the point
+     * </pre>
+     *
+     * <code>float lon = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearLon() {
+      
+      lon_ = 0F;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:protos.Location)
+  }
+
+  // @@protoc_insertion_point(class_scope:protos.Location)
+  private static final map.builder.protos.Location DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new map.builder.protos.Location();
+  }
+
+  public static map.builder.protos.Location getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Location>
+      PARSER = new com.google.protobuf.AbstractParser<Location>() {
+    @java.lang.Override
+    public Location parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Location(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Location> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Location> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public map.builder.protos.Location getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/LocationOrBuilder.java b/mapbuilder/src/main/java/map/builder/protos/LocationOrBuilder.java
new file mode 100644
index 0000000..fb1937f
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/LocationOrBuilder.java
@@ -0,0 +1,29 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public interface LocationOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:protos.Location)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * lat corresponds to the latitude of the point
+   * </pre>
+   *
+   * <code>float lat = 1;</code>
+   * @return The lat.
+   */
+  float getLat();
+
+  /**
+   * <pre>
+   * lon corresponds to the longitude of the point
+   * </pre>
+   *
+   * <code>float lon = 2;</code>
+   * @return The lon.
+   */
+  float getLon();
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/Node.java b/mapbuilder/src/main/java/map/builder/protos/Node.java
new file mode 100644
index 0000000..4c8905a
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/Node.java
@@ -0,0 +1,909 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ * Nodes represent usually intersections in our network.
+ * </pre>
+ *
+ * Protobuf type {@code protos.Node}
+ */
+public final class Node extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:protos.Node)
+    NodeOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Node.newBuilder() to construct.
+  private Node(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Node() {
+    osmId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Node();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Node(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            id_ = input.readUInt32();
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            osmId_ = s;
+            break;
+          }
+          case 26: {
+            map.builder.protos.Location.Builder subBuilder = null;
+            if (position_ != null) {
+              subBuilder = position_.toBuilder();
+            }
+            position_ = input.readMessage(map.builder.protos.Location.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(position_);
+              position_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Node_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Node_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            map.builder.protos.Node.class, map.builder.protos.Node.Builder.class);
+  }
+
+  public static final int ID_FIELD_NUMBER = 1;
+  private int id_;
+  /**
+   * <pre>
+   * Internally used ids of our segments
+   * </pre>
+   *
+   * <code>uint32 id = 1;</code>
+   * @return The id.
+   */
+  @java.lang.Override
+  public int getId() {
+    return id_;
+  }
+
+  public static final int OSM_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object osmId_;
+  /**
+   * <pre>
+   * Vendor IDs of OSM data, used for referencing the original data
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The osmId.
+   */
+  @java.lang.Override
+  public java.lang.String getOsmId() {
+    java.lang.Object ref = osmId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      osmId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Vendor IDs of OSM data, used for referencing the original data
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The bytes for osmId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getOsmIdBytes() {
+    java.lang.Object ref = osmId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      osmId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int POSITION_FIELD_NUMBER = 3;
+  private map.builder.protos.Location position_;
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   * @return Whether the position field is set.
+   */
+  @java.lang.Override
+  public boolean hasPosition() {
+    return position_ != null;
+  }
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   * @return The position.
+   */
+  @java.lang.Override
+  public map.builder.protos.Location getPosition() {
+    return position_ == null ? map.builder.protos.Location.getDefaultInstance() : position_;
+  }
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.LocationOrBuilder getPositionOrBuilder() {
+    return getPosition();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (id_ != 0) {
+      output.writeUInt32(1, id_);
+    }
+    if (!getOsmIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, osmId_);
+    }
+    if (position_ != null) {
+      output.writeMessage(3, getPosition());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (id_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(1, id_);
+    }
+    if (!getOsmIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, osmId_);
+    }
+    if (position_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getPosition());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof map.builder.protos.Node)) {
+      return super.equals(obj);
+    }
+    map.builder.protos.Node other = (map.builder.protos.Node) obj;
+
+    if (getId()
+        != other.getId()) return false;
+    if (!getOsmId()
+        .equals(other.getOsmId())) return false;
+    if (hasPosition() != other.hasPosition()) return false;
+    if (hasPosition()) {
+      if (!getPosition()
+          .equals(other.getPosition())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + ID_FIELD_NUMBER;
+    hash = (53 * hash) + getId();
+    hash = (37 * hash) + OSM_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getOsmId().hashCode();
+    if (hasPosition()) {
+      hash = (37 * hash) + POSITION_FIELD_NUMBER;
+      hash = (53 * hash) + getPosition().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static map.builder.protos.Node parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Node parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Node parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Node parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Node parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Node parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Node parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Node parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Node parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Node parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Node parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Node parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(map.builder.protos.Node prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Nodes represent usually intersections in our network.
+   * </pre>
+   *
+   * Protobuf type {@code protos.Node}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:protos.Node)
+      map.builder.protos.NodeOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Node_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Node_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              map.builder.protos.Node.class, map.builder.protos.Node.Builder.class);
+    }
+
+    // Construct using map.builder.protos.Node.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      id_ = 0;
+
+      osmId_ = "";
+
+      if (positionBuilder_ == null) {
+        position_ = null;
+      } else {
+        position_ = null;
+        positionBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Node_descriptor;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Node getDefaultInstanceForType() {
+      return map.builder.protos.Node.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Node build() {
+      map.builder.protos.Node result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Node buildPartial() {
+      map.builder.protos.Node result = new map.builder.protos.Node(this);
+      result.id_ = id_;
+      result.osmId_ = osmId_;
+      if (positionBuilder_ == null) {
+        result.position_ = position_;
+      } else {
+        result.position_ = positionBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof map.builder.protos.Node) {
+        return mergeFrom((map.builder.protos.Node)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(map.builder.protos.Node other) {
+      if (other == map.builder.protos.Node.getDefaultInstance()) return this;
+      if (other.getId() != 0) {
+        setId(other.getId());
+      }
+      if (!other.getOsmId().isEmpty()) {
+        osmId_ = other.osmId_;
+        onChanged();
+      }
+      if (other.hasPosition()) {
+        mergePosition(other.getPosition());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      map.builder.protos.Node parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (map.builder.protos.Node) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int id_ ;
+    /**
+     * <pre>
+     * Internally used ids of our segments
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @return The id.
+     */
+    @java.lang.Override
+    public int getId() {
+      return id_;
+    }
+    /**
+     * <pre>
+     * Internally used ids of our segments
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @param value The id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setId(int value) {
+      
+      id_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Internally used ids of our segments
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearId() {
+      
+      id_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object osmId_ = "";
+    /**
+     * <pre>
+     * Vendor IDs of OSM data, used for referencing the original data
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return The osmId.
+     */
+    public java.lang.String getOsmId() {
+      java.lang.Object ref = osmId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        osmId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Vendor IDs of OSM data, used for referencing the original data
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return The bytes for osmId.
+     */
+    public com.google.protobuf.ByteString
+        getOsmIdBytes() {
+      java.lang.Object ref = osmId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        osmId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Vendor IDs of OSM data, used for referencing the original data
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @param value The osmId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOsmId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      osmId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Vendor IDs of OSM data, used for referencing the original data
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearOsmId() {
+      
+      osmId_ = getDefaultInstance().getOsmId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Vendor IDs of OSM data, used for referencing the original data
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @param value The bytes for osmId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOsmIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      osmId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private map.builder.protos.Location position_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder> positionBuilder_;
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     * @return Whether the position field is set.
+     */
+    public boolean hasPosition() {
+      return positionBuilder_ != null || position_ != null;
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     * @return The position.
+     */
+    public map.builder.protos.Location getPosition() {
+      if (positionBuilder_ == null) {
+        return position_ == null ? map.builder.protos.Location.getDefaultInstance() : position_;
+      } else {
+        return positionBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public Builder setPosition(map.builder.protos.Location value) {
+      if (positionBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        position_ = value;
+        onChanged();
+      } else {
+        positionBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public Builder setPosition(
+        map.builder.protos.Location.Builder builderForValue) {
+      if (positionBuilder_ == null) {
+        position_ = builderForValue.build();
+        onChanged();
+      } else {
+        positionBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public Builder mergePosition(map.builder.protos.Location value) {
+      if (positionBuilder_ == null) {
+        if (position_ != null) {
+          position_ =
+            map.builder.protos.Location.newBuilder(position_).mergeFrom(value).buildPartial();
+        } else {
+          position_ = value;
+        }
+        onChanged();
+      } else {
+        positionBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public Builder clearPosition() {
+      if (positionBuilder_ == null) {
+        position_ = null;
+        onChanged();
+      } else {
+        position_ = null;
+        positionBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public map.builder.protos.Location.Builder getPositionBuilder() {
+      
+      onChanged();
+      return getPositionFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    public map.builder.protos.LocationOrBuilder getPositionOrBuilder() {
+      if (positionBuilder_ != null) {
+        return positionBuilder_.getMessageOrBuilder();
+      } else {
+        return position_ == null ?
+            map.builder.protos.Location.getDefaultInstance() : position_;
+      }
+    }
+    /**
+     * <pre>
+     * Coordinaes of the intersection
+     * </pre>
+     *
+     * <code>.protos.Location position = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder> 
+        getPositionFieldBuilder() {
+      if (positionBuilder_ == null) {
+        positionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder>(
+                getPosition(),
+                getParentForChildren(),
+                isClean());
+        position_ = null;
+      }
+      return positionBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:protos.Node)
+  }
+
+  // @@protoc_insertion_point(class_scope:protos.Node)
+  private static final map.builder.protos.Node DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new map.builder.protos.Node();
+  }
+
+  public static map.builder.protos.Node getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Node>
+      PARSER = new com.google.protobuf.AbstractParser<Node>() {
+    @java.lang.Override
+    public Node parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Node(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Node> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Node> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public map.builder.protos.Node getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/NodeOrBuilder.java b/mapbuilder/src/main/java/map/builder/protos/NodeOrBuilder.java
new file mode 100644
index 0000000..c11e825
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/NodeOrBuilder.java
@@ -0,0 +1,66 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public interface NodeOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:protos.Node)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Internally used ids of our segments
+   * </pre>
+   *
+   * <code>uint32 id = 1;</code>
+   * @return The id.
+   */
+  int getId();
+
+  /**
+   * <pre>
+   * Vendor IDs of OSM data, used for referencing the original data
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The osmId.
+   */
+  java.lang.String getOsmId();
+  /**
+   * <pre>
+   * Vendor IDs of OSM data, used for referencing the original data
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The bytes for osmId.
+   */
+  com.google.protobuf.ByteString
+      getOsmIdBytes();
+
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   * @return Whether the position field is set.
+   */
+  boolean hasPosition();
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   * @return The position.
+   */
+  map.builder.protos.Location getPosition();
+  /**
+   * <pre>
+   * Coordinaes of the intersection
+   * </pre>
+   *
+   * <code>.protos.Location position = 3;</code>
+   */
+  map.builder.protos.LocationOrBuilder getPositionOrBuilder();
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/Restriction.java b/mapbuilder/src/main/java/map/builder/protos/Restriction.java
new file mode 100644
index 0000000..1bb6b5e
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/Restriction.java
@@ -0,0 +1,587 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ * A restricted turn from one segment to another, which are adjacent to each other
+ * </pre>
+ *
+ * Protobuf type {@code protos.Restriction}
+ */
+public final class Restriction extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:protos.Restriction)
+    RestrictionOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Restriction.newBuilder() to construct.
+  private Restriction(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Restriction() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Restriction();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Restriction(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            fromId_ = input.readUInt32();
+            break;
+          }
+          case 16: {
+
+            toId_ = input.readUInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Restriction_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Restriction_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            map.builder.protos.Restriction.class, map.builder.protos.Restriction.Builder.class);
+  }
+
+  public static final int FROM_ID_FIELD_NUMBER = 1;
+  private int fromId_;
+  /**
+   * <pre>
+   * from_id is the id of the segment from which the turn originates
+   * </pre>
+   *
+   * <code>uint32 from_id = 1;</code>
+   * @return The fromId.
+   */
+  @java.lang.Override
+  public int getFromId() {
+    return fromId_;
+  }
+
+  public static final int TO_ID_FIELD_NUMBER = 2;
+  private int toId_;
+  /**
+   * <pre>
+   * to_id is the id of the segment in which the turn ends
+   * </pre>
+   *
+   * <code>uint32 to_id = 2;</code>
+   * @return The toId.
+   */
+  @java.lang.Override
+  public int getToId() {
+    return toId_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (fromId_ != 0) {
+      output.writeUInt32(1, fromId_);
+    }
+    if (toId_ != 0) {
+      output.writeUInt32(2, toId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (fromId_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(1, fromId_);
+    }
+    if (toId_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(2, toId_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof map.builder.protos.Restriction)) {
+      return super.equals(obj);
+    }
+    map.builder.protos.Restriction other = (map.builder.protos.Restriction) obj;
+
+    if (getFromId()
+        != other.getFromId()) return false;
+    if (getToId()
+        != other.getToId()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + FROM_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getFromId();
+    hash = (37 * hash) + TO_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getToId();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static map.builder.protos.Restriction parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Restriction parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Restriction parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Restriction parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Restriction parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Restriction parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(map.builder.protos.Restriction prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A restricted turn from one segment to another, which are adjacent to each other
+   * </pre>
+   *
+   * Protobuf type {@code protos.Restriction}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:protos.Restriction)
+      map.builder.protos.RestrictionOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Restriction_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Restriction_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              map.builder.protos.Restriction.class, map.builder.protos.Restriction.Builder.class);
+    }
+
+    // Construct using map.builder.protos.Restriction.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      fromId_ = 0;
+
+      toId_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Restriction_descriptor;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Restriction getDefaultInstanceForType() {
+      return map.builder.protos.Restriction.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Restriction build() {
+      map.builder.protos.Restriction result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Restriction buildPartial() {
+      map.builder.protos.Restriction result = new map.builder.protos.Restriction(this);
+      result.fromId_ = fromId_;
+      result.toId_ = toId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof map.builder.protos.Restriction) {
+        return mergeFrom((map.builder.protos.Restriction)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(map.builder.protos.Restriction other) {
+      if (other == map.builder.protos.Restriction.getDefaultInstance()) return this;
+      if (other.getFromId() != 0) {
+        setFromId(other.getFromId());
+      }
+      if (other.getToId() != 0) {
+        setToId(other.getToId());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      map.builder.protos.Restriction parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (map.builder.protos.Restriction) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int fromId_ ;
+    /**
+     * <pre>
+     * from_id is the id of the segment from which the turn originates
+     * </pre>
+     *
+     * <code>uint32 from_id = 1;</code>
+     * @return The fromId.
+     */
+    @java.lang.Override
+    public int getFromId() {
+      return fromId_;
+    }
+    /**
+     * <pre>
+     * from_id is the id of the segment from which the turn originates
+     * </pre>
+     *
+     * <code>uint32 from_id = 1;</code>
+     * @param value The fromId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setFromId(int value) {
+      
+      fromId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * from_id is the id of the segment from which the turn originates
+     * </pre>
+     *
+     * <code>uint32 from_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearFromId() {
+      
+      fromId_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int toId_ ;
+    /**
+     * <pre>
+     * to_id is the id of the segment in which the turn ends
+     * </pre>
+     *
+     * <code>uint32 to_id = 2;</code>
+     * @return The toId.
+     */
+    @java.lang.Override
+    public int getToId() {
+      return toId_;
+    }
+    /**
+     * <pre>
+     * to_id is the id of the segment in which the turn ends
+     * </pre>
+     *
+     * <code>uint32 to_id = 2;</code>
+     * @param value The toId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setToId(int value) {
+      
+      toId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * to_id is the id of the segment in which the turn ends
+     * </pre>
+     *
+     * <code>uint32 to_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearToId() {
+      
+      toId_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:protos.Restriction)
+  }
+
+  // @@protoc_insertion_point(class_scope:protos.Restriction)
+  private static final map.builder.protos.Restriction DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new map.builder.protos.Restriction();
+  }
+
+  public static map.builder.protos.Restriction getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Restriction>
+      PARSER = new com.google.protobuf.AbstractParser<Restriction>() {
+    @java.lang.Override
+    public Restriction parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Restriction(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Restriction> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Restriction> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public map.builder.protos.Restriction getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/RestrictionOrBuilder.java b/mapbuilder/src/main/java/map/builder/protos/RestrictionOrBuilder.java
new file mode 100644
index 0000000..14cb968
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/RestrictionOrBuilder.java
@@ -0,0 +1,29 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public interface RestrictionOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:protos.Restriction)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * from_id is the id of the segment from which the turn originates
+   * </pre>
+   *
+   * <code>uint32 from_id = 1;</code>
+   * @return The fromId.
+   */
+  int getFromId();
+
+  /**
+   * <pre>
+   * to_id is the id of the segment in which the turn ends
+   * </pre>
+   *
+   * <code>uint32 to_id = 2;</code>
+   * @return The toId.
+   */
+  int getToId();
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/RoadCategory.java b/mapbuilder/src/main/java/map/builder/protos/RoadCategory.java
new file mode 100644
index 0000000..1dd644f
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/RoadCategory.java
@@ -0,0 +1,184 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ * RoadCategory groups road segments into several classes
+ * </pre>
+ *
+ * Protobuf enum {@code protos.RoadCategory}
+ */
+public enum RoadCategory
+    implements com.google.protobuf.ProtocolMessageEnum {
+  /**
+   * <pre>
+   * a special value to indicate that the field is not set
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_INVALID = 0;</code>
+   */
+  ROAD_CATEGORY_INVALID(0),
+  /**
+   * <pre>
+   * represents motorway and trunks, according to the specification of OSM's data
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_HIGHWAY = 1;</code>
+   */
+  ROAD_CATEGORY_HIGHWAY(1),
+  /**
+   * <pre>
+   * often link larger towns
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_MAIN = 2;</code>
+   */
+  ROAD_CATEGORY_MAIN(2),
+  /**
+   * <pre>
+   * represents a road within a city or connecting small towns
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_LOCAL = 3;</code>
+   */
+  ROAD_CATEGORY_LOCAL(3),
+  /**
+   * <pre>
+   * represents a vehicular access to small streets connecting roads with apartments, buildings
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_RESIDENTIAL = 4;</code>
+   */
+  ROAD_CATEGORY_RESIDENTIAL(4),
+  UNRECOGNIZED(-1),
+  ;
+
+  /**
+   * <pre>
+   * a special value to indicate that the field is not set
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_INVALID = 0;</code>
+   */
+  public static final int ROAD_CATEGORY_INVALID_VALUE = 0;
+  /**
+   * <pre>
+   * represents motorway and trunks, according to the specification of OSM's data
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_HIGHWAY = 1;</code>
+   */
+  public static final int ROAD_CATEGORY_HIGHWAY_VALUE = 1;
+  /**
+   * <pre>
+   * often link larger towns
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_MAIN = 2;</code>
+   */
+  public static final int ROAD_CATEGORY_MAIN_VALUE = 2;
+  /**
+   * <pre>
+   * represents a road within a city or connecting small towns
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_LOCAL = 3;</code>
+   */
+  public static final int ROAD_CATEGORY_LOCAL_VALUE = 3;
+  /**
+   * <pre>
+   * represents a vehicular access to small streets connecting roads with apartments, buildings
+   * </pre>
+   *
+   * <code>ROAD_CATEGORY_RESIDENTIAL = 4;</code>
+   */
+  public static final int ROAD_CATEGORY_RESIDENTIAL_VALUE = 4;
+
+
+  public final int getNumber() {
+    if (this == UNRECOGNIZED) {
+      throw new java.lang.IllegalArgumentException(
+          "Can't get the number of an unknown enum value.");
+    }
+    return value;
+  }
+
+  /**
+   * @param value The numeric wire value of the corresponding enum entry.
+   * @return The enum associated with the given numeric wire value.
+   * @deprecated Use {@link #forNumber(int)} instead.
+   */
+  @java.lang.Deprecated
+  public static RoadCategory valueOf(int value) {
+    return forNumber(value);
+  }
+
+  /**
+   * @param value The numeric wire value of the corresponding enum entry.
+   * @return The enum associated with the given numeric wire value.
+   */
+  public static RoadCategory forNumber(int value) {
+    switch (value) {
+      case 0: return ROAD_CATEGORY_INVALID;
+      case 1: return ROAD_CATEGORY_HIGHWAY;
+      case 2: return ROAD_CATEGORY_MAIN;
+      case 3: return ROAD_CATEGORY_LOCAL;
+      case 4: return ROAD_CATEGORY_RESIDENTIAL;
+      default: return null;
+    }
+  }
+
+  public static com.google.protobuf.Internal.EnumLiteMap<RoadCategory>
+      internalGetValueMap() {
+    return internalValueMap;
+  }
+  private static final com.google.protobuf.Internal.EnumLiteMap<
+      RoadCategory> internalValueMap =
+        new com.google.protobuf.Internal.EnumLiteMap<RoadCategory>() {
+          public RoadCategory findValueByNumber(int number) {
+            return RoadCategory.forNumber(number);
+          }
+        };
+
+  public final com.google.protobuf.Descriptors.EnumValueDescriptor
+      getValueDescriptor() {
+    if (this == UNRECOGNIZED) {
+      throw new java.lang.IllegalStateException(
+          "Can't get the descriptor of an unrecognized enum value.");
+    }
+    return getDescriptor().getValues().get(ordinal());
+  }
+  public final com.google.protobuf.Descriptors.EnumDescriptor
+      getDescriptorForType() {
+    return getDescriptor();
+  }
+  public static final com.google.protobuf.Descriptors.EnumDescriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.getDescriptor().getEnumTypes().get(0);
+  }
+
+  private static final RoadCategory[] VALUES = values();
+
+  public static RoadCategory valueOf(
+      com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+    if (desc.getType() != getDescriptor()) {
+      throw new java.lang.IllegalArgumentException(
+        "EnumValueDescriptor is not for this type.");
+    }
+    if (desc.getIndex() == -1) {
+      return UNRECOGNIZED;
+    }
+    return VALUES[desc.getIndex()];
+  }
+
+  private final int value;
+
+  private RoadCategory(int value) {
+    this.value = value;
+  }
+
+  // @@protoc_insertion_point(enum_scope:protos.RoadCategory)
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/RoadNetwork.java b/mapbuilder/src/main/java/map/builder/protos/RoadNetwork.java
new file mode 100644
index 0000000..999496c
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/RoadNetwork.java
@@ -0,0 +1,1750 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ *Roadnetwork represents our whole roadnetwork
+ * </pre>
+ *
+ * Protobuf type {@code protos.RoadNetwork}
+ */
+public final class RoadNetwork extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:protos.RoadNetwork)
+    RoadNetworkOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use RoadNetwork.newBuilder() to construct.
+  private RoadNetwork(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private RoadNetwork() {
+    nodes_ = java.util.Collections.emptyList();
+    segments_ = java.util.Collections.emptyList();
+    turnRestrictions_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new RoadNetwork();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private RoadNetwork(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              nodes_ = new java.util.ArrayList<map.builder.protos.Node>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            nodes_.add(
+                input.readMessage(map.builder.protos.Node.parser(), extensionRegistry));
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+              segments_ = new java.util.ArrayList<map.builder.protos.Segment>();
+              mutable_bitField0_ |= 0x00000002;
+            }
+            segments_.add(
+                input.readMessage(map.builder.protos.Segment.parser(), extensionRegistry));
+            break;
+          }
+          case 26: {
+            if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+              turnRestrictions_ = new java.util.ArrayList<map.builder.protos.Restriction>();
+              mutable_bitField0_ |= 0x00000004;
+            }
+            turnRestrictions_.add(
+                input.readMessage(map.builder.protos.Restriction.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        nodes_ = java.util.Collections.unmodifiableList(nodes_);
+      }
+      if (((mutable_bitField0_ & 0x00000002) != 0)) {
+        segments_ = java.util.Collections.unmodifiableList(segments_);
+      }
+      if (((mutable_bitField0_ & 0x00000004) != 0)) {
+        turnRestrictions_ = java.util.Collections.unmodifiableList(turnRestrictions_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_RoadNetwork_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_RoadNetwork_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            map.builder.protos.RoadNetwork.class, map.builder.protos.RoadNetwork.Builder.class);
+  }
+
+  public static final int NODES_FIELD_NUMBER = 1;
+  private java.util.List<map.builder.protos.Node> nodes_;
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  @java.lang.Override
+  public java.util.List<map.builder.protos.Node> getNodesList() {
+    return nodes_;
+  }
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends map.builder.protos.NodeOrBuilder> 
+      getNodesOrBuilderList() {
+    return nodes_;
+  }
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  @java.lang.Override
+  public int getNodesCount() {
+    return nodes_.size();
+  }
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.Node getNodes(int index) {
+    return nodes_.get(index);
+  }
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.NodeOrBuilder getNodesOrBuilder(
+      int index) {
+    return nodes_.get(index);
+  }
+
+  public static final int SEGMENTS_FIELD_NUMBER = 2;
+  private java.util.List<map.builder.protos.Segment> segments_;
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<map.builder.protos.Segment> getSegmentsList() {
+    return segments_;
+  }
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends map.builder.protos.SegmentOrBuilder> 
+      getSegmentsOrBuilderList() {
+    return segments_;
+  }
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  @java.lang.Override
+  public int getSegmentsCount() {
+    return segments_.size();
+  }
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.Segment getSegments(int index) {
+    return segments_.get(index);
+  }
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.SegmentOrBuilder getSegmentsOrBuilder(
+      int index) {
+    return segments_.get(index);
+  }
+
+  public static final int TURN_RESTRICTIONS_FIELD_NUMBER = 3;
+  private java.util.List<map.builder.protos.Restriction> turnRestrictions_;
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<map.builder.protos.Restriction> getTurnRestrictionsList() {
+    return turnRestrictions_;
+  }
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends map.builder.protos.RestrictionOrBuilder> 
+      getTurnRestrictionsOrBuilderList() {
+    return turnRestrictions_;
+  }
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  @java.lang.Override
+  public int getTurnRestrictionsCount() {
+    return turnRestrictions_.size();
+  }
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.Restriction getTurnRestrictions(int index) {
+    return turnRestrictions_.get(index);
+  }
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.RestrictionOrBuilder getTurnRestrictionsOrBuilder(
+      int index) {
+    return turnRestrictions_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    for (int i = 0; i < nodes_.size(); i++) {
+      output.writeMessage(1, nodes_.get(i));
+    }
+    for (int i = 0; i < segments_.size(); i++) {
+      output.writeMessage(2, segments_.get(i));
+    }
+    for (int i = 0; i < turnRestrictions_.size(); i++) {
+      output.writeMessage(3, turnRestrictions_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    for (int i = 0; i < nodes_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, nodes_.get(i));
+    }
+    for (int i = 0; i < segments_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, segments_.get(i));
+    }
+    for (int i = 0; i < turnRestrictions_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, turnRestrictions_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof map.builder.protos.RoadNetwork)) {
+      return super.equals(obj);
+    }
+    map.builder.protos.RoadNetwork other = (map.builder.protos.RoadNetwork) obj;
+
+    if (!getNodesList()
+        .equals(other.getNodesList())) return false;
+    if (!getSegmentsList()
+        .equals(other.getSegmentsList())) return false;
+    if (!getTurnRestrictionsList()
+        .equals(other.getTurnRestrictionsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getNodesCount() > 0) {
+      hash = (37 * hash) + NODES_FIELD_NUMBER;
+      hash = (53 * hash) + getNodesList().hashCode();
+    }
+    if (getSegmentsCount() > 0) {
+      hash = (37 * hash) + SEGMENTS_FIELD_NUMBER;
+      hash = (53 * hash) + getSegmentsList().hashCode();
+    }
+    if (getTurnRestrictionsCount() > 0) {
+      hash = (37 * hash) + TURN_RESTRICTIONS_FIELD_NUMBER;
+      hash = (53 * hash) + getTurnRestrictionsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static map.builder.protos.RoadNetwork parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.RoadNetwork parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.RoadNetwork parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.RoadNetwork parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(map.builder.protos.RoadNetwork prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   *Roadnetwork represents our whole roadnetwork
+   * </pre>
+   *
+   * Protobuf type {@code protos.RoadNetwork}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:protos.RoadNetwork)
+      map.builder.protos.RoadNetworkOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_RoadNetwork_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_RoadNetwork_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              map.builder.protos.RoadNetwork.class, map.builder.protos.RoadNetwork.Builder.class);
+    }
+
+    // Construct using map.builder.protos.RoadNetwork.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getNodesFieldBuilder();
+        getSegmentsFieldBuilder();
+        getTurnRestrictionsFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (nodesBuilder_ == null) {
+        nodes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        nodesBuilder_.clear();
+      }
+      if (segmentsBuilder_ == null) {
+        segments_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+      } else {
+        segmentsBuilder_.clear();
+      }
+      if (turnRestrictionsBuilder_ == null) {
+        turnRestrictions_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000004);
+      } else {
+        turnRestrictionsBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_RoadNetwork_descriptor;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.RoadNetwork getDefaultInstanceForType() {
+      return map.builder.protos.RoadNetwork.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public map.builder.protos.RoadNetwork build() {
+      map.builder.protos.RoadNetwork result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.RoadNetwork buildPartial() {
+      map.builder.protos.RoadNetwork result = new map.builder.protos.RoadNetwork(this);
+      int from_bitField0_ = bitField0_;
+      if (nodesBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          nodes_ = java.util.Collections.unmodifiableList(nodes_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.nodes_ = nodes_;
+      } else {
+        result.nodes_ = nodesBuilder_.build();
+      }
+      if (segmentsBuilder_ == null) {
+        if (((bitField0_ & 0x00000002) != 0)) {
+          segments_ = java.util.Collections.unmodifiableList(segments_);
+          bitField0_ = (bitField0_ & ~0x00000002);
+        }
+        result.segments_ = segments_;
+      } else {
+        result.segments_ = segmentsBuilder_.build();
+      }
+      if (turnRestrictionsBuilder_ == null) {
+        if (((bitField0_ & 0x00000004) != 0)) {
+          turnRestrictions_ = java.util.Collections.unmodifiableList(turnRestrictions_);
+          bitField0_ = (bitField0_ & ~0x00000004);
+        }
+        result.turnRestrictions_ = turnRestrictions_;
+      } else {
+        result.turnRestrictions_ = turnRestrictionsBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof map.builder.protos.RoadNetwork) {
+        return mergeFrom((map.builder.protos.RoadNetwork)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(map.builder.protos.RoadNetwork other) {
+      if (other == map.builder.protos.RoadNetwork.getDefaultInstance()) return this;
+      if (nodesBuilder_ == null) {
+        if (!other.nodes_.isEmpty()) {
+          if (nodes_.isEmpty()) {
+            nodes_ = other.nodes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureNodesIsMutable();
+            nodes_.addAll(other.nodes_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.nodes_.isEmpty()) {
+          if (nodesBuilder_.isEmpty()) {
+            nodesBuilder_.dispose();
+            nodesBuilder_ = null;
+            nodes_ = other.nodes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            nodesBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getNodesFieldBuilder() : null;
+          } else {
+            nodesBuilder_.addAllMessages(other.nodes_);
+          }
+        }
+      }
+      if (segmentsBuilder_ == null) {
+        if (!other.segments_.isEmpty()) {
+          if (segments_.isEmpty()) {
+            segments_ = other.segments_;
+            bitField0_ = (bitField0_ & ~0x00000002);
+          } else {
+            ensureSegmentsIsMutable();
+            segments_.addAll(other.segments_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.segments_.isEmpty()) {
+          if (segmentsBuilder_.isEmpty()) {
+            segmentsBuilder_.dispose();
+            segmentsBuilder_ = null;
+            segments_ = other.segments_;
+            bitField0_ = (bitField0_ & ~0x00000002);
+            segmentsBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getSegmentsFieldBuilder() : null;
+          } else {
+            segmentsBuilder_.addAllMessages(other.segments_);
+          }
+        }
+      }
+      if (turnRestrictionsBuilder_ == null) {
+        if (!other.turnRestrictions_.isEmpty()) {
+          if (turnRestrictions_.isEmpty()) {
+            turnRestrictions_ = other.turnRestrictions_;
+            bitField0_ = (bitField0_ & ~0x00000004);
+          } else {
+            ensureTurnRestrictionsIsMutable();
+            turnRestrictions_.addAll(other.turnRestrictions_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.turnRestrictions_.isEmpty()) {
+          if (turnRestrictionsBuilder_.isEmpty()) {
+            turnRestrictionsBuilder_.dispose();
+            turnRestrictionsBuilder_ = null;
+            turnRestrictions_ = other.turnRestrictions_;
+            bitField0_ = (bitField0_ & ~0x00000004);
+            turnRestrictionsBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getTurnRestrictionsFieldBuilder() : null;
+          } else {
+            turnRestrictionsBuilder_.addAllMessages(other.turnRestrictions_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      map.builder.protos.RoadNetwork parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (map.builder.protos.RoadNetwork) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private java.util.List<map.builder.protos.Node> nodes_ =
+      java.util.Collections.emptyList();
+    private void ensureNodesIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        nodes_ = new java.util.ArrayList<map.builder.protos.Node>(nodes_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Node, map.builder.protos.Node.Builder, map.builder.protos.NodeOrBuilder> nodesBuilder_;
+
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public java.util.List<map.builder.protos.Node> getNodesList() {
+      if (nodesBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(nodes_);
+      } else {
+        return nodesBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public int getNodesCount() {
+      if (nodesBuilder_ == null) {
+        return nodes_.size();
+      } else {
+        return nodesBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public map.builder.protos.Node getNodes(int index) {
+      if (nodesBuilder_ == null) {
+        return nodes_.get(index);
+      } else {
+        return nodesBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder setNodes(
+        int index, map.builder.protos.Node value) {
+      if (nodesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodesIsMutable();
+        nodes_.set(index, value);
+        onChanged();
+      } else {
+        nodesBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder setNodes(
+        int index, map.builder.protos.Node.Builder builderForValue) {
+      if (nodesBuilder_ == null) {
+        ensureNodesIsMutable();
+        nodes_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodesBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder addNodes(map.builder.protos.Node value) {
+      if (nodesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodesIsMutable();
+        nodes_.add(value);
+        onChanged();
+      } else {
+        nodesBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder addNodes(
+        int index, map.builder.protos.Node value) {
+      if (nodesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodesIsMutable();
+        nodes_.add(index, value);
+        onChanged();
+      } else {
+        nodesBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder addNodes(
+        map.builder.protos.Node.Builder builderForValue) {
+      if (nodesBuilder_ == null) {
+        ensureNodesIsMutable();
+        nodes_.add(builderForValue.build());
+        onChanged();
+      } else {
+        nodesBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder addNodes(
+        int index, map.builder.protos.Node.Builder builderForValue) {
+      if (nodesBuilder_ == null) {
+        ensureNodesIsMutable();
+        nodes_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodesBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder addAllNodes(
+        java.lang.Iterable<? extends map.builder.protos.Node> values) {
+      if (nodesBuilder_ == null) {
+        ensureNodesIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, nodes_);
+        onChanged();
+      } else {
+        nodesBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder clearNodes() {
+      if (nodesBuilder_ == null) {
+        nodes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        nodesBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public Builder removeNodes(int index) {
+      if (nodesBuilder_ == null) {
+        ensureNodesIsMutable();
+        nodes_.remove(index);
+        onChanged();
+      } else {
+        nodesBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public map.builder.protos.Node.Builder getNodesBuilder(
+        int index) {
+      return getNodesFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public map.builder.protos.NodeOrBuilder getNodesOrBuilder(
+        int index) {
+      if (nodesBuilder_ == null) {
+        return nodes_.get(index);  } else {
+        return nodesBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public java.util.List<? extends map.builder.protos.NodeOrBuilder> 
+         getNodesOrBuilderList() {
+      if (nodesBuilder_ != null) {
+        return nodesBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(nodes_);
+      }
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public map.builder.protos.Node.Builder addNodesBuilder() {
+      return getNodesFieldBuilder().addBuilder(
+          map.builder.protos.Node.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public map.builder.protos.Node.Builder addNodesBuilder(
+        int index) {
+      return getNodesFieldBuilder().addBuilder(
+          index, map.builder.protos.Node.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Nodes are corresponding to intersections
+     * </pre>
+     *
+     * <code>repeated .protos.Node nodes = 1;</code>
+     */
+    public java.util.List<map.builder.protos.Node.Builder> 
+         getNodesBuilderList() {
+      return getNodesFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Node, map.builder.protos.Node.Builder, map.builder.protos.NodeOrBuilder> 
+        getNodesFieldBuilder() {
+      if (nodesBuilder_ == null) {
+        nodesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            map.builder.protos.Node, map.builder.protos.Node.Builder, map.builder.protos.NodeOrBuilder>(
+                nodes_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        nodes_ = null;
+      }
+      return nodesBuilder_;
+    }
+
+    private java.util.List<map.builder.protos.Segment> segments_ =
+      java.util.Collections.emptyList();
+    private void ensureSegmentsIsMutable() {
+      if (!((bitField0_ & 0x00000002) != 0)) {
+        segments_ = new java.util.ArrayList<map.builder.protos.Segment>(segments_);
+        bitField0_ |= 0x00000002;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Segment, map.builder.protos.Segment.Builder, map.builder.protos.SegmentOrBuilder> segmentsBuilder_;
+
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public java.util.List<map.builder.protos.Segment> getSegmentsList() {
+      if (segmentsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(segments_);
+      } else {
+        return segmentsBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public int getSegmentsCount() {
+      if (segmentsBuilder_ == null) {
+        return segments_.size();
+      } else {
+        return segmentsBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public map.builder.protos.Segment getSegments(int index) {
+      if (segmentsBuilder_ == null) {
+        return segments_.get(index);
+      } else {
+        return segmentsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder setSegments(
+        int index, map.builder.protos.Segment value) {
+      if (segmentsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSegmentsIsMutable();
+        segments_.set(index, value);
+        onChanged();
+      } else {
+        segmentsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder setSegments(
+        int index, map.builder.protos.Segment.Builder builderForValue) {
+      if (segmentsBuilder_ == null) {
+        ensureSegmentsIsMutable();
+        segments_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        segmentsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder addSegments(map.builder.protos.Segment value) {
+      if (segmentsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSegmentsIsMutable();
+        segments_.add(value);
+        onChanged();
+      } else {
+        segmentsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder addSegments(
+        int index, map.builder.protos.Segment value) {
+      if (segmentsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSegmentsIsMutable();
+        segments_.add(index, value);
+        onChanged();
+      } else {
+        segmentsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder addSegments(
+        map.builder.protos.Segment.Builder builderForValue) {
+      if (segmentsBuilder_ == null) {
+        ensureSegmentsIsMutable();
+        segments_.add(builderForValue.build());
+        onChanged();
+      } else {
+        segmentsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder addSegments(
+        int index, map.builder.protos.Segment.Builder builderForValue) {
+      if (segmentsBuilder_ == null) {
+        ensureSegmentsIsMutable();
+        segments_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        segmentsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder addAllSegments(
+        java.lang.Iterable<? extends map.builder.protos.Segment> values) {
+      if (segmentsBuilder_ == null) {
+        ensureSegmentsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, segments_);
+        onChanged();
+      } else {
+        segmentsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder clearSegments() {
+      if (segmentsBuilder_ == null) {
+        segments_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+      } else {
+        segmentsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public Builder removeSegments(int index) {
+      if (segmentsBuilder_ == null) {
+        ensureSegmentsIsMutable();
+        segments_.remove(index);
+        onChanged();
+      } else {
+        segmentsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public map.builder.protos.Segment.Builder getSegmentsBuilder(
+        int index) {
+      return getSegmentsFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public map.builder.protos.SegmentOrBuilder getSegmentsOrBuilder(
+        int index) {
+      if (segmentsBuilder_ == null) {
+        return segments_.get(index);  } else {
+        return segmentsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public java.util.List<? extends map.builder.protos.SegmentOrBuilder> 
+         getSegmentsOrBuilderList() {
+      if (segmentsBuilder_ != null) {
+        return segmentsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(segments_);
+      }
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public map.builder.protos.Segment.Builder addSegmentsBuilder() {
+      return getSegmentsFieldBuilder().addBuilder(
+          map.builder.protos.Segment.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public map.builder.protos.Segment.Builder addSegmentsBuilder(
+        int index) {
+      return getSegmentsFieldBuilder().addBuilder(
+          index, map.builder.protos.Segment.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Segments correspond to edges in our graph
+     * </pre>
+     *
+     * <code>repeated .protos.Segment segments = 2;</code>
+     */
+    public java.util.List<map.builder.protos.Segment.Builder> 
+         getSegmentsBuilderList() {
+      return getSegmentsFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Segment, map.builder.protos.Segment.Builder, map.builder.protos.SegmentOrBuilder> 
+        getSegmentsFieldBuilder() {
+      if (segmentsBuilder_ == null) {
+        segmentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            map.builder.protos.Segment, map.builder.protos.Segment.Builder, map.builder.protos.SegmentOrBuilder>(
+                segments_,
+                ((bitField0_ & 0x00000002) != 0),
+                getParentForChildren(),
+                isClean());
+        segments_ = null;
+      }
+      return segmentsBuilder_;
+    }
+
+    private java.util.List<map.builder.protos.Restriction> turnRestrictions_ =
+      java.util.Collections.emptyList();
+    private void ensureTurnRestrictionsIsMutable() {
+      if (!((bitField0_ & 0x00000004) != 0)) {
+        turnRestrictions_ = new java.util.ArrayList<map.builder.protos.Restriction>(turnRestrictions_);
+        bitField0_ |= 0x00000004;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Restriction, map.builder.protos.Restriction.Builder, map.builder.protos.RestrictionOrBuilder> turnRestrictionsBuilder_;
+
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public java.util.List<map.builder.protos.Restriction> getTurnRestrictionsList() {
+      if (turnRestrictionsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(turnRestrictions_);
+      } else {
+        return turnRestrictionsBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public int getTurnRestrictionsCount() {
+      if (turnRestrictionsBuilder_ == null) {
+        return turnRestrictions_.size();
+      } else {
+        return turnRestrictionsBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public map.builder.protos.Restriction getTurnRestrictions(int index) {
+      if (turnRestrictionsBuilder_ == null) {
+        return turnRestrictions_.get(index);
+      } else {
+        return turnRestrictionsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder setTurnRestrictions(
+        int index, map.builder.protos.Restriction value) {
+      if (turnRestrictionsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.set(index, value);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder setTurnRestrictions(
+        int index, map.builder.protos.Restriction.Builder builderForValue) {
+      if (turnRestrictionsBuilder_ == null) {
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder addTurnRestrictions(map.builder.protos.Restriction value) {
+      if (turnRestrictionsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.add(value);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder addTurnRestrictions(
+        int index, map.builder.protos.Restriction value) {
+      if (turnRestrictionsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.add(index, value);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder addTurnRestrictions(
+        map.builder.protos.Restriction.Builder builderForValue) {
+      if (turnRestrictionsBuilder_ == null) {
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.add(builderForValue.build());
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder addTurnRestrictions(
+        int index, map.builder.protos.Restriction.Builder builderForValue) {
+      if (turnRestrictionsBuilder_ == null) {
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder addAllTurnRestrictions(
+        java.lang.Iterable<? extends map.builder.protos.Restriction> values) {
+      if (turnRestrictionsBuilder_ == null) {
+        ensureTurnRestrictionsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, turnRestrictions_);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder clearTurnRestrictions() {
+      if (turnRestrictionsBuilder_ == null) {
+        turnRestrictions_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public Builder removeTurnRestrictions(int index) {
+      if (turnRestrictionsBuilder_ == null) {
+        ensureTurnRestrictionsIsMutable();
+        turnRestrictions_.remove(index);
+        onChanged();
+      } else {
+        turnRestrictionsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public map.builder.protos.Restriction.Builder getTurnRestrictionsBuilder(
+        int index) {
+      return getTurnRestrictionsFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public map.builder.protos.RestrictionOrBuilder getTurnRestrictionsOrBuilder(
+        int index) {
+      if (turnRestrictionsBuilder_ == null) {
+        return turnRestrictions_.get(index);  } else {
+        return turnRestrictionsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public java.util.List<? extends map.builder.protos.RestrictionOrBuilder> 
+         getTurnRestrictionsOrBuilderList() {
+      if (turnRestrictionsBuilder_ != null) {
+        return turnRestrictionsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(turnRestrictions_);
+      }
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public map.builder.protos.Restriction.Builder addTurnRestrictionsBuilder() {
+      return getTurnRestrictionsFieldBuilder().addBuilder(
+          map.builder.protos.Restriction.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public map.builder.protos.Restriction.Builder addTurnRestrictionsBuilder(
+        int index) {
+      return getTurnRestrictionsFieldBuilder().addBuilder(
+          index, map.builder.protos.Restriction.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * Turn restrictitons correspond to turn restrictions
+     * </pre>
+     *
+     * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+     */
+    public java.util.List<map.builder.protos.Restriction.Builder> 
+         getTurnRestrictionsBuilderList() {
+      return getTurnRestrictionsFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        map.builder.protos.Restriction, map.builder.protos.Restriction.Builder, map.builder.protos.RestrictionOrBuilder> 
+        getTurnRestrictionsFieldBuilder() {
+      if (turnRestrictionsBuilder_ == null) {
+        turnRestrictionsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            map.builder.protos.Restriction, map.builder.protos.Restriction.Builder, map.builder.protos.RestrictionOrBuilder>(
+                turnRestrictions_,
+                ((bitField0_ & 0x00000004) != 0),
+                getParentForChildren(),
+                isClean());
+        turnRestrictions_ = null;
+      }
+      return turnRestrictionsBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:protos.RoadNetwork)
+  }
+
+  // @@protoc_insertion_point(class_scope:protos.RoadNetwork)
+  private static final map.builder.protos.RoadNetwork DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new map.builder.protos.RoadNetwork();
+  }
+
+  public static map.builder.protos.RoadNetwork getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<RoadNetwork>
+      PARSER = new com.google.protobuf.AbstractParser<RoadNetwork>() {
+    @java.lang.Override
+    public RoadNetwork parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new RoadNetwork(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<RoadNetwork> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<RoadNetwork> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public map.builder.protos.RoadNetwork getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/RoadNetworkOrBuilder.java b/mapbuilder/src/main/java/map/builder/protos/RoadNetworkOrBuilder.java
new file mode 100644
index 0000000..8d2f4ad
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/RoadNetworkOrBuilder.java
@@ -0,0 +1,141 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public interface RoadNetworkOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:protos.RoadNetwork)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  java.util.List<map.builder.protos.Node> 
+      getNodesList();
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  map.builder.protos.Node getNodes(int index);
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  int getNodesCount();
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  java.util.List<? extends map.builder.protos.NodeOrBuilder> 
+      getNodesOrBuilderList();
+  /**
+   * <pre>
+   * Nodes are corresponding to intersections
+   * </pre>
+   *
+   * <code>repeated .protos.Node nodes = 1;</code>
+   */
+  map.builder.protos.NodeOrBuilder getNodesOrBuilder(
+      int index);
+
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  java.util.List<map.builder.protos.Segment> 
+      getSegmentsList();
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  map.builder.protos.Segment getSegments(int index);
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  int getSegmentsCount();
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  java.util.List<? extends map.builder.protos.SegmentOrBuilder> 
+      getSegmentsOrBuilderList();
+  /**
+   * <pre>
+   * Segments correspond to edges in our graph
+   * </pre>
+   *
+   * <code>repeated .protos.Segment segments = 2;</code>
+   */
+  map.builder.protos.SegmentOrBuilder getSegmentsOrBuilder(
+      int index);
+
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  java.util.List<map.builder.protos.Restriction> 
+      getTurnRestrictionsList();
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  map.builder.protos.Restriction getTurnRestrictions(int index);
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  int getTurnRestrictionsCount();
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  java.util.List<? extends map.builder.protos.RestrictionOrBuilder> 
+      getTurnRestrictionsOrBuilderList();
+  /**
+   * <pre>
+   * Turn restrictitons correspond to turn restrictions
+   * </pre>
+   *
+   * <code>repeated .protos.Restriction turn_restrictions = 3;</code>
+   */
+  map.builder.protos.RestrictionOrBuilder getTurnRestrictionsOrBuilder(
+      int index);
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/RoadNetworkProto.java b/mapbuilder/src/main/java/map/builder/protos/RoadNetworkProto.java
new file mode 100644
index 0000000..d0594dd
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/RoadNetworkProto.java
@@ -0,0 +1,108 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public final class RoadNetworkProto {
+  private RoadNetworkProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_protos_RoadNetwork_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_protos_RoadNetwork_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_protos_Node_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_protos_Node_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_protos_Segment_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_protos_Segment_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_protos_Restriction_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_protos_Restriction_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_protos_Location_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_protos_Location_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\nDmapbuilder/src/main/java/map/builder/p" +
+      "rotos/schema/roadnetwork.proto\022\006protos\"}" +
+      "\n\013RoadNetwork\022\033\n\005nodes\030\001 \003(\0132\014.protos.No" +
+      "de\022!\n\010segments\030\002 \003(\0132\017.protos.Segment\022.\n" +
+      "\021turn_restrictions\030\003 \003(\0132\023.protos.Restri" +
+      "ction\"F\n\004Node\022\n\n\002id\030\001 \001(\r\022\016\n\006osm_id\030\002 \001(" +
+      "\t\022\"\n\010position\030\003 \001(\0132\020.protos.Location\"\247\001" +
+      "\n\007Segment\022\n\n\002id\030\001 \001(\r\022\016\n\006osm_id\030\002 \001(\t\022\"\n" +
+      "\010geometry\030\003 \001(\0132\020.protos.Location\022\016\n\006len" +
+      "gth\030\004 \001(\001\022\022\n\nstart_node\030\005 \001(\r\022\020\n\010end_nod" +
+      "e\030\006 \001(\r\022&\n\010category\030\007 \001(\0162\024.protos.RoadC" +
+      "ategory\"-\n\013Restriction\022\017\n\007from_id\030\001 \001(\r\022" +
+      "\r\n\005to_id\030\002 \001(\r\"$\n\010Location\022\013\n\003lat\030\001 \001(\002\022" +
+      "\013\n\003lon\030\002 \001(\002*\224\001\n\014RoadCategory\022\031\n\025ROAD_CA" +
+      "TEGORY_INVALID\020\000\022\031\n\025ROAD_CATEGORY_HIGHWA" +
+      "Y\020\001\022\026\n\022ROAD_CATEGORY_MAIN\020\002\022\027\n\023ROAD_CATE" +
+      "GORY_LOCAL\020\003\022\035\n\031ROAD_CATEGORY_RESIDENTIA" +
+      "L\020\004B(\n\022map.builder.protosB\020RoadNetworkPr" +
+      "otoP\001b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_protos_RoadNetwork_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_protos_RoadNetwork_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_protos_RoadNetwork_descriptor,
+        new java.lang.String[] { "Nodes", "Segments", "TurnRestrictions", });
+    internal_static_protos_Node_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_protos_Node_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_protos_Node_descriptor,
+        new java.lang.String[] { "Id", "OsmId", "Position", });
+    internal_static_protos_Segment_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_protos_Segment_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_protos_Segment_descriptor,
+        new java.lang.String[] { "Id", "OsmId", "Geometry", "Length", "StartNode", "EndNode", "Category", });
+    internal_static_protos_Restriction_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_protos_Restriction_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_protos_Restriction_descriptor,
+        new java.lang.String[] { "FromId", "ToId", });
+    internal_static_protos_Location_descriptor =
+      getDescriptor().getMessageTypes().get(4);
+    internal_static_protos_Location_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_protos_Location_descriptor,
+        new java.lang.String[] { "Lat", "Lon", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/Segment.java b/mapbuilder/src/main/java/map/builder/protos/Segment.java
new file mode 100644
index 0000000..95f27b0
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/Segment.java
@@ -0,0 +1,1275 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+/**
+ * <pre>
+ * Segment represents a directed edge in our network, which connects two nodes
+ * </pre>
+ *
+ * Protobuf type {@code protos.Segment}
+ */
+public final class Segment extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:protos.Segment)
+    SegmentOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Segment.newBuilder() to construct.
+  private Segment(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Segment() {
+    osmId_ = "";
+    category_ = 0;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Segment();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Segment(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            id_ = input.readUInt32();
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            osmId_ = s;
+            break;
+          }
+          case 26: {
+            map.builder.protos.Location.Builder subBuilder = null;
+            if (geometry_ != null) {
+              subBuilder = geometry_.toBuilder();
+            }
+            geometry_ = input.readMessage(map.builder.protos.Location.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(geometry_);
+              geometry_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 33: {
+
+            length_ = input.readDouble();
+            break;
+          }
+          case 40: {
+
+            startNode_ = input.readUInt32();
+            break;
+          }
+          case 48: {
+
+            endNode_ = input.readUInt32();
+            break;
+          }
+          case 56: {
+            int rawValue = input.readEnum();
+
+            category_ = rawValue;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Segment_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return map.builder.protos.RoadNetworkProto.internal_static_protos_Segment_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            map.builder.protos.Segment.class, map.builder.protos.Segment.Builder.class);
+  }
+
+  public static final int ID_FIELD_NUMBER = 1;
+  private int id_;
+  /**
+   * <pre>
+   * id is the internal id used in our system of a segment
+   * </pre>
+   *
+   * <code>uint32 id = 1;</code>
+   * @return The id.
+   */
+  @java.lang.Override
+  public int getId() {
+    return id_;
+  }
+
+  public static final int OSM_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object osmId_;
+  /**
+   * <pre>
+   * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The osmId.
+   */
+  @java.lang.Override
+  public java.lang.String getOsmId() {
+    java.lang.Object ref = osmId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      osmId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The bytes for osmId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getOsmIdBytes() {
+    java.lang.Object ref = osmId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      osmId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int GEOMETRY_FIELD_NUMBER = 3;
+  private map.builder.protos.Location geometry_;
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   * @return Whether the geometry field is set.
+   */
+  @java.lang.Override
+  public boolean hasGeometry() {
+    return geometry_ != null;
+  }
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   * @return The geometry.
+   */
+  @java.lang.Override
+  public map.builder.protos.Location getGeometry() {
+    return geometry_ == null ? map.builder.protos.Location.getDefaultInstance() : geometry_;
+  }
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   */
+  @java.lang.Override
+  public map.builder.protos.LocationOrBuilder getGeometryOrBuilder() {
+    return getGeometry();
+  }
+
+  public static final int LENGTH_FIELD_NUMBER = 4;
+  private double length_;
+  /**
+   * <pre>
+   * length of the segment in meters
+   * </pre>
+   *
+   * <code>double length = 4;</code>
+   * @return The length.
+   */
+  @java.lang.Override
+  public double getLength() {
+    return length_;
+  }
+
+  public static final int START_NODE_FIELD_NUMBER = 5;
+  private int startNode_;
+  /**
+   * <pre>
+   * start_node is the start endpoint of the segment
+   * </pre>
+   *
+   * <code>uint32 start_node = 5;</code>
+   * @return The startNode.
+   */
+  @java.lang.Override
+  public int getStartNode() {
+    return startNode_;
+  }
+
+  public static final int END_NODE_FIELD_NUMBER = 6;
+  private int endNode_;
+  /**
+   * <pre>
+   * end_node is the end endpoint of the segment
+   * </pre>
+   *
+   * <code>uint32 end_node = 6;</code>
+   * @return The endNode.
+   */
+  @java.lang.Override
+  public int getEndNode() {
+    return endNode_;
+  }
+
+  public static final int CATEGORY_FIELD_NUMBER = 7;
+  private int category_;
+  /**
+   * <pre>
+   * category of the road according to OSM main road types
+   * </pre>
+   *
+   * <code>.protos.RoadCategory category = 7;</code>
+   * @return The enum numeric value on the wire for category.
+   */
+  @java.lang.Override public int getCategoryValue() {
+    return category_;
+  }
+  /**
+   * <pre>
+   * category of the road according to OSM main road types
+   * </pre>
+   *
+   * <code>.protos.RoadCategory category = 7;</code>
+   * @return The category.
+   */
+  @java.lang.Override public map.builder.protos.RoadCategory getCategory() {
+    @SuppressWarnings("deprecation")
+    map.builder.protos.RoadCategory result = map.builder.protos.RoadCategory.valueOf(category_);
+    return result == null ? map.builder.protos.RoadCategory.UNRECOGNIZED : result;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (id_ != 0) {
+      output.writeUInt32(1, id_);
+    }
+    if (!getOsmIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, osmId_);
+    }
+    if (geometry_ != null) {
+      output.writeMessage(3, getGeometry());
+    }
+    if (length_ != 0D) {
+      output.writeDouble(4, length_);
+    }
+    if (startNode_ != 0) {
+      output.writeUInt32(5, startNode_);
+    }
+    if (endNode_ != 0) {
+      output.writeUInt32(6, endNode_);
+    }
+    if (category_ != map.builder.protos.RoadCategory.ROAD_CATEGORY_INVALID.getNumber()) {
+      output.writeEnum(7, category_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (id_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(1, id_);
+    }
+    if (!getOsmIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, osmId_);
+    }
+    if (geometry_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getGeometry());
+    }
+    if (length_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(4, length_);
+    }
+    if (startNode_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(5, startNode_);
+    }
+    if (endNode_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(6, endNode_);
+    }
+    if (category_ != map.builder.protos.RoadCategory.ROAD_CATEGORY_INVALID.getNumber()) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeEnumSize(7, category_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof map.builder.protos.Segment)) {
+      return super.equals(obj);
+    }
+    map.builder.protos.Segment other = (map.builder.protos.Segment) obj;
+
+    if (getId()
+        != other.getId()) return false;
+    if (!getOsmId()
+        .equals(other.getOsmId())) return false;
+    if (hasGeometry() != other.hasGeometry()) return false;
+    if (hasGeometry()) {
+      if (!getGeometry()
+          .equals(other.getGeometry())) return false;
+    }
+    if (java.lang.Double.doubleToLongBits(getLength())
+        != java.lang.Double.doubleToLongBits(
+            other.getLength())) return false;
+    if (getStartNode()
+        != other.getStartNode()) return false;
+    if (getEndNode()
+        != other.getEndNode()) return false;
+    if (category_ != other.category_) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + ID_FIELD_NUMBER;
+    hash = (53 * hash) + getId();
+    hash = (37 * hash) + OSM_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getOsmId().hashCode();
+    if (hasGeometry()) {
+      hash = (37 * hash) + GEOMETRY_FIELD_NUMBER;
+      hash = (53 * hash) + getGeometry().hashCode();
+    }
+    hash = (37 * hash) + LENGTH_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getLength()));
+    hash = (37 * hash) + START_NODE_FIELD_NUMBER;
+    hash = (53 * hash) + getStartNode();
+    hash = (37 * hash) + END_NODE_FIELD_NUMBER;
+    hash = (53 * hash) + getEndNode();
+    hash = (37 * hash) + CATEGORY_FIELD_NUMBER;
+    hash = (53 * hash) + category_;
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static map.builder.protos.Segment parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Segment parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static map.builder.protos.Segment parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Segment parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Segment parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static map.builder.protos.Segment parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(map.builder.protos.Segment prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Segment represents a directed edge in our network, which connects two nodes
+   * </pre>
+   *
+   * Protobuf type {@code protos.Segment}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:protos.Segment)
+      map.builder.protos.SegmentOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Segment_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Segment_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              map.builder.protos.Segment.class, map.builder.protos.Segment.Builder.class);
+    }
+
+    // Construct using map.builder.protos.Segment.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      id_ = 0;
+
+      osmId_ = "";
+
+      if (geometryBuilder_ == null) {
+        geometry_ = null;
+      } else {
+        geometry_ = null;
+        geometryBuilder_ = null;
+      }
+      length_ = 0D;
+
+      startNode_ = 0;
+
+      endNode_ = 0;
+
+      category_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return map.builder.protos.RoadNetworkProto.internal_static_protos_Segment_descriptor;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Segment getDefaultInstanceForType() {
+      return map.builder.protos.Segment.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Segment build() {
+      map.builder.protos.Segment result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public map.builder.protos.Segment buildPartial() {
+      map.builder.protos.Segment result = new map.builder.protos.Segment(this);
+      result.id_ = id_;
+      result.osmId_ = osmId_;
+      if (geometryBuilder_ == null) {
+        result.geometry_ = geometry_;
+      } else {
+        result.geometry_ = geometryBuilder_.build();
+      }
+      result.length_ = length_;
+      result.startNode_ = startNode_;
+      result.endNode_ = endNode_;
+      result.category_ = category_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof map.builder.protos.Segment) {
+        return mergeFrom((map.builder.protos.Segment)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(map.builder.protos.Segment other) {
+      if (other == map.builder.protos.Segment.getDefaultInstance()) return this;
+      if (other.getId() != 0) {
+        setId(other.getId());
+      }
+      if (!other.getOsmId().isEmpty()) {
+        osmId_ = other.osmId_;
+        onChanged();
+      }
+      if (other.hasGeometry()) {
+        mergeGeometry(other.getGeometry());
+      }
+      if (other.getLength() != 0D) {
+        setLength(other.getLength());
+      }
+      if (other.getStartNode() != 0) {
+        setStartNode(other.getStartNode());
+      }
+      if (other.getEndNode() != 0) {
+        setEndNode(other.getEndNode());
+      }
+      if (other.category_ != 0) {
+        setCategoryValue(other.getCategoryValue());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      map.builder.protos.Segment parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (map.builder.protos.Segment) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int id_ ;
+    /**
+     * <pre>
+     * id is the internal id used in our system of a segment
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @return The id.
+     */
+    @java.lang.Override
+    public int getId() {
+      return id_;
+    }
+    /**
+     * <pre>
+     * id is the internal id used in our system of a segment
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @param value The id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setId(int value) {
+      
+      id_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * id is the internal id used in our system of a segment
+     * </pre>
+     *
+     * <code>uint32 id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearId() {
+      
+      id_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object osmId_ = "";
+    /**
+     * <pre>
+     * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return The osmId.
+     */
+    public java.lang.String getOsmId() {
+      java.lang.Object ref = osmId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        osmId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return The bytes for osmId.
+     */
+    public com.google.protobuf.ByteString
+        getOsmIdBytes() {
+      java.lang.Object ref = osmId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        osmId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @param value The osmId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOsmId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      osmId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearOsmId() {
+      
+      osmId_ = getDefaultInstance().getOsmId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+     * </pre>
+     *
+     * <code>string osm_id = 2;</code>
+     * @param value The bytes for osmId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOsmIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      osmId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private map.builder.protos.Location geometry_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder> geometryBuilder_;
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     * @return Whether the geometry field is set.
+     */
+    public boolean hasGeometry() {
+      return geometryBuilder_ != null || geometry_ != null;
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     * @return The geometry.
+     */
+    public map.builder.protos.Location getGeometry() {
+      if (geometryBuilder_ == null) {
+        return geometry_ == null ? map.builder.protos.Location.getDefaultInstance() : geometry_;
+      } else {
+        return geometryBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public Builder setGeometry(map.builder.protos.Location value) {
+      if (geometryBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        geometry_ = value;
+        onChanged();
+      } else {
+        geometryBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public Builder setGeometry(
+        map.builder.protos.Location.Builder builderForValue) {
+      if (geometryBuilder_ == null) {
+        geometry_ = builderForValue.build();
+        onChanged();
+      } else {
+        geometryBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public Builder mergeGeometry(map.builder.protos.Location value) {
+      if (geometryBuilder_ == null) {
+        if (geometry_ != null) {
+          geometry_ =
+            map.builder.protos.Location.newBuilder(geometry_).mergeFrom(value).buildPartial();
+        } else {
+          geometry_ = value;
+        }
+        onChanged();
+      } else {
+        geometryBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public Builder clearGeometry() {
+      if (geometryBuilder_ == null) {
+        geometry_ = null;
+        onChanged();
+      } else {
+        geometry_ = null;
+        geometryBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public map.builder.protos.Location.Builder getGeometryBuilder() {
+      
+      onChanged();
+      return getGeometryFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    public map.builder.protos.LocationOrBuilder getGeometryOrBuilder() {
+      if (geometryBuilder_ != null) {
+        return geometryBuilder_.getMessageOrBuilder();
+      } else {
+        return geometry_ == null ?
+            map.builder.protos.Location.getDefaultInstance() : geometry_;
+      }
+    }
+    /**
+     * <pre>
+     * geometry represents the linestring representing the segment
+     * </pre>
+     *
+     * <code>.protos.Location geometry = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder> 
+        getGeometryFieldBuilder() {
+      if (geometryBuilder_ == null) {
+        geometryBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            map.builder.protos.Location, map.builder.protos.Location.Builder, map.builder.protos.LocationOrBuilder>(
+                getGeometry(),
+                getParentForChildren(),
+                isClean());
+        geometry_ = null;
+      }
+      return geometryBuilder_;
+    }
+
+    private double length_ ;
+    /**
+     * <pre>
+     * length of the segment in meters
+     * </pre>
+     *
+     * <code>double length = 4;</code>
+     * @return The length.
+     */
+    @java.lang.Override
+    public double getLength() {
+      return length_;
+    }
+    /**
+     * <pre>
+     * length of the segment in meters
+     * </pre>
+     *
+     * <code>double length = 4;</code>
+     * @param value The length to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLength(double value) {
+      
+      length_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * length of the segment in meters
+     * </pre>
+     *
+     * <code>double length = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearLength() {
+      
+      length_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private int startNode_ ;
+    /**
+     * <pre>
+     * start_node is the start endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 start_node = 5;</code>
+     * @return The startNode.
+     */
+    @java.lang.Override
+    public int getStartNode() {
+      return startNode_;
+    }
+    /**
+     * <pre>
+     * start_node is the start endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 start_node = 5;</code>
+     * @param value The startNode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setStartNode(int value) {
+      
+      startNode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * start_node is the start endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 start_node = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearStartNode() {
+      
+      startNode_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int endNode_ ;
+    /**
+     * <pre>
+     * end_node is the end endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 end_node = 6;</code>
+     * @return The endNode.
+     */
+    @java.lang.Override
+    public int getEndNode() {
+      return endNode_;
+    }
+    /**
+     * <pre>
+     * end_node is the end endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 end_node = 6;</code>
+     * @param value The endNode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setEndNode(int value) {
+      
+      endNode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * end_node is the end endpoint of the segment
+     * </pre>
+     *
+     * <code>uint32 end_node = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearEndNode() {
+      
+      endNode_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int category_ = 0;
+    /**
+     * <pre>
+     * category of the road according to OSM main road types
+     * </pre>
+     *
+     * <code>.protos.RoadCategory category = 7;</code>
+     * @return The enum numeric value on the wire for category.
+     */
+    @java.lang.Override public int getCategoryValue() {
+      return category_;
+    }
+    /**
+     * <pre>
+     * category of the road according to OSM main road types
+     * </pre>
+     *
+     * <code>.protos.RoadCategory category = 7;</code>
+     * @param value The enum numeric value on the wire for category to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategoryValue(int value) {
+      
+      category_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * category of the road according to OSM main road types
+     * </pre>
+     *
+     * <code>.protos.RoadCategory category = 7;</code>
+     * @return The category.
+     */
+    @java.lang.Override
+    public map.builder.protos.RoadCategory getCategory() {
+      @SuppressWarnings("deprecation")
+      map.builder.protos.RoadCategory result = map.builder.protos.RoadCategory.valueOf(category_);
+      return result == null ? map.builder.protos.RoadCategory.UNRECOGNIZED : result;
+    }
+    /**
+     * <pre>
+     * category of the road according to OSM main road types
+     * </pre>
+     *
+     * <code>.protos.RoadCategory category = 7;</code>
+     * @param value The category to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategory(map.builder.protos.RoadCategory value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      
+      category_ = value.getNumber();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * category of the road according to OSM main road types
+     * </pre>
+     *
+     * <code>.protos.RoadCategory category = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCategory() {
+      
+      category_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:protos.Segment)
+  }
+
+  // @@protoc_insertion_point(class_scope:protos.Segment)
+  private static final map.builder.protos.Segment DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new map.builder.protos.Segment();
+  }
+
+  public static map.builder.protos.Segment getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Segment>
+      PARSER = new com.google.protobuf.AbstractParser<Segment>() {
+    @java.lang.Override
+    public Segment parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Segment(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Segment> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Segment> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public map.builder.protos.Segment getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/mapbuilder/src/main/java/map/builder/protos/SegmentOrBuilder.java b/mapbuilder/src/main/java/map/builder/protos/SegmentOrBuilder.java
new file mode 100644
index 0000000..48e5c84
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/SegmentOrBuilder.java
@@ -0,0 +1,115 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
+
+package map.builder.protos;
+
+public interface SegmentOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:protos.Segment)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * id is the internal id used in our system of a segment
+   * </pre>
+   *
+   * <code>uint32 id = 1;</code>
+   * @return The id.
+   */
+  int getId();
+
+  /**
+   * <pre>
+   * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The osmId.
+   */
+  java.lang.String getOsmId();
+  /**
+   * <pre>
+   * osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+   * </pre>
+   *
+   * <code>string osm_id = 2;</code>
+   * @return The bytes for osmId.
+   */
+  com.google.protobuf.ByteString
+      getOsmIdBytes();
+
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   * @return Whether the geometry field is set.
+   */
+  boolean hasGeometry();
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   * @return The geometry.
+   */
+  map.builder.protos.Location getGeometry();
+  /**
+   * <pre>
+   * geometry represents the linestring representing the segment
+   * </pre>
+   *
+   * <code>.protos.Location geometry = 3;</code>
+   */
+  map.builder.protos.LocationOrBuilder getGeometryOrBuilder();
+
+  /**
+   * <pre>
+   * length of the segment in meters
+   * </pre>
+   *
+   * <code>double length = 4;</code>
+   * @return The length.
+   */
+  double getLength();
+
+  /**
+   * <pre>
+   * start_node is the start endpoint of the segment
+   * </pre>
+   *
+   * <code>uint32 start_node = 5;</code>
+   * @return The startNode.
+   */
+  int getStartNode();
+
+  /**
+   * <pre>
+   * end_node is the end endpoint of the segment
+   * </pre>
+   *
+   * <code>uint32 end_node = 6;</code>
+   * @return The endNode.
+   */
+  int getEndNode();
+
+  /**
+   * <pre>
+   * category of the road according to OSM main road types
+   * </pre>
+   *
+   * <code>.protos.RoadCategory category = 7;</code>
+   * @return The enum numeric value on the wire for category.
+   */
+  int getCategoryValue();
+  /**
+   * <pre>
+   * category of the road according to OSM main road types
+   * </pre>
+   *
+   * <code>.protos.RoadCategory category = 7;</code>
+   * @return The category.
+   */
+  map.builder.protos.RoadCategory getCategory();
+}
diff --git a/mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto b/mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
new file mode 100644
index 0000000..ea31ac7
--- /dev/null
+++ b/mapbuilder/src/main/java/map/builder/protos/schema/roadnetwork.proto
@@ -0,0 +1,75 @@
+syntax = "proto3";
+
+package protos;
+
+option java_multiple_files = true;
+option java_package = "map.builder.protos";
+option java_outer_classname = "RoadNetworkProto";
+
+//Roadnetwork represents our whole roadnetwork
+message RoadNetwork {
+    // Nodes are corresponding to intersections
+    repeated Node nodes = 1;
+    // Segments correspond to edges in our graph
+    repeated Segment segments = 2;
+    // Turn restrictitons correspond to turn restrictions
+    repeated Restriction turn_restrictions = 3;
+}
+
+// Nodes represent usually intersections in our network.
+message Node { 
+    // Internally used ids of our segments
+    uint32 id = 1;
+    // Vendor IDs of OSM data, used for referencing the original data
+    string osm_id = 2;
+    // Coordinaes of the intersection
+    Location position = 3;
+}
+
+// Segment represents a directed edge in our network, which connects two nodes
+message Segment {
+    // id is the internal id used in our system of a segment
+    uint32 id = 1;
+    // osm_id is the id of the segment, in the original OSM data, if it exists as a separate segment there
+    string osm_id = 2;
+    // geometry represents the linestring representing the segment
+    Location geometry = 3;
+    // length of the segment in meters
+    double length = 4;
+    // start_node is the start endpoint of the segment
+    uint32 start_node = 5;
+    // end_node is the end endpoint of the segment
+    uint32 end_node = 6;
+    // category of the road according to OSM main road types
+    RoadCategory category = 7;
+}
+
+// RoadCategory groups road segments into several classes
+enum RoadCategory {
+    // a special value to indicate that the field is not set
+    ROAD_CATEGORY_INVALID = 0;
+    // represents motorway and trunks, according to the specification of OSM's data
+    ROAD_CATEGORY_HIGHWAY = 1;
+    // often link larger towns
+    ROAD_CATEGORY_MAIN = 2;
+    // represents a road within a city or connecting small towns
+    ROAD_CATEGORY_LOCAL = 3;
+    // represents a vehicular access to small streets connecting roads with apartments, buildings
+    ROAD_CATEGORY_RESIDENTIAL=4;
+}
+
+// A restricted turn from one segment to another, which are adjacent to each other
+message Restriction {
+    // from_id is the id of the segment from which the turn originates
+    uint32 from_id = 1;
+    // to_id is the id of the segment in which the turn ends
+    uint32 to_id = 2;
+}
+
+// A location is geographical point. The coordinate system used is WGS 84
+message Location { 
+    // lat corresponds to the latitude of the point
+    float lat = 1;
+    // lon corresponds to the longitude of the point
+    float lon = 2;
+}
\ No newline at end of file
diff --git a/mapbuilder/src/test/java/map/builder/AppTest.java b/mapbuilder/src/test/java/map/builder/AppTest.java
new file mode 100644
index 0000000..edfc04f
--- /dev/null
+++ b/mapbuilder/src/test/java/map/builder/AppTest.java
@@ -0,0 +1,20 @@
+package map.builder;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+{
+    /**
+     * Rigorous Test :-)
+     */
+    @Test
+    public void shouldAnswerWithTrue()
+    {
+        assertTrue( true );
+    }
+}
-- 
GitLab