diff --git a/simulation/JavaGazebo/build.gradle b/simulation/JavaGazebo/build.gradle
new file mode 100644
index 0000000..4a0456a
--- /dev/null
+++ b/simulation/JavaGazebo/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+apply plugin: 'maven-publish'
+
+publishing {
+    publications {
+        maven(MavenPublication) {
+            artifact jar
+            groupId 'org.gazebosim'
+            artifactId 'JavaGazebo'
+            version '0.1.0-SNAPSHOT'
+        }
+    }
+    setupWpilibRepo(it)
+}
+
+dependencies {
+    compile 'com.google.protobuf:protobuf-java:2.5.0'
+}
\ No newline at end of file
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzBool.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzBool.java
new file mode 100644
index 0000000..dd3abd1
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzBool.java
@@ -0,0 +1,453 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: frc_gazebo_plugin/msgs/bool.proto
+
+package gazebo.msgs;
+
+public final class GzBool {
+  private GzBool() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface BoolOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required bool data = 1;
+    /**
+     * <code>required bool data = 1;</code>
+     */
+    boolean hasData();
+    /**
+     * <code>required bool data = 1;</code>
+     */
+    boolean getData();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Bool}
+   */
+  public static final class Bool extends
+      com.google.protobuf.GeneratedMessage
+      implements BoolOrBuilder {
+    // Use Bool.newBuilder() to construct.
+    private Bool(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Bool(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Bool defaultInstance;
+    public static Bool getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Bool getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Bool(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              data_ = input.readBool();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzBool.internal_static_gazebo_msgs_Bool_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzBool.internal_static_gazebo_msgs_Bool_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzBool.Bool.class, gazebo.msgs.GzBool.Bool.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Bool> PARSER =
+        new com.google.protobuf.AbstractParser<Bool>() {
+      public Bool parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Bool(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Bool> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required bool data = 1;
+    public static final int DATA_FIELD_NUMBER = 1;
+    private boolean data_;
+    /**
+     * <code>required bool data = 1;</code>
+     */
+    public boolean hasData() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required bool data = 1;</code>
+     */
+    public boolean getData() {
+      return data_;
+    }
+
+    private void initFields() {
+      data_ = false;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasData()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBool(1, data_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(1, data_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzBool.Bool parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzBool.Bool parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzBool.Bool parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzBool.Bool prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Bool}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzBool.BoolOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzBool.internal_static_gazebo_msgs_Bool_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzBool.internal_static_gazebo_msgs_Bool_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzBool.Bool.class, gazebo.msgs.GzBool.Bool.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzBool.Bool.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        data_ = false;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzBool.internal_static_gazebo_msgs_Bool_descriptor;
+      }
+
+      public gazebo.msgs.GzBool.Bool getDefaultInstanceForType() {
+        return gazebo.msgs.GzBool.Bool.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzBool.Bool build() {
+        gazebo.msgs.GzBool.Bool result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzBool.Bool buildPartial() {
+        gazebo.msgs.GzBool.Bool result = new gazebo.msgs.GzBool.Bool(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.data_ = data_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzBool.Bool) {
+          return mergeFrom((gazebo.msgs.GzBool.Bool)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzBool.Bool other) {
+        if (other == gazebo.msgs.GzBool.Bool.getDefaultInstance()) return this;
+        if (other.hasData()) {
+          setData(other.getData());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasData()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzBool.Bool parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzBool.Bool) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required bool data = 1;
+      private boolean data_ ;
+      /**
+       * <code>required bool data = 1;</code>
+       */
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required bool data = 1;</code>
+       */
+      public boolean getData() {
+        return data_;
+      }
+      /**
+       * <code>required bool data = 1;</code>
+       */
+      public Builder setData(boolean value) {
+        bitField0_ |= 0x00000001;
+        data_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required bool data = 1;</code>
+       */
+      public Builder clearData() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        data_ = false;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Bool)
+    }
+
+    static {
+      defaultInstance = new Bool(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Bool)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Bool_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Bool_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n!frc_gazebo_plugin/msgs/bool.proto\022\013gaz" +
+      "ebo.msgs\"\024\n\004Bool\022\014\n\004data\030\001 \002(\010B\010B\006GzBool"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Bool_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Bool_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Bool_descriptor,
+              new java.lang.String[] { "Data", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzDriverStation.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzDriverStation.java
new file mode 100644
index 0000000..c3e967d
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzDriverStation.java
@@ -0,0 +1,645 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: frc_gazebo_plugin/msgs/driver-station.proto
+
+package gazebo.msgs;
+
+public final class GzDriverStation {
+  private GzDriverStation() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface DriverStationOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required bool enabled = 1;
+    /**
+     * <code>required bool enabled = 1;</code>
+     */
+    boolean hasEnabled();
+    /**
+     * <code>required bool enabled = 1;</code>
+     */
+    boolean getEnabled();
+
+    // required .gazebo.msgs.DriverStation.State state = 2;
+    /**
+     * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+     */
+    boolean hasState();
+    /**
+     * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+     */
+    gazebo.msgs.GzDriverStation.DriverStation.State getState();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.DriverStation}
+   */
+  public static final class DriverStation extends
+      com.google.protobuf.GeneratedMessage
+      implements DriverStationOrBuilder {
+    // Use DriverStation.newBuilder() to construct.
+    private DriverStation(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private DriverStation(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final DriverStation defaultInstance;
+    public static DriverStation getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public DriverStation getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private DriverStation(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              enabled_ = input.readBool();
+              break;
+            }
+            case 16: {
+              int rawValue = input.readEnum();
+              gazebo.msgs.GzDriverStation.DriverStation.State value = gazebo.msgs.GzDriverStation.DriverStation.State.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(2, rawValue);
+              } else {
+                bitField0_ |= 0x00000002;
+                state_ = value;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzDriverStation.internal_static_gazebo_msgs_DriverStation_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzDriverStation.internal_static_gazebo_msgs_DriverStation_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzDriverStation.DriverStation.class, gazebo.msgs.GzDriverStation.DriverStation.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<DriverStation> PARSER =
+        new com.google.protobuf.AbstractParser<DriverStation>() {
+      public DriverStation parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new DriverStation(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DriverStation> getParserForType() {
+      return PARSER;
+    }
+
+    /**
+     * Protobuf enum {@code gazebo.msgs.DriverStation.State}
+     */
+    public enum State
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <code>AUTO = 0;</code>
+       */
+      AUTO(0, 0),
+      /**
+       * <code>TELEOP = 1;</code>
+       */
+      TELEOP(1, 1),
+      /**
+       * <code>TEST = 2;</code>
+       */
+      TEST(2, 2),
+      ;
+
+      /**
+       * <code>AUTO = 0;</code>
+       */
+      public static final int AUTO_VALUE = 0;
+      /**
+       * <code>TELEOP = 1;</code>
+       */
+      public static final int TELEOP_VALUE = 1;
+      /**
+       * <code>TEST = 2;</code>
+       */
+      public static final int TEST_VALUE = 2;
+
+
+      public final int getNumber() { return value; }
+
+      public static State valueOf(int value) {
+        switch (value) {
+          case 0: return AUTO;
+          case 1: return TELEOP;
+          case 2: return TEST;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<State>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<State>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<State>() {
+              public State findValueByNumber(int number) {
+                return State.valueOf(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return gazebo.msgs.GzDriverStation.DriverStation.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final State[] VALUES = values();
+
+      public static State valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int index;
+      private final int value;
+
+      private State(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:gazebo.msgs.DriverStation.State)
+    }
+
+    private int bitField0_;
+    // required bool enabled = 1;
+    public static final int ENABLED_FIELD_NUMBER = 1;
+    private boolean enabled_;
+    /**
+     * <code>required bool enabled = 1;</code>
+     */
+    public boolean hasEnabled() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required bool enabled = 1;</code>
+     */
+    public boolean getEnabled() {
+      return enabled_;
+    }
+
+    // required .gazebo.msgs.DriverStation.State state = 2;
+    public static final int STATE_FIELD_NUMBER = 2;
+    private gazebo.msgs.GzDriverStation.DriverStation.State state_;
+    /**
+     * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+     */
+    public boolean hasState() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+     */
+    public gazebo.msgs.GzDriverStation.DriverStation.State getState() {
+      return state_;
+    }
+
+    private void initFields() {
+      enabled_ = false;
+      state_ = gazebo.msgs.GzDriverStation.DriverStation.State.AUTO;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasEnabled()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasState()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBool(1, enabled_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeEnum(2, state_.getNumber());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(1, enabled_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, state_.getNumber());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzDriverStation.DriverStation parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzDriverStation.DriverStation prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.DriverStation}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzDriverStation.DriverStationOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzDriverStation.internal_static_gazebo_msgs_DriverStation_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzDriverStation.internal_static_gazebo_msgs_DriverStation_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzDriverStation.DriverStation.class, gazebo.msgs.GzDriverStation.DriverStation.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzDriveStation.DriverStation.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        enabled_ = false;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        state_ = gazebo.msgs.GzDriverStation.DriverStation.State.AUTO;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzDriverStation.internal_static_gazebo_msgs_DriverStation_descriptor;
+      }
+
+      public gazebo.msgs.GzDriverStation.DriverStation getDefaultInstanceForType() {
+        return gazebo.msgs.GzDriverStation.DriverStation.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzDriverStation.DriverStation build() {
+        gazebo.msgs.GzDriverStation.DriverStation result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzDriverStation.DriverStation buildPartial() {
+        gazebo.msgs.GzDriverStation.DriverStation result = new gazebo.msgs.GzDriverStation.DriverStation(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.enabled_ = enabled_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.state_ = state_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzDriverStation.DriverStation) {
+          return mergeFrom((gazebo.msgs.GzDriverStation.DriverStation)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzDriverStation.DriverStation other) {
+        if (other == gazebo.msgs.GzDriverStation.DriverStation.getDefaultInstance()) return this;
+        if (other.hasEnabled()) {
+          setEnabled(other.getEnabled());
+        }
+        if (other.hasState()) {
+          setState(other.getState());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasEnabled()) {
+          
+          return false;
+        }
+        if (!hasState()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzDriverStation.DriverStation parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzDriverStation.DriverStation) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required bool enabled = 1;
+      private boolean enabled_ ;
+      /**
+       * <code>required bool enabled = 1;</code>
+       */
+      public boolean hasEnabled() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required bool enabled = 1;</code>
+       */
+      public boolean getEnabled() {
+        return enabled_;
+      }
+      /**
+       * <code>required bool enabled = 1;</code>
+       */
+      public Builder setEnabled(boolean value) {
+        bitField0_ |= 0x00000001;
+        enabled_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required bool enabled = 1;</code>
+       */
+      public Builder clearEnabled() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        enabled_ = false;
+        onChanged();
+        return this;
+      }
+
+      // required .gazebo.msgs.DriverStation.State state = 2;
+      private gazebo.msgs.GzDriverStation.DriverStation.State state_ = gazebo.msgs.GzDriverStation.DriverStation.State.AUTO;
+      /**
+       * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+       */
+      public boolean hasState() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+       */
+      public gazebo.msgs.GzDriverStation.DriverStation.State getState() {
+        return state_;
+      }
+      /**
+       * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+       */
+      public Builder setState(gazebo.msgs.GzDriverStation.DriverStation.State value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000002;
+        state_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required .gazebo.msgs.DriverStation.State state = 2;</code>
+       */
+      public Builder clearState() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        state_ = gazebo.msgs.GzDriverStation.DriverStation.State.AUTO;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.DriverStation)
+    }
+
+    static {
+      defaultInstance = new DriverStation(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.DriverStation)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_DriverStation_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_DriverStation_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n+frc_gazebo_plugin/msgs/driver-station." +
+      "proto\022\013gazebo.msgs\"z\n\rDriverStation\022\017\n\007e" +
+      "nabled\030\001 \002(\010\022/\n\005state\030\002 \002(\0162 .gazebo.msg" +
+      "s.DriverStation.State\"\'\n\005State\022\010\n\004AUTO\020\000" +
+      "\022\n\n\006TELEOP\020\001\022\010\n\004TEST\020\002B\020B\016GzDriveStation"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_DriverStation_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_DriverStation_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_DriverStation_descriptor,
+              new java.lang.String[] { "Enabled", "State", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzFloat64.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzFloat64.java
new file mode 100644
index 0000000..ac5a085
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzFloat64.java
@@ -0,0 +1,453 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: msgs/float64.proto
+
+package gazebo.msgs;
+
+public final class GzFloat64 {
+  private GzFloat64() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface Float64OrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required double data = 1;
+    /**
+     * <code>required double data = 1;</code>
+     */
+    boolean hasData();
+    /**
+     * <code>required double data = 1;</code>
+     */
+    double getData();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Float64}
+   */
+  public static final class Float64 extends
+      com.google.protobuf.GeneratedMessage
+      implements Float64OrBuilder {
+    // Use Float64.newBuilder() to construct.
+    private Float64(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Float64(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Float64 defaultInstance;
+    public static Float64 getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Float64 getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Float64(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 9: {
+              bitField0_ |= 0x00000001;
+              data_ = input.readDouble();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzFloat64.internal_static_gazebo_msgs_Float64_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzFloat64.internal_static_gazebo_msgs_Float64_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzFloat64.Float64.class, gazebo.msgs.GzFloat64.Float64.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Float64> PARSER =
+        new com.google.protobuf.AbstractParser<Float64>() {
+      public Float64 parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Float64(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Float64> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required double data = 1;
+    public static final int DATA_FIELD_NUMBER = 1;
+    private double data_;
+    /**
+     * <code>required double data = 1;</code>
+     */
+    public boolean hasData() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required double data = 1;</code>
+     */
+    public double getData() {
+      return data_;
+    }
+
+    private void initFields() {
+      data_ = 0D;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasData()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeDouble(1, data_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeDoubleSize(1, data_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzFloat64.Float64 parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzFloat64.Float64 prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Float64}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzFloat64.Float64OrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzFloat64.internal_static_gazebo_msgs_Float64_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzFloat64.internal_static_gazebo_msgs_Float64_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzFloat64.Float64.class, gazebo.msgs.GzFloat64.Float64.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzFloat64.Float64.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        data_ = 0D;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzFloat64.internal_static_gazebo_msgs_Float64_descriptor;
+      }
+
+      public gazebo.msgs.GzFloat64.Float64 getDefaultInstanceForType() {
+        return gazebo.msgs.GzFloat64.Float64.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzFloat64.Float64 build() {
+        gazebo.msgs.GzFloat64.Float64 result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzFloat64.Float64 buildPartial() {
+        gazebo.msgs.GzFloat64.Float64 result = new gazebo.msgs.GzFloat64.Float64(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.data_ = data_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzFloat64.Float64) {
+          return mergeFrom((gazebo.msgs.GzFloat64.Float64)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzFloat64.Float64 other) {
+        if (other == gazebo.msgs.GzFloat64.Float64.getDefaultInstance()) return this;
+        if (other.hasData()) {
+          setData(other.getData());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasData()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzFloat64.Float64 parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzFloat64.Float64) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required double data = 1;
+      private double data_ ;
+      /**
+       * <code>required double data = 1;</code>
+       */
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required double data = 1;</code>
+       */
+      public double getData() {
+        return data_;
+      }
+      /**
+       * <code>required double data = 1;</code>
+       */
+      public Builder setData(double value) {
+        bitField0_ |= 0x00000001;
+        data_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required double data = 1;</code>
+       */
+      public Builder clearData() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        data_ = 0D;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Float64)
+    }
+
+    static {
+      defaultInstance = new Float64(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Float64)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Float64_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Float64_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\022msgs/float64.proto\022\013gazebo.msgs\"\027\n\007Flo" +
+      "at64\022\014\n\004data\030\001 \002(\001B\013B\tGzFloat64"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Float64_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Float64_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Float64_descriptor,
+              new java.lang.String[] { "Data", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzJoystick.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzJoystick.java
new file mode 100644
index 0000000..9f1d1a6
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzJoystick.java
@@ -0,0 +1,670 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: frc_gazebo_plugin/msgs/joystick.proto
+
+package gazebo.msgs;
+
+public final class GzJoystick {
+  private GzJoystick() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface JoystickOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // repeated double axes = 1;
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    java.util.List<java.lang.Double> getAxesList();
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    int getAxesCount();
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    double getAxes(int index);
+
+    // repeated bool buttons = 2;
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    java.util.List<java.lang.Boolean> getButtonsList();
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    int getButtonsCount();
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    boolean getButtons(int index);
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Joystick}
+   */
+  public static final class Joystick extends
+      com.google.protobuf.GeneratedMessage
+      implements JoystickOrBuilder {
+    // Use Joystick.newBuilder() to construct.
+    private Joystick(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Joystick(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Joystick defaultInstance;
+    public static Joystick getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Joystick getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Joystick(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 9: {
+              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+                axes_ = new java.util.ArrayList<java.lang.Double>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              axes_.add(input.readDouble());
+              break;
+            }
+            case 10: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001) && input.getBytesUntilLimit() > 0) {
+                axes_ = new java.util.ArrayList<java.lang.Double>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                axes_.add(input.readDouble());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            case 16: {
+              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
+                buttons_ = new java.util.ArrayList<java.lang.Boolean>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              buttons_.add(input.readBool());
+              break;
+            }
+            case 18: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002) && input.getBytesUntilLimit() > 0) {
+                buttons_ = new java.util.ArrayList<java.lang.Boolean>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                buttons_.add(input.readBool());
+              }
+              input.popLimit(limit);
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+          axes_ = java.util.Collections.unmodifiableList(axes_);
+        }
+        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
+          buttons_ = java.util.Collections.unmodifiableList(buttons_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzJoystick.internal_static_gazebo_msgs_Joystick_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzJoystick.internal_static_gazebo_msgs_Joystick_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzJoystick.Joystick.class, gazebo.msgs.GzJoystick.Joystick.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Joystick> PARSER =
+        new com.google.protobuf.AbstractParser<Joystick>() {
+      public Joystick parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Joystick(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Joystick> getParserForType() {
+      return PARSER;
+    }
+
+    // repeated double axes = 1;
+    public static final int AXES_FIELD_NUMBER = 1;
+    private java.util.List<java.lang.Double> axes_;
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    public java.util.List<java.lang.Double>
+        getAxesList() {
+      return axes_;
+    }
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    public int getAxesCount() {
+      return axes_.size();
+    }
+    /**
+     * <code>repeated double axes = 1;</code>
+     */
+    public double getAxes(int index) {
+      return axes_.get(index);
+    }
+
+    // repeated bool buttons = 2;
+    public static final int BUTTONS_FIELD_NUMBER = 2;
+    private java.util.List<java.lang.Boolean> buttons_;
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    public java.util.List<java.lang.Boolean>
+        getButtonsList() {
+      return buttons_;
+    }
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    public int getButtonsCount() {
+      return buttons_.size();
+    }
+    /**
+     * <code>repeated bool buttons = 2;</code>
+     */
+    public boolean getButtons(int index) {
+      return buttons_.get(index);
+    }
+
+    private void initFields() {
+      axes_ = java.util.Collections.emptyList();
+      buttons_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < axes_.size(); i++) {
+        output.writeDouble(1, axes_.get(i));
+      }
+      for (int i = 0; i < buttons_.size(); i++) {
+        output.writeBool(2, buttons_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        dataSize = 8 * getAxesList().size();
+        size += dataSize;
+        size += 1 * getAxesList().size();
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * getButtonsList().size();
+        size += dataSize;
+        size += 1 * getButtonsList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzJoystick.Joystick parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzJoystick.Joystick prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Joystick}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzJoystick.JoystickOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzJoystick.internal_static_gazebo_msgs_Joystick_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzJoystick.internal_static_gazebo_msgs_Joystick_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzJoystick.Joystick.class, gazebo.msgs.GzJoystick.Joystick.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzJoystick.Joystick.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        axes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        buttons_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzJoystick.internal_static_gazebo_msgs_Joystick_descriptor;
+      }
+
+      public gazebo.msgs.GzJoystick.Joystick getDefaultInstanceForType() {
+        return gazebo.msgs.GzJoystick.Joystick.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzJoystick.Joystick build() {
+        gazebo.msgs.GzJoystick.Joystick result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzJoystick.Joystick buildPartial() {
+        gazebo.msgs.GzJoystick.Joystick result = new gazebo.msgs.GzJoystick.Joystick(this);
+        int from_bitField0_ = bitField0_;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          axes_ = java.util.Collections.unmodifiableList(axes_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.axes_ = axes_;
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          buttons_ = java.util.Collections.unmodifiableList(buttons_);
+          bitField0_ = (bitField0_ & ~0x00000002);
+        }
+        result.buttons_ = buttons_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzJoystick.Joystick) {
+          return mergeFrom((gazebo.msgs.GzJoystick.Joystick)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzJoystick.Joystick other) {
+        if (other == gazebo.msgs.GzJoystick.Joystick.getDefaultInstance()) return this;
+        if (!other.axes_.isEmpty()) {
+          if (axes_.isEmpty()) {
+            axes_ = other.axes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureAxesIsMutable();
+            axes_.addAll(other.axes_);
+          }
+          onChanged();
+        }
+        if (!other.buttons_.isEmpty()) {
+          if (buttons_.isEmpty()) {
+            buttons_ = other.buttons_;
+            bitField0_ = (bitField0_ & ~0x00000002);
+          } else {
+            ensureButtonsIsMutable();
+            buttons_.addAll(other.buttons_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzJoystick.Joystick parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzJoystick.Joystick) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // repeated double axes = 1;
+      private java.util.List<java.lang.Double> axes_ = java.util.Collections.emptyList();
+      private void ensureAxesIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          axes_ = new java.util.ArrayList<java.lang.Double>(axes_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public java.util.List<java.lang.Double>
+          getAxesList() {
+        return java.util.Collections.unmodifiableList(axes_);
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public int getAxesCount() {
+        return axes_.size();
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public double getAxes(int index) {
+        return axes_.get(index);
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public Builder setAxes(
+          int index, double value) {
+        ensureAxesIsMutable();
+        axes_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public Builder addAxes(double value) {
+        ensureAxesIsMutable();
+        axes_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public Builder addAllAxes(
+          java.lang.Iterable<? extends java.lang.Double> values) {
+        ensureAxesIsMutable();
+        super.addAll(values, axes_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated double axes = 1;</code>
+       */
+      public Builder clearAxes() {
+        axes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+
+      // repeated bool buttons = 2;
+      private java.util.List<java.lang.Boolean> buttons_ = java.util.Collections.emptyList();
+      private void ensureButtonsIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          buttons_ = new java.util.ArrayList<java.lang.Boolean>(buttons_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public java.util.List<java.lang.Boolean>
+          getButtonsList() {
+        return java.util.Collections.unmodifiableList(buttons_);
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public int getButtonsCount() {
+        return buttons_.size();
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public boolean getButtons(int index) {
+        return buttons_.get(index);
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public Builder setButtons(
+          int index, boolean value) {
+        ensureButtonsIsMutable();
+        buttons_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public Builder addButtons(boolean value) {
+        ensureButtonsIsMutable();
+        buttons_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public Builder addAllButtons(
+          java.lang.Iterable<? extends java.lang.Boolean> values) {
+        ensureButtonsIsMutable();
+        super.addAll(values, buttons_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bool buttons = 2;</code>
+       */
+      public Builder clearButtons() {
+        buttons_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Joystick)
+    }
+
+    static {
+      defaultInstance = new Joystick(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Joystick)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Joystick_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Joystick_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n%frc_gazebo_plugin/msgs/joystick.proto\022" +
+      "\013gazebo.msgs\")\n\010Joystick\022\014\n\004axes\030\001 \003(\001\022\017" +
+      "\n\007buttons\030\002 \003(\010B\014B\nGzJoystick"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Joystick_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Joystick_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Joystick_descriptor,
+              new java.lang.String[] { "Axes", "Buttons", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPacket.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPacket.java
new file mode 100644
index 0000000..6294811
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPacket.java
@@ -0,0 +1,831 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: packet.proto
+
+package gazebo.msgs;
+
+public final class GzPacket {
+  private GzPacket() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface PacketOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required .gazebo.msgs.Time stamp = 1;
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    boolean hasStamp();
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    gazebo.msgs.GzTime.Time getStamp();
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    gazebo.msgs.GzTime.TimeOrBuilder getStampOrBuilder();
+
+    // required string type = 2;
+    /**
+     * <code>required string type = 2;</code>
+     */
+    boolean hasType();
+    /**
+     * <code>required string type = 2;</code>
+     */
+    java.lang.String getType();
+    /**
+     * <code>required string type = 2;</code>
+     */
+    com.google.protobuf.ByteString
+        getTypeBytes();
+
+    // required bytes serialized_data = 3;
+    /**
+     * <code>required bytes serialized_data = 3;</code>
+     */
+    boolean hasSerializedData();
+    /**
+     * <code>required bytes serialized_data = 3;</code>
+     */
+    com.google.protobuf.ByteString getSerializedData();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Packet}
+   */
+  public static final class Packet extends
+      com.google.protobuf.GeneratedMessage
+      implements PacketOrBuilder {
+    // Use Packet.newBuilder() to construct.
+    private Packet(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Packet(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Packet defaultInstance;
+    public static Packet getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Packet getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Packet(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              gazebo.msgs.GzTime.Time.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000001) == 0x00000001)) {
+                subBuilder = stamp_.toBuilder();
+              }
+              stamp_ = input.readMessage(gazebo.msgs.GzTime.Time.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(stamp_);
+                stamp_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000001;
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              type_ = input.readBytes();
+              break;
+            }
+            case 26: {
+              bitField0_ |= 0x00000004;
+              serializedData_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzPacket.internal_static_gazebo_msgs_Packet_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzPacket.internal_static_gazebo_msgs_Packet_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzPacket.Packet.class, gazebo.msgs.GzPacket.Packet.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Packet> PARSER =
+        new com.google.protobuf.AbstractParser<Packet>() {
+      public Packet parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Packet(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Packet> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required .gazebo.msgs.Time stamp = 1;
+    public static final int STAMP_FIELD_NUMBER = 1;
+    private gazebo.msgs.GzTime.Time stamp_;
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    public boolean hasStamp() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    public gazebo.msgs.GzTime.Time getStamp() {
+      return stamp_;
+    }
+    /**
+     * <code>required .gazebo.msgs.Time stamp = 1;</code>
+     */
+    public gazebo.msgs.GzTime.TimeOrBuilder getStampOrBuilder() {
+      return stamp_;
+    }
+
+    // required string type = 2;
+    public static final int TYPE_FIELD_NUMBER = 2;
+    private java.lang.Object type_;
+    /**
+     * <code>required string type = 2;</code>
+     */
+    public boolean hasType() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>required string type = 2;</code>
+     */
+    public java.lang.String getType() {
+      java.lang.Object ref = type_;
+      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();
+        if (bs.isValidUtf8()) {
+          type_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string type = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getTypeBytes() {
+      java.lang.Object ref = type_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        type_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required bytes serialized_data = 3;
+    public static final int SERIALIZED_DATA_FIELD_NUMBER = 3;
+    private com.google.protobuf.ByteString serializedData_;
+    /**
+     * <code>required bytes serialized_data = 3;</code>
+     */
+    public boolean hasSerializedData() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>required bytes serialized_data = 3;</code>
+     */
+    public com.google.protobuf.ByteString getSerializedData() {
+      return serializedData_;
+    }
+
+    private void initFields() {
+      stamp_ = gazebo.msgs.GzTime.Time.getDefaultInstance();
+      type_ = "";
+      serializedData_ = com.google.protobuf.ByteString.EMPTY;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasStamp()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasType()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasSerializedData()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!getStamp().isInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeMessage(1, stamp_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBytes(3, serializedData_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, stamp_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, serializedData_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPacket.Packet parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzPacket.Packet prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Packet}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzPacket.PacketOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzPacket.internal_static_gazebo_msgs_Packet_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzPacket.internal_static_gazebo_msgs_Packet_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzPacket.Packet.class, gazebo.msgs.GzPacket.Packet.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzPacket.Packet.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getStampFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        if (stampBuilder_ == null) {
+          stamp_ = gazebo.msgs.GzTime.Time.getDefaultInstance();
+        } else {
+          stampBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        type_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        serializedData_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzPacket.internal_static_gazebo_msgs_Packet_descriptor;
+      }
+
+      public gazebo.msgs.GzPacket.Packet getDefaultInstanceForType() {
+        return gazebo.msgs.GzPacket.Packet.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzPacket.Packet build() {
+        gazebo.msgs.GzPacket.Packet result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzPacket.Packet buildPartial() {
+        gazebo.msgs.GzPacket.Packet result = new gazebo.msgs.GzPacket.Packet(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        if (stampBuilder_ == null) {
+          result.stamp_ = stamp_;
+        } else {
+          result.stamp_ = stampBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.type_ = type_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.serializedData_ = serializedData_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzPacket.Packet) {
+          return mergeFrom((gazebo.msgs.GzPacket.Packet)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzPacket.Packet other) {
+        if (other == gazebo.msgs.GzPacket.Packet.getDefaultInstance()) return this;
+        if (other.hasStamp()) {
+          mergeStamp(other.getStamp());
+        }
+        if (other.hasType()) {
+          bitField0_ |= 0x00000002;
+          type_ = other.type_;
+          onChanged();
+        }
+        if (other.hasSerializedData()) {
+          setSerializedData(other.getSerializedData());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasStamp()) {
+          
+          return false;
+        }
+        if (!hasType()) {
+          
+          return false;
+        }
+        if (!hasSerializedData()) {
+          
+          return false;
+        }
+        if (!getStamp().isInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzPacket.Packet parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzPacket.Packet) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required .gazebo.msgs.Time stamp = 1;
+      private gazebo.msgs.GzTime.Time stamp_ = gazebo.msgs.GzTime.Time.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          gazebo.msgs.GzTime.Time, gazebo.msgs.GzTime.Time.Builder, gazebo.msgs.GzTime.TimeOrBuilder> stampBuilder_;
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public boolean hasStamp() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public gazebo.msgs.GzTime.Time getStamp() {
+        if (stampBuilder_ == null) {
+          return stamp_;
+        } else {
+          return stampBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public Builder setStamp(gazebo.msgs.GzTime.Time value) {
+        if (stampBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          stamp_ = value;
+          onChanged();
+        } else {
+          stampBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public Builder setStamp(
+          gazebo.msgs.GzTime.Time.Builder builderForValue) {
+        if (stampBuilder_ == null) {
+          stamp_ = builderForValue.build();
+          onChanged();
+        } else {
+          stampBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public Builder mergeStamp(gazebo.msgs.GzTime.Time value) {
+        if (stampBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001) &&
+              stamp_ != gazebo.msgs.GzTime.Time.getDefaultInstance()) {
+            stamp_ =
+              gazebo.msgs.GzTime.Time.newBuilder(stamp_).mergeFrom(value).buildPartial();
+          } else {
+            stamp_ = value;
+          }
+          onChanged();
+        } else {
+          stampBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public Builder clearStamp() {
+        if (stampBuilder_ == null) {
+          stamp_ = gazebo.msgs.GzTime.Time.getDefaultInstance();
+          onChanged();
+        } else {
+          stampBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public gazebo.msgs.GzTime.Time.Builder getStampBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getStampFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      public gazebo.msgs.GzTime.TimeOrBuilder getStampOrBuilder() {
+        if (stampBuilder_ != null) {
+          return stampBuilder_.getMessageOrBuilder();
+        } else {
+          return stamp_;
+        }
+      }
+      /**
+       * <code>required .gazebo.msgs.Time stamp = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilder<
+          gazebo.msgs.GzTime.Time, gazebo.msgs.GzTime.Time.Builder, gazebo.msgs.GzTime.TimeOrBuilder> 
+          getStampFieldBuilder() {
+        if (stampBuilder_ == null) {
+          stampBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              gazebo.msgs.GzTime.Time, gazebo.msgs.GzTime.Time.Builder, gazebo.msgs.GzTime.TimeOrBuilder>(
+                  stamp_,
+                  getParentForChildren(),
+                  isClean());
+          stamp_ = null;
+        }
+        return stampBuilder_;
+      }
+
+      // required string type = 2;
+      private java.lang.Object type_ = "";
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public boolean hasType() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public java.lang.String getType() {
+        java.lang.Object ref = type_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          type_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public com.google.protobuf.ByteString
+          getTypeBytes() {
+        java.lang.Object ref = type_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          type_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public Builder setType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        type_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public Builder clearType() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        type_ = getDefaultInstance().getType();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string type = 2;</code>
+       */
+      public Builder setTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        type_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required bytes serialized_data = 3;
+      private com.google.protobuf.ByteString serializedData_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>required bytes serialized_data = 3;</code>
+       */
+      public boolean hasSerializedData() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>required bytes serialized_data = 3;</code>
+       */
+      public com.google.protobuf.ByteString getSerializedData() {
+        return serializedData_;
+      }
+      /**
+       * <code>required bytes serialized_data = 3;</code>
+       */
+      public Builder setSerializedData(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        serializedData_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required bytes serialized_data = 3;</code>
+       */
+      public Builder clearSerializedData() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        serializedData_ = getDefaultInstance().getSerializedData();
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Packet)
+    }
+
+    static {
+      defaultInstance = new Packet(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Packet)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Packet_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Packet_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\014packet.proto\022\013gazebo.msgs\032\ntime.proto\"" +
+      "Q\n\006Packet\022 \n\005stamp\030\001 \002(\0132\021.gazebo.msgs.T" +
+      "ime\022\014\n\004type\030\002 \002(\t\022\027\n\017serialized_data\030\003 \002" +
+      "(\014B\nB\010GzPacket"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Packet_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Packet_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Packet_descriptor,
+              new java.lang.String[] { "Stamp", "Type", "SerializedData", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          gazebo.msgs.GzTime.getDescriptor(),
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublish.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublish.java
new file mode 100644
index 0000000..4e1fea2
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublish.java
@@ -0,0 +1,947 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: gazebo/src/msgs/publish.proto
+
+package gazebo.msgs;
+
+public final class GzPublish {
+  private GzPublish() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface PublishOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required string topic = 1;
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    boolean hasTopic();
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    java.lang.String getTopic();
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getTopicBytes();
+
+    // required string msg_type = 2;
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    boolean hasMsgType();
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    java.lang.String getMsgType();
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    com.google.protobuf.ByteString
+        getMsgTypeBytes();
+
+    // required string host = 3;
+    /**
+     * <code>required string host = 3;</code>
+     */
+    boolean hasHost();
+    /**
+     * <code>required string host = 3;</code>
+     */
+    java.lang.String getHost();
+    /**
+     * <code>required string host = 3;</code>
+     */
+    com.google.protobuf.ByteString
+        getHostBytes();
+
+    // required uint32 port = 4;
+    /**
+     * <code>required uint32 port = 4;</code>
+     */
+    boolean hasPort();
+    /**
+     * <code>required uint32 port = 4;</code>
+     */
+    int getPort();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Publish}
+   */
+  public static final class Publish extends
+      com.google.protobuf.GeneratedMessage
+      implements PublishOrBuilder {
+    // Use Publish.newBuilder() to construct.
+    private Publish(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Publish(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Publish defaultInstance;
+    public static Publish getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Publish getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Publish(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              topic_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              msgType_ = input.readBytes();
+              break;
+            }
+            case 26: {
+              bitField0_ |= 0x00000004;
+              host_ = input.readBytes();
+              break;
+            }
+            case 32: {
+              bitField0_ |= 0x00000008;
+              port_ = input.readUInt32();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzPublish.internal_static_gazebo_msgs_Publish_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzPublish.internal_static_gazebo_msgs_Publish_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzPublish.Publish.class, gazebo.msgs.GzPublish.Publish.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Publish> PARSER =
+        new com.google.protobuf.AbstractParser<Publish>() {
+      public Publish parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Publish(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Publish> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required string topic = 1;
+    public static final int TOPIC_FIELD_NUMBER = 1;
+    private java.lang.Object topic_;
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public boolean hasTopic() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public java.lang.String getTopic() {
+      java.lang.Object ref = topic_;
+      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();
+        if (bs.isValidUtf8()) {
+          topic_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getTopicBytes() {
+      java.lang.Object ref = topic_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        topic_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required string msg_type = 2;
+    public static final int MSG_TYPE_FIELD_NUMBER = 2;
+    private java.lang.Object msgType_;
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    public boolean hasMsgType() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    public java.lang.String getMsgType() {
+      java.lang.Object ref = msgType_;
+      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();
+        if (bs.isValidUtf8()) {
+          msgType_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string msg_type = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMsgTypeBytes() {
+      java.lang.Object ref = msgType_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        msgType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required string host = 3;
+    public static final int HOST_FIELD_NUMBER = 3;
+    private java.lang.Object host_;
+    /**
+     * <code>required string host = 3;</code>
+     */
+    public boolean hasHost() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>required string host = 3;</code>
+     */
+    public java.lang.String getHost() {
+      java.lang.Object ref = host_;
+      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();
+        if (bs.isValidUtf8()) {
+          host_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string host = 3;</code>
+     */
+    public com.google.protobuf.ByteString
+        getHostBytes() {
+      java.lang.Object ref = host_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        host_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required uint32 port = 4;
+    public static final int PORT_FIELD_NUMBER = 4;
+    private int port_;
+    /**
+     * <code>required uint32 port = 4;</code>
+     */
+    public boolean hasPort() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    /**
+     * <code>required uint32 port = 4;</code>
+     */
+    public int getPort() {
+      return port_;
+    }
+
+    private void initFields() {
+      topic_ = "";
+      msgType_ = "";
+      host_ = "";
+      port_ = 0;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasTopic()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasMsgType()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasHost()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasPort()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getTopicBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getMsgTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBytes(3, getHostBytes());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeUInt32(4, port_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getTopicBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getMsgTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, getHostBytes());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(4, port_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPublish.Publish parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzPublish.Publish prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Publish}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzPublish.PublishOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzPublish.internal_static_gazebo_msgs_Publish_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzPublish.internal_static_gazebo_msgs_Publish_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzPublish.Publish.class, gazebo.msgs.GzPublish.Publish.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzPublish.Publish.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        topic_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        msgType_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        host_ = "";
+        bitField0_ = (bitField0_ & ~0x00000004);
+        port_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzPublish.internal_static_gazebo_msgs_Publish_descriptor;
+      }
+
+      public gazebo.msgs.GzPublish.Publish getDefaultInstanceForType() {
+        return gazebo.msgs.GzPublish.Publish.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzPublish.Publish build() {
+        gazebo.msgs.GzPublish.Publish result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzPublish.Publish buildPartial() {
+        gazebo.msgs.GzPublish.Publish result = new gazebo.msgs.GzPublish.Publish(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.topic_ = topic_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.msgType_ = msgType_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.host_ = host_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.port_ = port_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzPublish.Publish) {
+          return mergeFrom((gazebo.msgs.GzPublish.Publish)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzPublish.Publish other) {
+        if (other == gazebo.msgs.GzPublish.Publish.getDefaultInstance()) return this;
+        if (other.hasTopic()) {
+          bitField0_ |= 0x00000001;
+          topic_ = other.topic_;
+          onChanged();
+        }
+        if (other.hasMsgType()) {
+          bitField0_ |= 0x00000002;
+          msgType_ = other.msgType_;
+          onChanged();
+        }
+        if (other.hasHost()) {
+          bitField0_ |= 0x00000004;
+          host_ = other.host_;
+          onChanged();
+        }
+        if (other.hasPort()) {
+          setPort(other.getPort());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasTopic()) {
+          
+          return false;
+        }
+        if (!hasMsgType()) {
+          
+          return false;
+        }
+        if (!hasHost()) {
+          
+          return false;
+        }
+        if (!hasPort()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzPublish.Publish parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzPublish.Publish) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required string topic = 1;
+      private java.lang.Object topic_ = "";
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public boolean hasTopic() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public java.lang.String getTopic() {
+        java.lang.Object ref = topic_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          topic_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getTopicBytes() {
+        java.lang.Object ref = topic_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          topic_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder setTopic(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        topic_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder clearTopic() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        topic_ = getDefaultInstance().getTopic();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder setTopicBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        topic_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required string msg_type = 2;
+      private java.lang.Object msgType_ = "";
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public boolean hasMsgType() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public java.lang.String getMsgType() {
+        java.lang.Object ref = msgType_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          msgType_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public com.google.protobuf.ByteString
+          getMsgTypeBytes() {
+        java.lang.Object ref = msgType_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          msgType_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public Builder setMsgType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        msgType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public Builder clearMsgType() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        msgType_ = getDefaultInstance().getMsgType();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string msg_type = 2;</code>
+       */
+      public Builder setMsgTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        msgType_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required string host = 3;
+      private java.lang.Object host_ = "";
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public boolean hasHost() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public java.lang.String getHost() {
+        java.lang.Object ref = host_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          host_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public com.google.protobuf.ByteString
+          getHostBytes() {
+        java.lang.Object ref = host_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          host_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public Builder setHost(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        host_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public Builder clearHost() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        host_ = getDefaultInstance().getHost();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string host = 3;</code>
+       */
+      public Builder setHostBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        host_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required uint32 port = 4;
+      private int port_ ;
+      /**
+       * <code>required uint32 port = 4;</code>
+       */
+      public boolean hasPort() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      /**
+       * <code>required uint32 port = 4;</code>
+       */
+      public int getPort() {
+        return port_;
+      }
+      /**
+       * <code>required uint32 port = 4;</code>
+       */
+      public Builder setPort(int value) {
+        bitField0_ |= 0x00000008;
+        port_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required uint32 port = 4;</code>
+       */
+      public Builder clearPort() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        port_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Publish)
+    }
+
+    static {
+      defaultInstance = new Publish(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Publish)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Publish_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Publish_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\035gazebo/src/msgs/publish.proto\022\013gazebo." +
+      "msgs\"F\n\007Publish\022\r\n\005topic\030\001 \002(\t\022\020\n\010msg_ty" +
+      "pe\030\002 \002(\t\022\014\n\004host\030\003 \002(\t\022\014\n\004port\030\004 \002(\rB\013B\t" +
+      "GzPublish"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Publish_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Publish_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Publish_descriptor,
+              new java.lang.String[] { "Topic", "MsgType", "Host", "Port", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublishers.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublishers.java
new file mode 100644
index 0000000..a3bed6e
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzPublishers.java
@@ -0,0 +1,737 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: publishers.proto
+
+package gazebo.msgs;
+
+public final class GzPublishers {
+  private GzPublishers() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface PublishersOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // repeated .gazebo.msgs.Publish publisher = 1;
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    java.util.List<gazebo.msgs.GzPublish.Publish> 
+        getPublisherList();
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    gazebo.msgs.GzPublish.Publish getPublisher(int index);
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    int getPublisherCount();
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    java.util.List<? extends gazebo.msgs.GzPublish.PublishOrBuilder> 
+        getPublisherOrBuilderList();
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    gazebo.msgs.GzPublish.PublishOrBuilder getPublisherOrBuilder(
+        int index);
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Publishers}
+   */
+  public static final class Publishers extends
+      com.google.protobuf.GeneratedMessage
+      implements PublishersOrBuilder {
+    // Use Publishers.newBuilder() to construct.
+    private Publishers(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Publishers(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Publishers defaultInstance;
+    public static Publishers getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Publishers getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Publishers(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+                publisher_ = new java.util.ArrayList<gazebo.msgs.GzPublish.Publish>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              publisher_.add(input.readMessage(gazebo.msgs.GzPublish.Publish.PARSER, extensionRegistry));
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+          publisher_ = java.util.Collections.unmodifiableList(publisher_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzPublishers.internal_static_gazebo_msgs_Publishers_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzPublishers.internal_static_gazebo_msgs_Publishers_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzPublishers.Publishers.class, gazebo.msgs.GzPublishers.Publishers.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Publishers> PARSER =
+        new com.google.protobuf.AbstractParser<Publishers>() {
+      public Publishers parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Publishers(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Publishers> getParserForType() {
+      return PARSER;
+    }
+
+    // repeated .gazebo.msgs.Publish publisher = 1;
+    public static final int PUBLISHER_FIELD_NUMBER = 1;
+    private java.util.List<gazebo.msgs.GzPublish.Publish> publisher_;
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    public java.util.List<gazebo.msgs.GzPublish.Publish> getPublisherList() {
+      return publisher_;
+    }
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    public java.util.List<? extends gazebo.msgs.GzPublish.PublishOrBuilder> 
+        getPublisherOrBuilderList() {
+      return publisher_;
+    }
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    public int getPublisherCount() {
+      return publisher_.size();
+    }
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    public gazebo.msgs.GzPublish.Publish getPublisher(int index) {
+      return publisher_.get(index);
+    }
+    /**
+     * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+     */
+    public gazebo.msgs.GzPublish.PublishOrBuilder getPublisherOrBuilder(
+        int index) {
+      return publisher_.get(index);
+    }
+
+    private void initFields() {
+      publisher_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      for (int i = 0; i < getPublisherCount(); i++) {
+        if (!getPublisher(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < publisher_.size(); i++) {
+        output.writeMessage(1, publisher_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < publisher_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, publisher_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzPublishers.Publishers parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzPublishers.Publishers prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Publishers}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzPublishers.PublishersOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzPublishers.internal_static_gazebo_msgs_Publishers_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzPublishers.internal_static_gazebo_msgs_Publishers_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzPublishers.Publishers.class, gazebo.msgs.GzPublishers.Publishers.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzPublishers.Publishers.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getPublisherFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        if (publisherBuilder_ == null) {
+          publisher_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          publisherBuilder_.clear();
+        }
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzPublishers.internal_static_gazebo_msgs_Publishers_descriptor;
+      }
+
+      public gazebo.msgs.GzPublishers.Publishers getDefaultInstanceForType() {
+        return gazebo.msgs.GzPublishers.Publishers.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzPublishers.Publishers build() {
+        gazebo.msgs.GzPublishers.Publishers result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzPublishers.Publishers buildPartial() {
+        gazebo.msgs.GzPublishers.Publishers result = new gazebo.msgs.GzPublishers.Publishers(this);
+        int from_bitField0_ = bitField0_;
+        if (publisherBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            publisher_ = java.util.Collections.unmodifiableList(publisher_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.publisher_ = publisher_;
+        } else {
+          result.publisher_ = publisherBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzPublishers.Publishers) {
+          return mergeFrom((gazebo.msgs.GzPublishers.Publishers)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzPublishers.Publishers other) {
+        if (other == gazebo.msgs.GzPublishers.Publishers.getDefaultInstance()) return this;
+        if (publisherBuilder_ == null) {
+          if (!other.publisher_.isEmpty()) {
+            if (publisher_.isEmpty()) {
+              publisher_ = other.publisher_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensurePublisherIsMutable();
+              publisher_.addAll(other.publisher_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.publisher_.isEmpty()) {
+            if (publisherBuilder_.isEmpty()) {
+              publisherBuilder_.dispose();
+              publisherBuilder_ = null;
+              publisher_ = other.publisher_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              publisherBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getPublisherFieldBuilder() : null;
+            } else {
+              publisherBuilder_.addAllMessages(other.publisher_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        for (int i = 0; i < getPublisherCount(); i++) {
+          if (!getPublisher(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzPublishers.Publishers parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzPublishers.Publishers) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // repeated .gazebo.msgs.Publish publisher = 1;
+      private java.util.List<gazebo.msgs.GzPublish.Publish> publisher_ =
+        java.util.Collections.emptyList();
+      private void ensurePublisherIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          publisher_ = new java.util.ArrayList<gazebo.msgs.GzPublish.Publish>(publisher_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilder<
+          gazebo.msgs.GzPublish.Publish, gazebo.msgs.GzPublish.Publish.Builder, gazebo.msgs.GzPublish.PublishOrBuilder> publisherBuilder_;
+
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public java.util.List<gazebo.msgs.GzPublish.Publish> getPublisherList() {
+        if (publisherBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(publisher_);
+        } else {
+          return publisherBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public int getPublisherCount() {
+        if (publisherBuilder_ == null) {
+          return publisher_.size();
+        } else {
+          return publisherBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public gazebo.msgs.GzPublish.Publish getPublisher(int index) {
+        if (publisherBuilder_ == null) {
+          return publisher_.get(index);
+        } else {
+          return publisherBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder setPublisher(
+          int index, gazebo.msgs.GzPublish.Publish value) {
+        if (publisherBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePublisherIsMutable();
+          publisher_.set(index, value);
+          onChanged();
+        } else {
+          publisherBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder setPublisher(
+          int index, gazebo.msgs.GzPublish.Publish.Builder builderForValue) {
+        if (publisherBuilder_ == null) {
+          ensurePublisherIsMutable();
+          publisher_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          publisherBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder addPublisher(gazebo.msgs.GzPublish.Publish value) {
+        if (publisherBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePublisherIsMutable();
+          publisher_.add(value);
+          onChanged();
+        } else {
+          publisherBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder addPublisher(
+          int index, gazebo.msgs.GzPublish.Publish value) {
+        if (publisherBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePublisherIsMutable();
+          publisher_.add(index, value);
+          onChanged();
+        } else {
+          publisherBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder addPublisher(
+          gazebo.msgs.GzPublish.Publish.Builder builderForValue) {
+        if (publisherBuilder_ == null) {
+          ensurePublisherIsMutable();
+          publisher_.add(builderForValue.build());
+          onChanged();
+        } else {
+          publisherBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder addPublisher(
+          int index, gazebo.msgs.GzPublish.Publish.Builder builderForValue) {
+        if (publisherBuilder_ == null) {
+          ensurePublisherIsMutable();
+          publisher_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          publisherBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder addAllPublisher(
+          java.lang.Iterable<? extends gazebo.msgs.GzPublish.Publish> values) {
+        if (publisherBuilder_ == null) {
+          ensurePublisherIsMutable();
+          super.addAll(values, publisher_);
+          onChanged();
+        } else {
+          publisherBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder clearPublisher() {
+        if (publisherBuilder_ == null) {
+          publisher_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          publisherBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public Builder removePublisher(int index) {
+        if (publisherBuilder_ == null) {
+          ensurePublisherIsMutable();
+          publisher_.remove(index);
+          onChanged();
+        } else {
+          publisherBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public gazebo.msgs.GzPublish.Publish.Builder getPublisherBuilder(
+          int index) {
+        return getPublisherFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public gazebo.msgs.GzPublish.PublishOrBuilder getPublisherOrBuilder(
+          int index) {
+        if (publisherBuilder_ == null) {
+          return publisher_.get(index);  } else {
+          return publisherBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public java.util.List<? extends gazebo.msgs.GzPublish.PublishOrBuilder> 
+           getPublisherOrBuilderList() {
+        if (publisherBuilder_ != null) {
+          return publisherBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(publisher_);
+        }
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public gazebo.msgs.GzPublish.Publish.Builder addPublisherBuilder() {
+        return getPublisherFieldBuilder().addBuilder(
+            gazebo.msgs.GzPublish.Publish.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public gazebo.msgs.GzPublish.Publish.Builder addPublisherBuilder(
+          int index) {
+        return getPublisherFieldBuilder().addBuilder(
+            index, gazebo.msgs.GzPublish.Publish.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .gazebo.msgs.Publish publisher = 1;</code>
+       */
+      public java.util.List<gazebo.msgs.GzPublish.Publish.Builder> 
+           getPublisherBuilderList() {
+        return getPublisherFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          gazebo.msgs.GzPublish.Publish, gazebo.msgs.GzPublish.Publish.Builder, gazebo.msgs.GzPublish.PublishOrBuilder> 
+          getPublisherFieldBuilder() {
+        if (publisherBuilder_ == null) {
+          publisherBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              gazebo.msgs.GzPublish.Publish, gazebo.msgs.GzPublish.Publish.Builder, gazebo.msgs.GzPublish.PublishOrBuilder>(
+                  publisher_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          publisher_ = null;
+        }
+        return publisherBuilder_;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Publishers)
+    }
+
+    static {
+      defaultInstance = new Publishers(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Publishers)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Publishers_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Publishers_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\020publishers.proto\022\013gazebo.msgs\032\rpublish" +
+      ".proto\"5\n\nPublishers\022\'\n\tpublisher\030\001 \003(\0132" +
+      "\024.gazebo.msgs.PublishB\016B\014GzPublishers"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Publishers_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Publishers_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Publishers_descriptor,
+              new java.lang.String[] { "Publisher", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          gazebo.msgs.GzPublish.getDescriptor(),
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzString.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzString.java
new file mode 100644
index 0000000..54b5752
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzString.java
@@ -0,0 +1,528 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: gz_string.proto
+
+package gazebo.msgs;
+
+public final class GzString {
+  private GzString() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface StringOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required string data = 1;
+    /**
+     * <code>required string data = 1;</code>
+     */
+    boolean hasData();
+    /**
+     * <code>required string data = 1;</code>
+     */
+    java.lang.String getData();
+    /**
+     * <code>required string data = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getDataBytes();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.String}
+   */
+  public static final class String extends
+      com.google.protobuf.GeneratedMessage
+      implements StringOrBuilder {
+    // Use String.newBuilder() to construct.
+    private String(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private String(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final String defaultInstance;
+    public static String getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public String getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private String(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              data_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzString.internal_static_gazebo_msgs_String_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzString.internal_static_gazebo_msgs_String_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzString.String.class, gazebo.msgs.GzString.String.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<String> PARSER =
+        new com.google.protobuf.AbstractParser<String>() {
+      public String parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new String(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<String> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required string data = 1;
+    public static final int DATA_FIELD_NUMBER = 1;
+    private java.lang.Object data_;
+    /**
+     * <code>required string data = 1;</code>
+     */
+    public boolean hasData() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required string data = 1;</code>
+     */
+    public java.lang.String getData() {
+      java.lang.Object ref = data_;
+      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();
+        if (bs.isValidUtf8()) {
+          data_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string data = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getDataBytes() {
+      java.lang.Object ref = data_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        data_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private void initFields() {
+      data_ = "";
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasData()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getDataBytes());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getDataBytes());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzString.String parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzString.String parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzString.String parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzString.String parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzString.String prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.String}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzString.StringOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzString.internal_static_gazebo_msgs_String_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzString.internal_static_gazebo_msgs_String_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzString.String.class, gazebo.msgs.GzString.String.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzString.String.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        data_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzString.internal_static_gazebo_msgs_String_descriptor;
+      }
+
+      public gazebo.msgs.GzString.String getDefaultInstanceForType() {
+        return gazebo.msgs.GzString.String.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzString.String build() {
+        gazebo.msgs.GzString.String result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzString.String buildPartial() {
+        gazebo.msgs.GzString.String result = new gazebo.msgs.GzString.String(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.data_ = data_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzString.String) {
+          return mergeFrom((gazebo.msgs.GzString.String)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzString.String other) {
+        if (other == gazebo.msgs.GzString.String.getDefaultInstance()) return this;
+        if (other.hasData()) {
+          bitField0_ |= 0x00000001;
+          data_ = other.data_;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasData()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzString.String parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzString.String) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required string data = 1;
+      private java.lang.Object data_ = "";
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public java.lang.String getData() {
+        java.lang.Object ref = data_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          data_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getDataBytes() {
+        java.lang.Object ref = data_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          data_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public Builder setData(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        data_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public Builder clearData() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        data_ = getDefaultInstance().getData();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string data = 1;</code>
+       */
+      public Builder setDataBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        data_ = value;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.String)
+    }
+
+    static {
+      defaultInstance = new String(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.String)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_String_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_String_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\017gz_string.proto\022\013gazebo.msgs\"\026\n\006String" +
+      "\022\014\n\004data\030\001 \002(\t"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_String_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_String_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_String_descriptor,
+              new java.lang.String[] { "Data", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzSubscribe.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzSubscribe.java
new file mode 100644
index 0000000..b29c447
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzSubscribe.java
@@ -0,0 +1,1028 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: subscribe.proto
+
+package gazebo.msgs;
+
+public final class GzSubscribe {
+  private GzSubscribe() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface SubscribeOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required string topic = 1;
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    boolean hasTopic();
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    java.lang.String getTopic();
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getTopicBytes();
+
+    // required string host = 2;
+    /**
+     * <code>required string host = 2;</code>
+     */
+    boolean hasHost();
+    /**
+     * <code>required string host = 2;</code>
+     */
+    java.lang.String getHost();
+    /**
+     * <code>required string host = 2;</code>
+     */
+    com.google.protobuf.ByteString
+        getHostBytes();
+
+    // required uint32 port = 3;
+    /**
+     * <code>required uint32 port = 3;</code>
+     */
+    boolean hasPort();
+    /**
+     * <code>required uint32 port = 3;</code>
+     */
+    int getPort();
+
+    // required string msg_type = 4;
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    boolean hasMsgType();
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    java.lang.String getMsgType();
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    com.google.protobuf.ByteString
+        getMsgTypeBytes();
+
+    // optional bool latching = 5 [default = true];
+    /**
+     * <code>optional bool latching = 5 [default = true];</code>
+     */
+    boolean hasLatching();
+    /**
+     * <code>optional bool latching = 5 [default = true];</code>
+     */
+    boolean getLatching();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Subscribe}
+   */
+  public static final class Subscribe extends
+      com.google.protobuf.GeneratedMessage
+      implements SubscribeOrBuilder {
+    // Use Subscribe.newBuilder() to construct.
+    private Subscribe(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Subscribe(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Subscribe defaultInstance;
+    public static Subscribe getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Subscribe getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Subscribe(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              topic_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              host_ = input.readBytes();
+              break;
+            }
+            case 24: {
+              bitField0_ |= 0x00000004;
+              port_ = input.readUInt32();
+              break;
+            }
+            case 34: {
+              bitField0_ |= 0x00000008;
+              msgType_ = input.readBytes();
+              break;
+            }
+            case 40: {
+              bitField0_ |= 0x00000010;
+              latching_ = input.readBool();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzSubscribe.internal_static_gazebo_msgs_Subscribe_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzSubscribe.internal_static_gazebo_msgs_Subscribe_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzSubscribe.Subscribe.class, gazebo.msgs.GzSubscribe.Subscribe.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Subscribe> PARSER =
+        new com.google.protobuf.AbstractParser<Subscribe>() {
+      public Subscribe parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Subscribe(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Subscribe> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required string topic = 1;
+    public static final int TOPIC_FIELD_NUMBER = 1;
+    private java.lang.Object topic_;
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public boolean hasTopic() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public java.lang.String getTopic() {
+      java.lang.Object ref = topic_;
+      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();
+        if (bs.isValidUtf8()) {
+          topic_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string topic = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getTopicBytes() {
+      java.lang.Object ref = topic_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        topic_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required string host = 2;
+    public static final int HOST_FIELD_NUMBER = 2;
+    private java.lang.Object host_;
+    /**
+     * <code>required string host = 2;</code>
+     */
+    public boolean hasHost() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>required string host = 2;</code>
+     */
+    public java.lang.String getHost() {
+      java.lang.Object ref = host_;
+      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();
+        if (bs.isValidUtf8()) {
+          host_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string host = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getHostBytes() {
+      java.lang.Object ref = host_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        host_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // required uint32 port = 3;
+    public static final int PORT_FIELD_NUMBER = 3;
+    private int port_;
+    /**
+     * <code>required uint32 port = 3;</code>
+     */
+    public boolean hasPort() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>required uint32 port = 3;</code>
+     */
+    public int getPort() {
+      return port_;
+    }
+
+    // required string msg_type = 4;
+    public static final int MSG_TYPE_FIELD_NUMBER = 4;
+    private java.lang.Object msgType_;
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    public boolean hasMsgType() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    public java.lang.String getMsgType() {
+      java.lang.Object ref = msgType_;
+      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();
+        if (bs.isValidUtf8()) {
+          msgType_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string msg_type = 4;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMsgTypeBytes() {
+      java.lang.Object ref = msgType_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        msgType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // optional bool latching = 5 [default = true];
+    public static final int LATCHING_FIELD_NUMBER = 5;
+    private boolean latching_;
+    /**
+     * <code>optional bool latching = 5 [default = true];</code>
+     */
+    public boolean hasLatching() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    /**
+     * <code>optional bool latching = 5 [default = true];</code>
+     */
+    public boolean getLatching() {
+      return latching_;
+    }
+
+    private void initFields() {
+      topic_ = "";
+      host_ = "";
+      port_ = 0;
+      msgType_ = "";
+      latching_ = true;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasTopic()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasHost()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasPort()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasMsgType()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getTopicBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getHostBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeUInt32(3, port_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeBytes(4, getMsgTypeBytes());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeBool(5, latching_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getTopicBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getHostBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(3, port_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(4, getMsgTypeBytes());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(5, latching_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzSubscribe.Subscribe parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzSubscribe.Subscribe prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Subscribe}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzSubscribe.SubscribeOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzSubscribe.internal_static_gazebo_msgs_Subscribe_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzSubscribe.internal_static_gazebo_msgs_Subscribe_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzSubscribe.Subscribe.class, gazebo.msgs.GzSubscribe.Subscribe.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzSubscribe.Subscribe.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        topic_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        host_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        port_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        msgType_ = "";
+        bitField0_ = (bitField0_ & ~0x00000008);
+        latching_ = true;
+        bitField0_ = (bitField0_ & ~0x00000010);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzSubscribe.internal_static_gazebo_msgs_Subscribe_descriptor;
+      }
+
+      public gazebo.msgs.GzSubscribe.Subscribe getDefaultInstanceForType() {
+        return gazebo.msgs.GzSubscribe.Subscribe.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzSubscribe.Subscribe build() {
+        gazebo.msgs.GzSubscribe.Subscribe result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzSubscribe.Subscribe buildPartial() {
+        gazebo.msgs.GzSubscribe.Subscribe result = new gazebo.msgs.GzSubscribe.Subscribe(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.topic_ = topic_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.host_ = host_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.port_ = port_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.msgType_ = msgType_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.latching_ = latching_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzSubscribe.Subscribe) {
+          return mergeFrom((gazebo.msgs.GzSubscribe.Subscribe)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzSubscribe.Subscribe other) {
+        if (other == gazebo.msgs.GzSubscribe.Subscribe.getDefaultInstance()) return this;
+        if (other.hasTopic()) {
+          bitField0_ |= 0x00000001;
+          topic_ = other.topic_;
+          onChanged();
+        }
+        if (other.hasHost()) {
+          bitField0_ |= 0x00000002;
+          host_ = other.host_;
+          onChanged();
+        }
+        if (other.hasPort()) {
+          setPort(other.getPort());
+        }
+        if (other.hasMsgType()) {
+          bitField0_ |= 0x00000008;
+          msgType_ = other.msgType_;
+          onChanged();
+        }
+        if (other.hasLatching()) {
+          setLatching(other.getLatching());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasTopic()) {
+          
+          return false;
+        }
+        if (!hasHost()) {
+          
+          return false;
+        }
+        if (!hasPort()) {
+          
+          return false;
+        }
+        if (!hasMsgType()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzSubscribe.Subscribe parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzSubscribe.Subscribe) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required string topic = 1;
+      private java.lang.Object topic_ = "";
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public boolean hasTopic() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public java.lang.String getTopic() {
+        java.lang.Object ref = topic_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          topic_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getTopicBytes() {
+        java.lang.Object ref = topic_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          topic_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder setTopic(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        topic_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder clearTopic() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        topic_ = getDefaultInstance().getTopic();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string topic = 1;</code>
+       */
+      public Builder setTopicBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        topic_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required string host = 2;
+      private java.lang.Object host_ = "";
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public boolean hasHost() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public java.lang.String getHost() {
+        java.lang.Object ref = host_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          host_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public com.google.protobuf.ByteString
+          getHostBytes() {
+        java.lang.Object ref = host_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          host_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public Builder setHost(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        host_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public Builder clearHost() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        host_ = getDefaultInstance().getHost();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string host = 2;</code>
+       */
+      public Builder setHostBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        host_ = value;
+        onChanged();
+        return this;
+      }
+
+      // required uint32 port = 3;
+      private int port_ ;
+      /**
+       * <code>required uint32 port = 3;</code>
+       */
+      public boolean hasPort() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>required uint32 port = 3;</code>
+       */
+      public int getPort() {
+        return port_;
+      }
+      /**
+       * <code>required uint32 port = 3;</code>
+       */
+      public Builder setPort(int value) {
+        bitField0_ |= 0x00000004;
+        port_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required uint32 port = 3;</code>
+       */
+      public Builder clearPort() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        port_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // required string msg_type = 4;
+      private java.lang.Object msgType_ = "";
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public boolean hasMsgType() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public java.lang.String getMsgType() {
+        java.lang.Object ref = msgType_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          msgType_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public com.google.protobuf.ByteString
+          getMsgTypeBytes() {
+        java.lang.Object ref = msgType_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          msgType_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public Builder setMsgType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000008;
+        msgType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public Builder clearMsgType() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        msgType_ = getDefaultInstance().getMsgType();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string msg_type = 4;</code>
+       */
+      public Builder setMsgTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000008;
+        msgType_ = value;
+        onChanged();
+        return this;
+      }
+
+      // optional bool latching = 5 [default = true];
+      private boolean latching_ = true;
+      /**
+       * <code>optional bool latching = 5 [default = true];</code>
+       */
+      public boolean hasLatching() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      /**
+       * <code>optional bool latching = 5 [default = true];</code>
+       */
+      public boolean getLatching() {
+        return latching_;
+      }
+      /**
+       * <code>optional bool latching = 5 [default = true];</code>
+       */
+      public Builder setLatching(boolean value) {
+        bitField0_ |= 0x00000010;
+        latching_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bool latching = 5 [default = true];</code>
+       */
+      public Builder clearLatching() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        latching_ = true;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Subscribe)
+    }
+
+    static {
+      defaultInstance = new Subscribe(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Subscribe)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Subscribe_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Subscribe_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\017subscribe.proto\022\013gazebo.msgs\"`\n\tSubscr" +
+      "ibe\022\r\n\005topic\030\001 \002(\t\022\014\n\004host\030\002 \002(\t\022\014\n\004port" +
+      "\030\003 \002(\r\022\020\n\010msg_type\030\004 \002(\t\022\026\n\010latching\030\005 \001" +
+      "(\010:\004trueB\rB\013GzSubscribe"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Subscribe_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Subscribe_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Subscribe_descriptor,
+              new java.lang.String[] { "Topic", "Host", "Port", "MsgType", "Latching", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzTime.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzTime.java
new file mode 100644
index 0000000..faa0a46
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/GzTime.java
@@ -0,0 +1,542 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: time.proto
+
+package gazebo.msgs;
+
+public final class GzTime {
+  private GzTime() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface TimeOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required int32 sec = 1;
+    /**
+     * <code>required int32 sec = 1;</code>
+     */
+    boolean hasSec();
+    /**
+     * <code>required int32 sec = 1;</code>
+     */
+    int getSec();
+
+    // required int32 nsec = 2;
+    /**
+     * <code>required int32 nsec = 2;</code>
+     */
+    boolean hasNsec();
+    /**
+     * <code>required int32 nsec = 2;</code>
+     */
+    int getNsec();
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.Time}
+   */
+  public static final class Time extends
+      com.google.protobuf.GeneratedMessage
+      implements TimeOrBuilder {
+    // Use Time.newBuilder() to construct.
+    private Time(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private Time(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final Time defaultInstance;
+    public static Time getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public Time getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Time(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              sec_ = input.readInt32();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              nsec_ = input.readInt32();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.GzTime.internal_static_gazebo_msgs_Time_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.GzTime.internal_static_gazebo_msgs_Time_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.GzTime.Time.class, gazebo.msgs.GzTime.Time.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<Time> PARSER =
+        new com.google.protobuf.AbstractParser<Time>() {
+      public Time parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Time(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Time> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required int32 sec = 1;
+    public static final int SEC_FIELD_NUMBER = 1;
+    private int sec_;
+    /**
+     * <code>required int32 sec = 1;</code>
+     */
+    public boolean hasSec() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required int32 sec = 1;</code>
+     */
+    public int getSec() {
+      return sec_;
+    }
+
+    // required int32 nsec = 2;
+    public static final int NSEC_FIELD_NUMBER = 2;
+    private int nsec_;
+    /**
+     * <code>required int32 nsec = 2;</code>
+     */
+    public boolean hasNsec() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>required int32 nsec = 2;</code>
+     */
+    public int getNsec() {
+      return nsec_;
+    }
+
+    private void initFields() {
+      sec_ = 0;
+      nsec_ = 0;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasSec()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasNsec()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt32(1, sec_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeInt32(2, nsec_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, sec_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, nsec_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzTime.Time parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.GzTime.Time parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.GzTime.Time parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.GzTime.Time prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.Time}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.GzTime.TimeOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.GzTime.internal_static_gazebo_msgs_Time_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.GzTime.internal_static_gazebo_msgs_Time_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.GzTime.Time.class, gazebo.msgs.GzTime.Time.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.GzTime.Time.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        sec_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        nsec_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.GzTime.internal_static_gazebo_msgs_Time_descriptor;
+      }
+
+      public gazebo.msgs.GzTime.Time getDefaultInstanceForType() {
+        return gazebo.msgs.GzTime.Time.getDefaultInstance();
+      }
+
+      public gazebo.msgs.GzTime.Time build() {
+        gazebo.msgs.GzTime.Time result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.GzTime.Time buildPartial() {
+        gazebo.msgs.GzTime.Time result = new gazebo.msgs.GzTime.Time(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.sec_ = sec_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.nsec_ = nsec_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.GzTime.Time) {
+          return mergeFrom((gazebo.msgs.GzTime.Time)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.GzTime.Time other) {
+        if (other == gazebo.msgs.GzTime.Time.getDefaultInstance()) return this;
+        if (other.hasSec()) {
+          setSec(other.getSec());
+        }
+        if (other.hasNsec()) {
+          setNsec(other.getNsec());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasSec()) {
+          
+          return false;
+        }
+        if (!hasNsec()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.GzTime.Time parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.GzTime.Time) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required int32 sec = 1;
+      private int sec_ ;
+      /**
+       * <code>required int32 sec = 1;</code>
+       */
+      public boolean hasSec() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required int32 sec = 1;</code>
+       */
+      public int getSec() {
+        return sec_;
+      }
+      /**
+       * <code>required int32 sec = 1;</code>
+       */
+      public Builder setSec(int value) {
+        bitField0_ |= 0x00000001;
+        sec_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required int32 sec = 1;</code>
+       */
+      public Builder clearSec() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        sec_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // required int32 nsec = 2;
+      private int nsec_ ;
+      /**
+       * <code>required int32 nsec = 2;</code>
+       */
+      public boolean hasNsec() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>required int32 nsec = 2;</code>
+       */
+      public int getNsec() {
+        return nsec_;
+      }
+      /**
+       * <code>required int32 nsec = 2;</code>
+       */
+      public Builder setNsec(int value) {
+        bitField0_ |= 0x00000002;
+        nsec_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required int32 nsec = 2;</code>
+       */
+      public Builder clearNsec() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        nsec_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.Time)
+    }
+
+    static {
+      defaultInstance = new Time(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.Time)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_Time_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_Time_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\ntime.proto\022\013gazebo.msgs\"!\n\004Time\022\013\n\003sec" +
+      "\030\001 \002(\005\022\014\n\004nsec\030\002 \002(\005B\010B\006GzTime"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_Time_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_Time_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_Time_descriptor,
+              new java.lang.String[] { "Sec", "Nsec", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/gazebo/msgs/StringV.java b/simulation/JavaGazebo/src/main/java/gazebo/msgs/StringV.java
new file mode 100644
index 0000000..5945d1e
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/gazebo/msgs/StringV.java
@@ -0,0 +1,546 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: string_v.proto
+
+package gazebo.msgs;
+
+public final class StringV {
+  private StringV() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface String_VOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // repeated string data = 1;
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    java.util.List<java.lang.String>
+    getDataList();
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    int getDataCount();
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    java.lang.String getData(int index);
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getDataBytes(int index);
+  }
+  /**
+   * Protobuf type {@code gazebo.msgs.String_V}
+   */
+  public static final class String_V extends
+      com.google.protobuf.GeneratedMessage
+      implements String_VOrBuilder {
+    // Use String_V.newBuilder() to construct.
+    private String_V(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private String_V(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final String_V defaultInstance;
+    public static String_V getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public String_V getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private String_V(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      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;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+                data_ = new com.google.protobuf.LazyStringArrayList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              data_.add(input.readBytes());
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+          data_ = new com.google.protobuf.UnmodifiableLazyStringList(data_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return gazebo.msgs.StringV.internal_static_gazebo_msgs_String_V_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return gazebo.msgs.StringV.internal_static_gazebo_msgs_String_V_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              gazebo.msgs.StringV.String_V.class, gazebo.msgs.StringV.String_V.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<String_V> PARSER =
+        new com.google.protobuf.AbstractParser<String_V>() {
+      public String_V parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new String_V(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<String_V> getParserForType() {
+      return PARSER;
+    }
+
+    // repeated string data = 1;
+    public static final int DATA_FIELD_NUMBER = 1;
+    private com.google.protobuf.LazyStringList data_;
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    public java.util.List<java.lang.String>
+        getDataList() {
+      return data_;
+    }
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    public int getDataCount() {
+      return data_.size();
+    }
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    public java.lang.String getData(int index) {
+      return data_.get(index);
+    }
+    /**
+     * <code>repeated string data = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getDataBytes(int index) {
+      return data_.getByteString(index);
+    }
+
+    private void initFields() {
+      data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < data_.size(); i++) {
+        output.writeBytes(1, data_.getByteString(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        for (int i = 0; i < data_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeBytesSizeNoTag(data_.getByteString(i));
+        }
+        size += dataSize;
+        size += 1 * getDataList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.StringV.String_V parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static gazebo.msgs.StringV.String_V parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static gazebo.msgs.StringV.String_V parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(gazebo.msgs.StringV.String_V prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code gazebo.msgs.String_V}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements gazebo.msgs.StringV.String_VOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return gazebo.msgs.StringV.internal_static_gazebo_msgs_String_V_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return gazebo.msgs.StringV.internal_static_gazebo_msgs_String_V_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                gazebo.msgs.StringV.String_V.class, gazebo.msgs.StringV.String_V.Builder.class);
+      }
+
+      // Construct using gazebo.msgs.StringV.String_V.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return gazebo.msgs.StringV.internal_static_gazebo_msgs_String_V_descriptor;
+      }
+
+      public gazebo.msgs.StringV.String_V getDefaultInstanceForType() {
+        return gazebo.msgs.StringV.String_V.getDefaultInstance();
+      }
+
+      public gazebo.msgs.StringV.String_V build() {
+        gazebo.msgs.StringV.String_V result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public gazebo.msgs.StringV.String_V buildPartial() {
+        gazebo.msgs.StringV.String_V result = new gazebo.msgs.StringV.String_V(this);
+        int from_bitField0_ = bitField0_;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          data_ = new com.google.protobuf.UnmodifiableLazyStringList(
+              data_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.data_ = data_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof gazebo.msgs.StringV.String_V) {
+          return mergeFrom((gazebo.msgs.StringV.String_V)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(gazebo.msgs.StringV.String_V other) {
+        if (other == gazebo.msgs.StringV.String_V.getDefaultInstance()) return this;
+        if (!other.data_.isEmpty()) {
+          if (data_.isEmpty()) {
+            data_ = other.data_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureDataIsMutable();
+            data_.addAll(other.data_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        gazebo.msgs.StringV.String_V parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (gazebo.msgs.StringV.String_V) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // repeated string data = 1;
+      private com.google.protobuf.LazyStringList data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      private void ensureDataIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          data_ = new com.google.protobuf.LazyStringArrayList(data_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public java.util.List<java.lang.String>
+          getDataList() {
+        return java.util.Collections.unmodifiableList(data_);
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public int getDataCount() {
+        return data_.size();
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public java.lang.String getData(int index) {
+        return data_.get(index);
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getDataBytes(int index) {
+        return data_.getByteString(index);
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public Builder setData(
+          int index, java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDataIsMutable();
+        data_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public Builder addData(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDataIsMutable();
+        data_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public Builder addAllData(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureDataIsMutable();
+        super.addAll(values, data_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public Builder clearData() {
+        data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated string data = 1;</code>
+       */
+      public Builder addDataBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDataIsMutable();
+        data_.add(value);
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:gazebo.msgs.String_V)
+    }
+
+    static {
+      defaultInstance = new String_V(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:gazebo.msgs.String_V)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_gazebo_msgs_String_V_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_gazebo_msgs_String_V_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\016string_v.proto\022\013gazebo.msgs\"\030\n\010String_" +
+      "V\022\014\n\004data\030\001 \003(\t"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_gazebo_msgs_String_V_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_gazebo_msgs_String_V_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_gazebo_msgs_String_V_descriptor,
+              new java.lang.String[] { "Data", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Connection.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Connection.java
new file mode 100644
index 0000000..994c78f
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Connection.java
@@ -0,0 +1,159 @@
+package org.gazebosim.transport;
+
+import gazebo.msgs.GzPacket.Packet;
+import gazebo.msgs.GzTime.Time;
+
+import java.io.IOException;
+import java.net.ConnectException;
+import java.net.InetAddress;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+import com.google.protobuf.ByteString;
+import com.google.protobuf.Message;
+
+/**
+ * Manages a Gazebo protocol connection.
+ *
+ * This can connect to either the Gazebo server, or to a data
+ * publisher. Additionally, it can act as the TCP client, or as a
+ * server. In either case, it provides methods to read and write
+ * structured data on the socket.
+ */
+public class Connection {
+	private static int HEADER_SIZE = 8;
+	
+	public String host;
+	public int port;
+	
+	private Socket socket;
+	private ServerSocket ssocket;
+	private InputStream is;
+	private OutputStream os;
+	
+	private static final Logger LOG = Logger.getLogger("Gazebo Transport");
+
+	public void connect(String host, int port) throws UnknownHostException, IOException {
+		this.host = host;
+		this.port = port;
+		socket = new Socket(host, port);
+		is = socket.getInputStream();
+		os = socket.getOutputStream();
+	}
+
+	public void connectAndWait(String host, int port) throws IOException, InterruptedException {
+		this.host = host;
+		this.port = port;
+		while (true) {
+			try {
+				socket = new Socket(host, port);
+				break;
+			} catch (ConnectException ex) {
+				// Retry.
+				LOG.log(Level.WARNING, "Cannot connect, retrying in five seconds.", ex);
+				Thread.sleep(5000);
+			}
+		}
+		is = socket.getInputStream();
+		os = socket.getOutputStream();
+	}
+
+	public void serve(final ServerCallback cb) throws IOException {
+		ssocket = new ServerSocket(0);
+		host = ssocket.getInetAddress().getHostAddress();
+		port = ssocket.getLocalPort();
+
+		//enable user to change master uri via environment variable GAZEBO_MASTER_URI
+		//TODO : allow for automatic guesing of IP. Look at Connection.cc in gazebo for C++ example
+		String user_defined_ip = System.getenv("GAZEBO_IP");
+        if (user_defined_ip != null) {
+          host = InetAddress.getByName(user_defined_ip).getHostAddress();;
+          LOG.warning("Using custom host: "+host);
+        }
+
+		new Thread("Gazebo Server Thread") {
+			@Override
+			public void run() {
+				LOG.config("Listening on "+host+":"+port);
+				while (true) {
+					Connection conn = new Connection();
+					try {
+						conn.socket = ssocket.accept();
+						conn.is = conn.socket.getInputStream();
+						conn.os = conn.socket.getOutputStream();
+						LOG.info("Handling connect from "+conn.socket.getInetAddress());
+						cb.handle(conn);
+					} catch (IOException e) {
+						LOG.log(Level.WARNING, "Cannot handle client", e);
+					}
+				}
+			}
+		}.start();
+	}
+
+	public void close() throws IOException {
+		LOG.info("Closing connection");
+		if (socket != null) {
+			socket.close();
+			socket = null;
+		}
+		if (ssocket != null) {
+			ssocket.close();
+			ssocket = null;
+		}
+	}
+	
+	public byte[] rawRead() throws IOException {
+		synchronized (is) {
+			// Figure out the message size
+			byte[] buff= new byte[HEADER_SIZE];
+			int n = is.read(buff);
+			if (n != HEADER_SIZE) {
+				LOG.severe("Only read "+n+" bytes instead of 8 for header.");
+				return null;
+			}
+			int size = Integer.parseInt(new String(buff), 16);
+		
+			// Read in the actual message
+			buff = new byte[size];
+			n = is.read(buff);
+			if (n != size) {
+				throw new IOException("Failed to read whole message");
+			}
+			
+			return buff;
+		}
+	}
+	
+	public Packet read() throws IOException {
+		byte[] buff = rawRead();
+		if (buff == null) {
+			return null;
+		}
+		return Packet.parseFrom(buff);
+	}
+
+	public void write(Message msg) throws IOException {
+        ByteString data = msg.toByteString();
+        ByteString header = ByteString.copyFromUtf8(String.format("%08X", data.size()));
+        ByteString bytes = header.concat(data);
+
+        synchronized (os) {
+			os.write(bytes.toByteArray());
+		}
+	}
+
+	public void writePacket(String name, Message req) throws IOException {
+		long ms = System.currentTimeMillis();
+		Time t = Time.newBuilder().setSec((int) (ms / 1000)).setNsec((int) ((ms%1000)*1000)).build();
+		Packet pack = Packet.newBuilder().setType(name).setStamp(t)
+							.setSerializedData(req.toByteString()).build();
+		write(pack);
+	}
+
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Msgs.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Msgs.java
new file mode 100644
index 0000000..5062408
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Msgs.java
@@ -0,0 +1,31 @@
+package org.gazebosim.transport;
+
+import gazebo.msgs.GzBool.Bool;
+import gazebo.msgs.GzFloat64;
+import gazebo.msgs.GzString;
+
+public class Msgs {
+	public static GzString.String String() {
+		return GzString.String.getDefaultInstance();
+	}
+	
+	public static GzString.String String(String s) {
+		return GzString.String.newBuilder().setData(s).build();
+	}
+	
+	public static GzFloat64.Float64 Float64() {
+		return GzFloat64.Float64.getDefaultInstance();
+	}
+	
+	public static GzFloat64.Float64 Float64(double d) {
+		return GzFloat64.Float64.newBuilder().setData(d).build();
+	}
+	
+	public static Bool Bool() {
+		return Bool.getDefaultInstance();
+	}
+	
+	public static Bool Bool(boolean b) {
+		return Bool.newBuilder().setData(b).build();
+	}
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Node.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Node.java
new file mode 100644
index 0000000..455d452
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Node.java
@@ -0,0 +1,246 @@
+package org.gazebosim.transport;
+
+import gazebo.msgs.GzPacket.Packet;
+import gazebo.msgs.GzPublish.Publish;
+import gazebo.msgs.GzPublishers.Publishers;
+import gazebo.msgs.GzString;
+import gazebo.msgs.GzSubscribe.Subscribe;
+import gazebo.msgs.StringV.String_V;
+
+import java.io.IOException;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Message;
+
+public class Node implements Runnable, ServerCallback {
+	private final String name;
+	private final Connection master = new Connection();
+	private final Connection server = new Connection();
+	private final List<String> namespaces = new LinkedList<>();
+	private final Map<String, PublisherRecord> publishers = new HashMap<>();
+	@SuppressWarnings("rawtypes")
+	private final Map<String, Subscriber> subscriptions = new HashMap<>();
+	private static final Logger LOG = Logger.getLogger("Gazebo Transport");
+	static {
+		// Get rid of the excess information
+		LOG.setLevel(Level.WARNING);
+		Handler[] handlers = LOG.getParent().getHandlers();
+		if (handlers[0] instanceof ConsoleHandler) {
+			((ConsoleHandler) handlers[0]).setFormatter(new Formatter() {
+				@Override
+				public String format(LogRecord record) {
+					return String.format("%s|%s: %s\n", record.getLevel(), record.getLoggerName(), record.getMessage());
+				}
+			});
+		}
+	}
+
+	public Node(String name) {
+		this.name = name;
+	}
+
+	public void waitForConnection() throws IOException, InterruptedException {
+		//enable user to change master uri via environment variable GAZEBO_MASTER_URI
+		String user_defined_uri = System.getenv("GAZEBO_MASTER_URI");
+		String gazebo_master_uri = "localhost";
+		int port = 11345;
+		if (user_defined_uri != null) {
+			String[] parts = user_defined_uri.split(":");
+			if (parts.length != 2){
+				LOG.severe("invalid GAZEBO_MASTER_URI " + user_defined_uri+ ". URI must be of the form HOSTNAME:PORT");
+				LOG.warning("using default GAZEBO_MASTER_URI=localhost:11345");
+			}
+			else {
+				gazebo_master_uri = parts[0];
+				port = Integer.parseInt(parts[1]);
+			}
+		}
+
+		server.serve(this);
+
+		LOG.info("GAZEBO_MASTER_URI is host=" + gazebo_master_uri + " port="+port);
+
+		master.connectAndWait(gazebo_master_uri, port);
+
+		initializeConnection();
+
+		new Thread(this).start();
+		LOG.info("Serving on: "+server.host+":"+server.port);
+	}
+
+	public synchronized <T extends Message> Publisher<T> advertise(String topic, T defaultMessage) {
+		topic = fixTopic(topic);
+		LOG.info("ADV "+topic);
+		String type = defaultMessage.getDescriptorForType().getFullName();
+		Publisher<T> pub = new Publisher<T>(topic, type, server.host, server.port);
+		publishers.put(topic, pub);
+
+		Publish req = Publish.newBuilder().setTopic(topic).setMsgType(type)
+						.setHost(server.host).setPort(server.port).build();
+		try {
+			master.writePacket("advertise", req);
+		} catch (IOException e) {
+			e.printStackTrace(); // FIXME: Shouldn't happen, should probably complain louder
+		}
+		return pub;
+	}
+
+	public synchronized <T extends Message> Subscriber<T>
+			subscribe(String topic, T defaultMessage, SubscriberCallback<T> cb) {
+		topic = fixTopic(topic);
+		LOG.info("SUB "+topic);
+		if (subscriptions.containsKey(topic)) {
+			throw new RuntimeException("Multiple subscribers for: "+topic);
+		}
+
+		String type = defaultMessage.getDescriptorForType().getFullName();
+		Subscribe req = Subscribe.newBuilder().setTopic(topic).setMsgType(type)
+							.setHost(server.host).setPort(server.port).setLatching(false).build();
+		try {
+			master.writePacket("subscribe", req);
+		} catch (IOException e) {
+			e.printStackTrace(); // FIXME: Shouldn't happen, should probably complain louder
+		}
+
+		Subscriber<T> s = new Subscriber<>(topic, type, cb, defaultMessage,
+				server.host, server.port);
+		subscriptions.put(topic, s);
+		for (PublisherRecord p : publishers.values()) {
+			if (p.getTopic().equals(topic)) {
+				s.connect(p);
+			}
+		}
+		return s;
+	}
+
+	@Override
+	public void run() {
+		try {
+			while (true) {
+				Packet packet = master.read();
+				if (packet == null) {
+					LOG.severe("Received null packet, shutting down connection to master.");
+					master.close();
+					return;
+				}
+				processPacket(packet);
+			}
+		} catch (IOException e ) {
+			LOG.severe("I/O error: " + e);
+			e.printStackTrace(); // FIXME: Log
+		}
+	}
+
+	private synchronized void initializeConnection() throws IOException {
+		Packet initData = master.read();
+		if (!initData.getType().equals("version_init")) {
+			throw new IOException("Expected 'version_init' packet, got '"+initData.getType()+"'.");
+		}
+		GzString.String version = GzString.String.parseFrom(initData.getSerializedData());
+		LOG.info("Version: "+version.getData()); // TODO: Check version
+
+		Packet namespaceData = master.read();
+		String_V ns = String_V.parseFrom(namespaceData.getSerializedData());
+		namespaces.addAll(ns.getDataList());
+		LOG.info(namespaces.toString());
+
+		Packet publisherData = master.read();
+		if (publisherData.getType().equals("publishers_init")) {
+			Publishers pubs = Publishers.parseFrom(publisherData.getSerializedData());
+			for (Publish pub : pubs.getPublisherList()) {
+				PublisherRecord record = new RemotePublisherRecord(pub);
+				publishers.put(record.getTopic(), record);
+			}
+			LOG.info(publishers.toString());
+		} else {
+			LOG.severe("No publisher data received.");
+		}
+	}
+
+	public synchronized void processPacket(Packet packet) throws InvalidProtocolBufferException {
+		if (packet.getType().equals("publisher_add")) {
+			PublisherRecord pub = new RemotePublisherRecord(Publish.parseFrom(packet.getSerializedData()));
+
+			if (pub.getHost().equals(server.host) && pub.getPort() == server.port) {
+				LOG.info("ACK "+pub.getTopic());
+				return; // This is us
+			}
+
+			LOG.info("New Publisher: "+pub.getTopic());
+			LOG.fine("Publisher: "+Publish.parseFrom(packet.getSerializedData()));
+			publishers.put(pub.getTopic(), pub);
+		} else if (packet.getType().equals("publisher_subscribe") ||
+				   packet.getType().equals("publisher_advertise")) {
+			PublisherRecord pub = new RemotePublisherRecord(Publish.parseFrom(packet.getSerializedData()));
+
+			if (pub.getHost().equals(server.host) && pub.getPort() == server.port) {
+				LOG.info("Ignoring subscription request on (local) "+pub.getTopic());
+				return; // This is us
+			}
+
+			LOG.info("PUBSUB found for "+pub.getTopic());
+			LOG.fine("Publisher: "+Publish.parseFrom(packet.getSerializedData()));
+			subscriptions.get(pub.getTopic()).connect(pub);
+		} else if (packet.getType().equals("topic_namespace_add")) {
+			namespaces.add(GzString.String.parseFrom(packet.getSerializedData()).getData());
+			LOG.info("New Namespace: "+namespaces.get(namespaces.size()-1));
+		} else if (packet.getType().equals("unsubscribe")) {
+			Subscribe sub = Subscribe.parseFrom(packet.getSerializedData());
+			LOG.warning("Ignoring unsubscribe: "+sub);
+		} else {
+			LOG.warning("Can't handle "+packet.getType());
+		}
+	}
+
+	@Override
+	/**
+	 * This is called when another node requests subscription to a topic we are publishing
+	 */
+	public void handle(Connection conn) throws IOException {
+		LOG.fine("Handling new connection");
+		Packet msg = conn.read();
+		if (msg == null) {
+			LOG.warning("Read null message.");
+			return;
+		}
+
+		if (msg.getType().equals("sub")) {
+			Subscribe sub = Subscribe.parseFrom(msg.getSerializedData());
+			if (!publishers.containsKey(sub.getTopic())) {
+				LOG.severe("Subscription for unknown topic: "
+						+ sub.getTopic());
+				return;
+			}
+			LOG.fine("New connection for topic="+sub.getTopic());
+
+			PublisherRecord pub = publishers.get(sub.getTopic());
+			if (!pub.getMsgType().equals(sub.getMsgType())) {
+				LOG.severe(String.format("Message type mismatch requested=%d publishing=%s\n",
+										 pub.getMsgType(), sub.getMsgType()));
+				return;
+			}
+
+			LOG.info("CONN " + sub.getTopic());
+			//Tell the publisher that it has recieved a connection from a subscriver
+			pub.connect(conn);
+		} else {
+			LOG.warning("Unknown message type: " + msg.getType());
+		}
+	}
+
+	private String fixTopic(String topic) {
+		return "/gazebo/" + name + "/" + topic;
+	}
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Publisher.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Publisher.java
new file mode 100644
index 0000000..ebf9749
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Publisher.java
@@ -0,0 +1,112 @@
+package org.gazebosim.transport;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import com.google.protobuf.Message;
+
+public class Publisher<T extends Message> implements PublisherRecord {
+	private String topic, msgType;
+	private String localHost;
+	private int localPort;
+	private List<Connection> listeners;
+	private boolean latching = false;
+	private T lastMsg = null;
+	
+	private static final Logger LOG = Logger.getLogger("Gazebo Transport");
+	
+	public Publisher(String topic, String msgType, String localHost, int localPort) {
+		this.topic = topic;
+		this.msgType = msgType;
+		this.localHost = localHost;
+		this.localPort = localPort;
+		listeners = new LinkedList<>();
+	}
+
+	public synchronized void publish(T msg) {
+		lastMsg = msg;
+		List<Connection> toRemove = new LinkedList<>();
+		for (Connection listener : listeners) {
+			try {
+				listener.write(msg);
+			} catch (IOException e) {
+				toRemove.add(listener);
+			}
+		}
+		for (Connection listener : toRemove) {
+			LOG.info("Removing listener from topic="+topic);
+			try {
+				listener.close();
+			} catch (IOException e1) { /* Closing failed, probably not a big deal. */}
+			listeners.remove(listener);
+		}
+	}
+
+	@Override
+	public String getTopic() {
+		return topic;
+	}
+
+	@Override
+	public String getHost() {
+		return localHost;
+	}
+
+	@Override
+	public int getPort() {
+		return localPort;
+	}
+
+	@Override
+	public String getMsgType() {
+		return msgType;
+	}
+
+	@Override
+	/**
+	 * This function is called when another topic requests a subscription to a topic I am publishing
+	 * Called in Node.java in the handle() function
+	 */
+	public synchronized void connect(Connection conn) {
+		LOG.fine("Handling subscriber connection for topic: "+topic);
+		if (latching && lastMsg != null) {
+			try {
+				conn.write(lastMsg);
+			} catch (IOException e) {
+				LOG.warning("Writing latched message failed on topic="+topic);
+				try {
+					conn.close();
+				} catch (IOException e1) { /* Closing failed, probably not a big deal. */}
+				return;
+			}
+		}
+		listeners.add(conn);
+		this.notifyAll();
+	}
+
+	public synchronized void waitForConnection() throws InterruptedException {
+		while (this.listeners.isEmpty()) {
+			this.wait();
+		}
+	}
+
+	public synchronized boolean waitForConnection(long timeout_millis) throws InterruptedException {
+		long start = System.currentTimeMillis();
+
+		while (this.listeners.isEmpty()) {
+			long remain = timeout_millis - (System.currentTimeMillis() - start);
+			if (remain <= 0) {
+				break;
+			}
+			this.wait(remain);
+		}
+
+		return !this.listeners.isEmpty();
+	}
+
+	public void setLatchMode(boolean b) {
+		latching = b;
+	}
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/PublisherRecord.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/PublisherRecord.java
new file mode 100644
index 0000000..90ab604
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/PublisherRecord.java
@@ -0,0 +1,9 @@
+package org.gazebosim.transport;
+
+public interface PublisherRecord {
+	String getTopic();
+	String getHost();
+	int getPort();
+	String getMsgType();
+	void connect(Connection conn);
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/RemotePublisherRecord.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/RemotePublisherRecord.java
new file mode 100644
index 0000000..83d290e
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/RemotePublisherRecord.java
@@ -0,0 +1,40 @@
+package org.gazebosim.transport;
+
+import gazebo.msgs.GzPublish.Publish;
+
+public class RemotePublisherRecord implements PublisherRecord {
+	private Publish pub;
+
+	public RemotePublisherRecord(Publish pub) {
+		this.pub = pub;
+	}
+
+	@Override
+	public String getTopic() {
+		return pub.getTopic();
+	}
+
+	@Override
+	public String getHost() {
+		return pub.getHost();
+	}
+
+	@Override
+	public int getPort() {
+		return pub.getPort();
+	}
+
+	@Override
+	public String getMsgType() {
+		return pub.getMsgType();
+	}
+	
+	public String toString() {
+		return String.format("%s (%s) %s:%s", getTopic(), getMsgType(), getHost(), getPort()); 
+	}
+
+	@Override
+	public void connect(Connection conn) {
+		throw new RuntimeException("Someone thinks we're a remote server, can't connect.");
+	}
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/ServerCallback.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/ServerCallback.java
new file mode 100644
index 0000000..b9a6576
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/ServerCallback.java
@@ -0,0 +1,7 @@
+package org.gazebosim.transport;
+
+import java.io.IOException;
+
+public interface ServerCallback {
+	void handle(Connection conn) throws IOException;
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Subscriber.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Subscriber.java
new file mode 100644
index 0000000..12770ee
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/Subscriber.java
@@ -0,0 +1,77 @@
+package org.gazebosim.transport;
+
+import gazebo.msgs.GzSubscribe.Subscribe;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import com.google.protobuf.Message;
+import com.google.protobuf.Parser;
+
+public class Subscriber<T extends Message> {
+	private String topic, msgType;
+	private SubscriberCallback<T> cb;
+	private Parser<T> deserializer;
+	@SuppressWarnings("unused")
+	private String localHost;
+	@SuppressWarnings("unused")
+	private int localPort;
+	private List<Connection> connections;
+	private static final Logger LOG = Logger.getLogger("Gazebo Transport");
+
+	@SuppressWarnings("unchecked")
+	public Subscriber(String topic, String msgType, SubscriberCallback<T> cb,
+			T deserializer, String localHost, int localPort) {
+		this.topic = topic;
+		this.msgType = msgType;
+		this.cb = cb;
+		this.deserializer = (Parser<T>) deserializer.getParserForType();
+		this.localHost = localHost;
+		this.localPort = localPort;
+		connections = new LinkedList<>();
+	}
+
+	public void connect(final PublisherRecord pub) {
+		new Thread(new Runnable() {
+			@Override
+			public void run() {
+				handle_connect(pub);
+			}
+		}).start();
+	}
+
+	private void handle_connect(PublisherRecord pub) {
+		LOG.fine(String.format("CONN for %s from %s:%s\n", topic, pub.getHost(),
+									pub.getPort()));
+		Connection conn = new Connection();
+		try {
+			conn.connect(pub.getHost(), pub.getPort());
+			connections.add(conn);
+
+			Subscribe sub = Subscribe.newBuilder().setTopic(topic)
+					.setMsgType(msgType).setHost(pub.getHost())
+					.setPort(pub.getPort()).setLatching(false).build();
+			conn.writePacket("sub", sub);
+
+			while (true) {
+				byte[] data = conn.rawRead();
+				if (data == null) {
+					connections.remove(conn);
+					return;
+				}
+				T msg = deserializer.parseFrom(data);
+				cb.callback(msg);
+			}
+		} catch (IOException e) {
+			// FIXME: Connection lost, let's make sure it's closed and complain.
+			// Hopefully they try to reconnect, maybe we should try to recover better?
+			try {
+				conn.close();
+			} catch (IOException e1) {
+			}
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/SubscriberCallback.java b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/SubscriberCallback.java
new file mode 100644
index 0000000..5ed5269
--- /dev/null
+++ b/simulation/JavaGazebo/src/main/java/org/gazebosim/transport/SubscriberCallback.java
@@ -0,0 +1,5 @@
+package org.gazebosim.transport;
+
+public interface SubscriberCallback<T> {
+	void callback(T msg);
+}
diff --git a/simulation/README.md b/simulation/README.md
new file mode 100644
index 0000000..eb58dd5
--- /dev/null
+++ b/simulation/README.md
@@ -0,0 +1,29 @@
+## Simulation Directory
+
+Observe the following directory structure
+
+.
+|-- frc_gazebo_plugins (contains Gazebo Plugins)
+|   |-- clock
+|   |-- dc_motor
+|   |-- encoder
+|   |-- gyro
+|   |-- plugins
+|   |-- pneumatic_piston
+|   |-- potentiometer
+|   |-- rangefinder
+|   |-- servo
+|
+|-- frcsim.bat (launches gazebo with model/plugin paths on windows)
+|-- frcsim.sh (launches gazebo with model/plugin paths on linux/mac)
+|-- install.sh (convenient linux script to install Eclipse, Eclipse Plugins, and Gazebo)
+|-- JavaGazebo (java library used by java simulation. Equivelant of the C++ gazebo_transport)
+|-- SimDS (linux driverstation)
+
+The gazbeo plugins are currently built with CMake.
+Eventually they will be built with gradle.
+
+All of this is delivered to students via the eclipse plugins
+
+## Building
+see the top level building.md
diff --git a/simulation/SimDS/build.gradle b/simulation/SimDS/build.gradle
new file mode 100644
index 0000000..0acaaee
--- /dev/null
+++ b/simulation/SimDS/build.gradle
@@ -0,0 +1,54 @@
+apply plugin: 'java'
+apply plugin: 'application'
+apply plugin: 'com.github.johnrengelman.shadow'
+apply plugin: 'maven-publish'
+
+// Adds the dependency for the shadow plugin, which creates an uberjar with all dependencies
+buildscript {
+    repositories { jcenter() }
+    dependencies {
+        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.1'
+    }
+}
+
+publishing {
+    publications {
+        maven(MavenPublication) {
+            artifact(shadowJar) {
+                // The shadow plugin has the 'all' classifier. We don't want this, so use null instead
+                classifier null
+            }
+            artifact(simDsSources) {
+                classifier 'sources'
+            }
+            artifact(simDsJavadoc) {
+                classifier 'javadoc'
+            }
+            groupId 'edu.wpi.first.wpilibj.simulation'
+            artifactId 'SimDS'
+            version '0.1.0-SNAPSHOT'
+        }
+    }
+    setupWpilibRepo(it)
+}
+
+mainClassName = 'edu.wpi.first.wpilibj.simulation.ds.Main'
+
+dependencies {
+    compile 'net.java.jinput:jinput:2.0.5'
+    compile project(':simulation:JavaGazebo')
+}
+
+task simDsSources(type: Jar, dependsOn: classes) {
+    description = 'Creates the sources jar for the SimDS'
+    group = 'WPILib'
+    classifier = 'sources'
+    from sourceSets.main.allJava
+}
+
+task simDsJavadoc(type: Jar, dependsOn: javadoc) {
+    description = 'Creates the javadoc jar for the SimDS'
+    group = 'WPILib'
+    classifier = 'javadoc'
+    from javadoc.destinationDir
+}
\ No newline at end of file
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/DS.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/DS.java
new file mode 100644
index 0000000..bd12c41
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/DS.java
@@ -0,0 +1,152 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DropMode;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
+import org.gazebosim.transport.Node;
+import org.gazebosim.transport.Publisher;
+
+import edu.wpi.first.wpilibj.simulation.ds.FakeJoystick;
+import edu.wpi.first.wpilibj.simulation.ds.ISimJoystick;
+import edu.wpi.first.wpilibj.simulation.ds.JoystickProvider;
+import gazebo.msgs.GzDriverStation.DriverStation;
+
+public class DS {
+	private JoystickProvider joystickProvider;
+	private JoystickList joysticks;
+	
+	private JFrame mainframe;
+	private JPanel modePanel;
+	private ActionListener modeListener;
+	private ButtonGroup modes;
+	private JButton enable, refresh;
+	
+	public enum State {
+		Disabled, Teleop, Autonomous, Test;
+	}
+	private boolean enabled = false;
+	private State state = State.Teleop;
+	private DriverStation.State protoState = DriverStation.State.TELEOP;
+	private Publisher<DriverStation> pub;
+	
+	public DS(JoystickProvider joystickProvider) {
+		this.joystickProvider = joystickProvider;
+		mainframe = new JFrame();
+		mainframe.setTitle("FRC Simulation DriverStation");
+		mainframe.setLayout(new GridBagLayout());
+		GridBagConstraints constraints = new GridBagConstraints();
+		
+		makeModeButtons(constraints);
+        mainframe.pack();
+		constraints.gridy = 1;
+		makeEnableButton(constraints);
+
+		constraints.gridx = 1;
+		constraints.gridy = 0;
+		makeJoystickUI(constraints);
+        mainframe.pack();
+		constraints.gridy = 1;
+		makeRefreshButton(constraints);
+        
+        mainframe.pack();
+        mainframe.setVisible(true);
+	}
+	
+	private void makeModeButtons(GridBagConstraints constraints) {
+		modePanel = new JPanel();
+		modePanel.setLayout(new BoxLayout(modePanel, BoxLayout.PAGE_AXIS));
+		
+		modeListener = new ModeAction(this);
+		JRadioButton teleop = new JRadioButton("Teleop");
+		teleop.setActionCommand(State.Teleop.toString());
+		teleop.addActionListener(modeListener);
+		JRadioButton auto = new JRadioButton("Autonomous");
+		auto.setActionCommand(State.Autonomous.toString());
+		auto.addActionListener(modeListener);
+		JRadioButton test = new JRadioButton("Test");
+		test.setActionCommand(State.Test.toString());
+		test.addActionListener(modeListener);
+		teleop.setSelected(true);
+		
+		modes = new ButtonGroup();
+		modes.add(teleop);
+		modes.add(auto);
+		modes.add(test);
+		modePanel.add(teleop);
+		modePanel.add(auto);
+		modePanel.add(test);
+		mainframe.add(modePanel, constraints);
+	}
+		
+	private void makeEnableButton(GridBagConstraints constraints) {
+		enable = new JButton("Enable");
+		enable.addActionListener(new EnableAction(this));
+		enable.setPreferredSize(new Dimension(modePanel.getSize().width, 50));
+		mainframe.add(enable, constraints);
+	}
+	
+	private void makeJoystickUI(GridBagConstraints constraints) {
+		joysticks = new JoystickList(joystickProvider);
+		mainframe.add(joysticks, constraints);
+		scanForJoysticks();
+	}
+
+	public void scanForJoysticks() {
+		joysticks.removeAll();
+		List<ISimJoystick> sticks = joystickProvider.scanForJoysticks();
+		while (sticks.size() < 6) {
+			sticks.add(new FakeJoystick());
+		}
+		joysticks.setListData(sticks);
+	}
+	
+	private void makeRefreshButton(GridBagConstraints constraints) {
+		refresh = new JButton("Refresh Joysticks");
+		refresh.addActionListener(new RefreshAction(this));
+		refresh.setPreferredSize(new Dimension(joysticks.getSize().width, 50));
+		mainframe.add(refresh, constraints);
+	}
+	
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+		enable.setText(enabled ? "Disable" : "Enable");
+	}
+	
+	public State getState() {
+		return enabled ? state : State.Disabled;
+	}
+
+	public void setState(State state) {
+		setEnabled(false);
+		this.state = state;
+		switch (state) {
+		case Autonomous: protoState = DriverStation.State.AUTO; break;
+		case Teleop: protoState = DriverStation.State.TELEOP; break;
+		case Test: protoState = DriverStation.State.TEST; break;
+		default: break;
+		}
+	}
+
+	public void toggleEnable() {
+		setEnabled(!enabled);
+	}
+
+	public void advertise(Node node) {
+		pub = node.advertise("ds/state", DriverStation.getDefaultInstance());
+	}
+
+	public void publish() {
+		pub.publish(DriverStation.newBuilder().setEnabled(enabled).setState(protoState).build());
+	}
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/EnableAction.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/EnableAction.java
new file mode 100644
index 0000000..f847568
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/EnableAction.java
@@ -0,0 +1,18 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class EnableAction implements ActionListener {
+	private DS ds;
+	
+	public EnableAction(DS ds) {
+		this.ds = ds;
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		ds.toggleEnable();
+	}
+
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/FakeJoystick.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/FakeJoystick.java
new file mode 100644
index 0000000..4831a27
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/FakeJoystick.java
@@ -0,0 +1,19 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import org.gazebosim.transport.Node;
+
+
+public class FakeJoystick implements ISimJoystick {
+
+	public String getName() {
+		return "Empty Joystick";
+	}
+	
+	public String toString() {
+		return getName();
+	}
+
+	@Override public void advertise(Node node, int i) {}
+
+	@Override public void publish() {}
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ISimJoystick.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ISimJoystick.java
new file mode 100644
index 0000000..9263a1b
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ISimJoystick.java
@@ -0,0 +1,9 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import org.gazebosim.transport.Node;
+
+public interface ISimJoystick {
+	String getName();
+	void advertise(Node node, int i);
+	void publish();
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickList.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickList.java
new file mode 100644
index 0000000..f598a3d
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickList.java
@@ -0,0 +1,118 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceEvent;
+import java.awt.dnd.DragSourceListener;
+import java.util.List;
+
+import javax.swing.DropMode;
+import javax.swing.JList;
+import javax.swing.TransferHandler;
+
+import edu.wpi.first.wpilibj.simulation.ds.ISimJoystick;
+import edu.wpi.first.wpilibj.simulation.ds.JoystickProvider;
+
+@SuppressWarnings("serial")
+public class JoystickList extends JList<ISimJoystick> {
+	private JoystickProvider joystickProvider;
+	List<ISimJoystick> joysticks;
+
+	public JoystickList(JoystickProvider joystickProvider) {
+		super();
+		this.joystickProvider = joystickProvider;
+
+		setDragEnabled(true);
+		setDropMode(DropMode.INSERT);
+
+		setTransferHandler(new DropHandler(this));
+		new DragListener(this);
+	}
+
+	public void moveElement(int index, int dropTargetIndex) {
+		ISimJoystick move = joysticks.get(index);
+		joysticks.add(dropTargetIndex, move);
+		joysticks.remove(index < dropTargetIndex ? index : index + 1);
+		setListData(joysticks);
+	}
+
+	public void setListData(List<ISimJoystick> sticks) {
+		joysticks = sticks;
+		setListData(sticks.toArray(new ISimJoystick[0]));
+		joystickProvider.setJoysticks(sticks);
+	}
+
+	class DragListener implements DragSourceListener, DragGestureListener {
+		JoystickList list;
+
+		DragSource ds = new DragSource();
+
+		public DragListener(JoystickList list) {
+			this.list = list;
+			ds.createDefaultDragGestureRecognizer(
+					list, DnDConstants.ACTION_MOVE, this);
+		}
+
+		public void dragGestureRecognized(DragGestureEvent dge) {
+			StringSelection transferable = new StringSelection(
+					Integer.toString(list.getSelectedIndex()));
+			ds.startDrag(dge, DragSource.DefaultCopyDrop, transferable, this);
+		}
+
+		public void dragEnter(DragSourceDragEvent dsde) {}
+		public void dragExit(DragSourceEvent dse) {}
+		public void dragOver(DragSourceDragEvent dsde) {}
+		public void dragDropEnd(DragSourceDropEvent dsde) {}
+		public void dropActionChanged(DragSourceDragEvent dsde) {}
+	}
+
+	class DropHandler extends TransferHandler {
+		JoystickList list;
+
+		public DropHandler(JoystickList list) {
+			this.list = list;
+		}
+
+		public boolean canImport(TransferHandler.TransferSupport support) {
+			if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+				return false;
+			}
+			JList.DropLocation dl = (JList.DropLocation) support
+					.getDropLocation();
+			if (dl.getIndex() == -1) {
+				return false;
+			} else {
+				return true;
+			}
+		}
+
+		public boolean importData(TransferHandler.TransferSupport support) {
+			if (!canImport(support)) {
+				return false;
+			}
+
+			Transferable transferable = support.getTransferable();
+			String indexString;
+			try {
+				indexString = (String) transferable.getTransferData(DataFlavor.stringFlavor);
+			} catch (Exception e) {
+				return false;
+			}
+
+			int index = Integer.parseInt(indexString);
+			JList.DropLocation dl = (JList.DropLocation) support.getDropLocation();
+			int dropTargetIndex = dl.getIndex();
+			
+			list.moveElement(index, dropTargetIndex);
+
+			return true;
+		}
+	}
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickProvider.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickProvider.java
new file mode 100644
index 0000000..4c22320
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/JoystickProvider.java
@@ -0,0 +1,44 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import edu.wpi.first.wpilibj.simulation.ds.ISimJoystick;
+import edu.wpi.first.wpilibj.simulation.ds.SimJoystick;
+
+import net.java.games.input.Controller;
+import net.java.games.input.ControllerEnvironment;
+
+public class JoystickProvider {
+	List<ISimJoystick> joysticks;
+	
+	public JoystickProvider() {
+		scanForJoysticks();
+	}
+	
+	public List<ISimJoystick> scanForJoysticks() {
+		List<ISimJoystick> foundControllers = new ArrayList<>();
+		Controller[] controllers = ControllerEnvironment.getDefaultEnvironment().getControllers();
+
+        for(int i = 0; i < controllers.length; i++){
+            Controller controller = controllers[i];
+            if (controller.getType() == Controller.Type.STICK
+            		|| controller.getType() == Controller.Type.GAMEPAD 
+                    || controller.getType() == Controller.Type.WHEEL
+                    || controller.getType() == Controller.Type.FINGERSTICK) {
+                foundControllers.add(new SimJoystick(controller));
+            }
+        }
+        
+        joysticks = foundControllers;
+        return foundControllers;
+	}
+	
+	public List<ISimJoystick> getJoysticks() {
+        return joysticks;
+	}
+	
+	public void setJoysticks(List<ISimJoystick> joysticks) {
+		this.joysticks = joysticks;
+	}
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/Main.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/Main.java
new file mode 100644
index 0000000..2f5188a
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/Main.java
@@ -0,0 +1,61 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import gazebo.msgs.GzFloat64.Float64;
+
+import org.gazebosim.transport.Msgs;
+import org.gazebosim.transport.Node;
+import org.gazebosim.transport.Subscriber;
+import org.gazebosim.transport.SubscriberCallback;
+
+public class Main {
+	private static double simTime = 0;
+	private static Subscriber<Float64> sub;
+	
+	public static void main(String args[]) {
+		Node node = new Node("frc");
+		try {
+			node.waitForConnection();
+		} catch (Throwable thr) {
+			System.err.println("Could not connect to Gazebo.");
+			thr.printStackTrace();
+			System.exit(1);
+			return;
+		}
+
+		JoystickProvider provider = new JoystickProvider();
+		DS ds = new DS(provider);
+		ds.advertise(node);
+
+    	sub = node.subscribe("time", Msgs.Float64(),
+			new SubscriberCallback<Float64>() {
+				@Override
+				public void callback(Float64 msg) {
+					simTime = msg.getData();
+					synchronized(sub) {
+						sub.notifyAll();
+					}
+				}
+			}
+		);
+
+		while (true) {
+	    	final double start = simTime;
+			for (int i = 0; i < provider.getJoysticks().size(); i++) {
+				ISimJoystick joystick = provider.getJoysticks().get(i);
+				joystick.advertise(node, i);
+				joystick.publish();
+			}
+			ds.publish();
+
+	    	while ((simTime - start) < 0.020 /*20ms*/) {
+	    		synchronized(sub) {
+	    			try {
+	    				sub.wait(); // Block until time progresses
+	    			} catch (InterruptedException e) {
+	    				e.printStackTrace();
+	    			}
+	    		}
+			}
+		}
+	}
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ModeAction.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ModeAction.java
new file mode 100644
index 0000000..532ef67
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/ModeAction.java
@@ -0,0 +1,18 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class ModeAction implements ActionListener {
+	private DS ds;
+	
+	public ModeAction(DS ds) {
+		this.ds = ds;
+	}
+	
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		ds.setState(DS.State.valueOf(e.getActionCommand()));
+	}
+
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/RefreshAction.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/RefreshAction.java
new file mode 100644
index 0000000..5f264e0
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/RefreshAction.java
@@ -0,0 +1,18 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class RefreshAction implements ActionListener {
+	private DS ds;
+
+	public RefreshAction(DS ds) {
+		this.ds = ds;
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent arg0) {
+		ds.scanForJoysticks();
+	}
+
+}
diff --git a/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/SimJoystick.java b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/SimJoystick.java
new file mode 100644
index 0000000..23794ca
--- /dev/null
+++ b/simulation/SimDS/src/main/java/edu/wpi/first/wpilibj/simulation/ds/SimJoystick.java
@@ -0,0 +1,69 @@
+package edu.wpi.first.wpilibj.simulation.ds;
+
+import gazebo.msgs.GzJoystick.Joystick;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gazebosim.transport.Node;
+import org.gazebosim.transport.Publisher;
+
+import net.java.games.input.Component;
+import net.java.games.input.Controller;
+
+public class SimJoystick implements ISimJoystick {
+	private Controller controller;
+	private List<Component> axes, buttons;
+	private Publisher<Joystick> pub = null;
+	private int prevI = -1; private Node prevNode = null;
+
+	public SimJoystick(Controller controller) {
+		this.controller = controller;
+		axes = new ArrayList<>();
+		buttons = new ArrayList<>();
+        for(Component c : controller.getComponents()) {
+        	if (c.getIdentifier() instanceof Component.Identifier.Axis) {
+        		axes.add(c);
+        	} else if (c.getIdentifier() instanceof Component.Identifier.Button) {
+        		buttons.add(c);
+        	}
+        }
+	}
+
+	@Override
+	public String getName() {
+		return controller.getName();
+	}
+
+	@Override	
+	public String toString() {
+		return getName();
+	}
+
+	@Override
+	public void advertise(Node node, int i) {
+		if (pub == null) {
+			// I'm good
+		} else if (prevI != i || prevNode != node) {
+			// TODO: pub.close();
+		} else {
+			return; // No change
+		}
+		pub = node.advertise("ds/joysticks/"+i, Joystick.getDefaultInstance());
+		prevNode = node;
+		prevI = i;
+	}
+	
+	@Override
+	public void publish() {
+		controller.poll();
+		Joystick.Builder builder = Joystick.newBuilder();
+		for (Component a : axes) {
+			builder.addAxes(a.getPollData());
+		}
+		for (Component b : buttons) {
+			builder.addButtons(b.getPollData() > 0.5);
+		}
+		pub.publish(builder.build());
+	}
+}
diff --git a/simulation/frc_gazebo_plugins/.gitignore b/simulation/frc_gazebo_plugins/.gitignore
new file mode 100644
index 0000000..45bb3aa
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/.gitignore
@@ -0,0 +1,5 @@
+plugins/
+build/
+docs/
+# don't commit the generated protobuff files
+msgs/src/msgs
diff --git a/simulation/frc_gazebo_plugins/CMakeLists.txt b/simulation/frc_gazebo_plugins/CMakeLists.txt
new file mode 100644
index 0000000..1d45789
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 2.8.3)
+project(frc_gazebo_plugins)
+
+set (PLUGINS
+	clock
+	dc_motor
+	encoder
+	gyro
+	limit_switch
+	pneumatic_piston
+	potentiometer
+	rangefinder
+	servo)
+
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/plugins)
+
+link_directories(${GAZEBO_LIBRARY_DIRS})
+
+foreach(PLUGIN ${PLUGINS})
+
+	file(GLOB_RECURSE SRC_FILES ${PLUGIN}/src/*.cpp)
+
+  include_directories(src ${Boost_INCLUDE_DIR} ${GZ_MSGS_INCLUDE_DIR} ${PROTOBUF_INCLUDE_DIRS} ${GAZEBO_INCLUDE_DIRS})
+
+	if (WIN32)
+		add_library(${PLUGIN} ${SRC_FILES})
+	else()
+		add_library(${PLUGIN} SHARED ${SRC_FILES})
+	endif()
+
+	target_link_libraries(${PLUGIN} gz_msgs ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
+
+  install(TARGETS ${PLUGIN} DESTINATION $ENV{HOME}/wpilib/simulation/plugins)
+
+endforeach()
diff --git a/simulation/frc_gazebo_plugins/README.md b/simulation/frc_gazebo_plugins/README.md
new file mode 100644
index 0000000..73e57e6
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/README.md
@@ -0,0 +1,9 @@
+Notes for building the gazebo plugins
+=====================================
+
+the resulting plugins (shared libraries, `.so/.dll`) are delivered to students via the eclipse simulation plugins, and unzipped to `${HOME}/wpilib/simulation/plugins`
+
+## Building
+these are built with cmake, because they use the gazebo libraries.
+gazebo libraries provide cmake-config files, so cmake is easier to use here.
+See top level building.md for how to build
diff --git a/simulation/frc_gazebo_plugins/clock/src/clock.cpp b/simulation/frc_gazebo_plugins/clock/src/clock.cpp
new file mode 100644
index 0000000..32cd3b7
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/clock/src/clock.cpp
@@ -0,0 +1,37 @@
+#include "clock.h"
+
+GZ_REGISTER_MODEL_PLUGIN(Clock)
+
+Clock::Clock() {}
+
+Clock::~Clock() {}
+
+void Clock::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  gzmsg << "Initializing clock: " << topic << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  pub = node->Advertise<msgs::Float64>(topic);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Clock::Update, this, _1));
+}
+
+void Clock::Update(const common::UpdateInfo &info) {
+  msgs::Float64 msg;
+  msg.set_data(info.simTime.Double());
+  pub->Publish(msg);
+}
diff --git a/simulation/frc_gazebo_plugins/clock/src/clock.h b/simulation/frc_gazebo_plugins/clock/src/clock.h
new file mode 100644
index 0000000..4590471
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/clock/src/clock.h
@@ -0,0 +1,48 @@
+#pragma once
+
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/gazebo.hh>
+
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for publishing the simulation time.
+ *
+ * This plugin publishes the simualtaion time in seconds every physics
+ * update.
+ *
+ * To add a clock to your robot, add the following XML to your robot
+ * model:
+ *
+ *     <plugin name="my_clock" filename="libgz_clock.so">
+ *       <topic>~/my/topic</topic>
+ *     </plugin>
+ *
+ * - `topic`: Optional. Message will be published as a gazebo.msgs.Float64.
+ *
+ * \todo Make WorldPlugin?
+ */
+class Clock: public ModelPlugin {
+public:
+  Clock();
+  ~Clock();
+
+  /// \brief Load the clock and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out time each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  std::string topic;               ///< \brief Publish the time on this topic.
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::PublisherPtr pub;     ///< \brief Publisher handle.
+};
+
diff --git a/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.cpp b/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.cpp
new file mode 100644
index 0000000..0b4bbab
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.cpp
@@ -0,0 +1,50 @@
+#include "dc_motor.h"
+
+GZ_REGISTER_MODEL_PLUGIN(DCMotor)
+
+DCMotor::DCMotor() {}
+
+DCMotor::~DCMotor() {}
+
+void DCMotor::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+  signal = 0;
+
+  // Parse SDF properties
+  joint = model->GetJoint(sdf->Get<std::string>("joint"));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  if (sdf->HasElement("multiplier")) {
+    multiplier = sdf->Get<double>("multiplier");
+  } else {
+    multiplier = 1;
+  }
+
+  gzmsg << "Initializing motor: " << topic << " joint=" << joint->GetName()
+        << " multiplier=" << multiplier << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  sub = node->Subscribe(topic, &DCMotor::Callback, this);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&DCMotor::Update, this, _1));
+}
+
+void DCMotor::Update(const common::UpdateInfo &info) {
+  joint->SetForce(0, signal*multiplier);
+}
+
+void DCMotor::Callback(const msgs::ConstFloat64Ptr &msg) {
+  signal = msg->data();
+  if (signal < -1) { signal = -1; }
+  else if (signal > 1) { signal = 1; }
+}
diff --git a/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.h b/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.h
new file mode 100644
index 0000000..22d70be
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/dc_motor/src/dc_motor.h
@@ -0,0 +1,66 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/gazebo.hh>
+
+
+
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for controlling a joint with a DC motor.
+ *
+ * This plugin subscribes to a topic to get a signal in the range
+ * [-1,1]. Every physics update the joint's torque is set as
+ * multiplier*signal.
+ *
+ * To add a DC motor to your robot, add the following XML to your
+ * robot model:
+ *
+ *     <plugin name="my_motor" filename="libgz_dc_motor.so">
+ *       <joint>Joint Name</joint>
+ *       <topic>~/my/topic</topic>
+ *       <multiplier>Number</multiplier>
+ *     </plugin>
+ *
+ * - `joint`: Name of the joint this Dc motor is attached to.
+ * - `topic`: Optional. Message type should be gazebo.msgs.Float64.
+ * - `multiplier`: Optional. Defaults to 1.
+ */
+class DCMotor: public ModelPlugin {
+public:
+  DCMotor();
+  ~DCMotor();
+
+  /// \brief Load the dc motor and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Update the torque on the joint from the dc motor each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Topic to read control signal from.
+  std::string topic;
+
+  /// \brief The pwm signal limited to the range [-1,1].
+  double signal;
+
+  /// \brief The magic torque multiplier. torque=multiplier*signal
+  double multiplier;
+
+  /// \brief The joint that this dc motor drives.
+  physics::JointPtr joint;
+
+  /// \brief Callback for receiving msgs and storing the signal.
+  void Callback(const msgs::ConstFloat64Ptr &msg);
+
+
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::SubscriberPtr sub;    ///< \brief Subscriber handle.
+};
diff --git a/simulation/frc_gazebo_plugins/encoder/src/encoder.cpp b/simulation/frc_gazebo_plugins/encoder/src/encoder.cpp
new file mode 100644
index 0000000..aea246f
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/encoder/src/encoder.cpp
@@ -0,0 +1,91 @@
+#include "encoder.h"
+
+GZ_REGISTER_MODEL_PLUGIN(Encoder)
+
+Encoder::Encoder() {}
+
+Encoder::~Encoder() {}
+
+void Encoder::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  joint = model->GetJoint(sdf->Get<std::string>("joint"));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  if (sdf->HasElement("units")) {
+    radians = sdf->Get<std::string>("units") != "degrees";
+  } else {
+    radians = true;
+  }
+  zero = GetAngle();
+  stopped = true;
+  stop_value = 0;
+
+  gzmsg << "Initializing encoder: " << topic << " joint=" << joint->GetName()
+        << " radians=" << radians << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  command_sub = node->Subscribe(topic+"/control", &Encoder::Callback, this);
+  pos_pub = node->Advertise<msgs::Float64>(topic+"/position");
+  vel_pub = node->Advertise<msgs::Float64>(topic+"/velocity");
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Encoder::Update, this, _1));
+}
+
+void Encoder::Update(const common::UpdateInfo &info) {
+  msgs::Float64 pos_msg, vel_msg;
+  if (stopped) {
+    pos_msg.set_data(stop_value);
+    pos_pub->Publish(pos_msg);
+    vel_msg.set_data(0);
+    vel_pub->Publish(vel_msg);
+  } else {
+    pos_msg.set_data(GetAngle() - zero);
+    pos_pub->Publish(pos_msg);
+    vel_msg.set_data(GetVelocity());
+    vel_pub->Publish(vel_msg);
+  }
+}
+
+void Encoder::Callback(const msgs::ConstStringPtr &msg) {
+  std::string command = msg->data();
+  if (command == "reset") {
+    zero = GetAngle();
+  } else if (command == "start") {
+    stopped = false;
+    zero = (GetAngle() - stop_value);
+  } else if  (command == "stop") {
+    stopped = true;
+    stop_value = GetAngle();
+  } else {
+    gzerr << "WARNING: Encoder got unknown command '" << command << "'." << std::endl;
+  }
+}
+
+double Encoder::GetAngle() {
+  if (radians) {
+    return joint->GetAngle(0).Radian();
+  } else {
+    return joint->GetAngle(0).Degree();
+  }
+}
+
+double Encoder::GetVelocity() {
+  if (radians) {
+    return joint->GetVelocity(0);
+  } else {
+    return joint->GetVelocity(0) * (180.0 / M_PI);
+  }
+}
+
diff --git a/simulation/frc_gazebo_plugins/encoder/src/encoder.h b/simulation/frc_gazebo_plugins/encoder/src/encoder.h
new file mode 100644
index 0000000..728341d
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/encoder/src/encoder.h
@@ -0,0 +1,84 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/gazebo.hh>
+
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for reading the speed and relative angle of a joint.
+ *
+ * This plugin publishes the angle since last reset and the speed of a
+ * given joint to subtopics of the given topic every physics
+ * update. There is also a control subtopic that takes three commands:
+ * "start", "stop" and "reset":
+ *
+ * - "start": Start counting ticks from the current count.
+ * - "stop":  Stop counting ticks, pauses updates.
+ * - "reset": Set the current angle to zero.
+ *
+ * To add a encoder to your robot, add the following XML to your
+ * robot model:
+ *
+ *     <plugin name="my_encoder" filename="libgz_encoder.so">
+ *       <joint>Joint Name</joint>
+ *       <topic>~/my/topic</topic>
+ *       <units>{degrees, radians}</units>
+ *     </plugin>
+ *
+ * - `joint`: Name of the joint this encoder is attached to.
+ * - `topic`: Optional. Used as the root for subtopics. `topic`/position (gazebo.msgs.Float64),
+ *            `topic`/velocity (gazebo.msgs.Float64), `topic`/control (gazebo.msgs.String)
+ * - `units`: Optional. Defaults to radians.
+ */
+class Encoder: public ModelPlugin {
+public:
+  Encoder();
+  ~Encoder();
+
+  /// \brief Load the encoder and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out the encoder reading each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Root topic for subtopics on this topic.
+  std::string topic;
+
+  /// \brief Whether or not this encoder measures radians or degrees.
+  bool radians;
+
+  /// \brief Whether or not the encoder has been stopped.
+  bool stopped;
+
+  /// \brief The zero value of the encoder.
+  double zero;
+
+  /// \brief The value the encoder stopped counting at
+  double stop_value;
+
+  /// \brief The joint that this encoder measures
+  physics::JointPtr joint;
+
+  /// \brief Callback for handling control data
+  void Callback(const msgs::ConstStringPtr &msg);
+
+  /// \brief Gets the current angle, taking into account whether to
+  ///        return radians or degrees.
+  double GetAngle();
+
+  /// \brief Gets the current velocity, taking into account whether to
+  ///        return radians/second or degrees/second.
+  double GetVelocity();
+
+  physics::ModelPtr model;                  ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn;          ///< \brief Pointer to the world update function.
+  transport::NodePtr node;                  ///< \brief The node we're advertising on.
+  transport::SubscriberPtr command_sub;     ///< \brief Subscriber handle.
+  transport::PublisherPtr pos_pub, vel_pub; ///< \brief Publisher handles.
+};
diff --git a/simulation/frc_gazebo_plugins/frc_gazebo_plugins.doxy b/simulation/frc_gazebo_plugins/frc_gazebo_plugins.doxy
new file mode 100644
index 0000000..b891249
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/frc_gazebo_plugins.doxy
@@ -0,0 +1,2303 @@
+# Doxyfile 1.8.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "FRC Gazebo Plugins"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = DEVELOPMENT
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Gazebo plugins to enable WPILib to control simulated robots."
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = docs
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = 
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/simulation/frc_gazebo_plugins/gyro/src/gyro.cpp b/simulation/frc_gazebo_plugins/gyro/src/gyro.cpp
new file mode 100644
index 0000000..e918bbb
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/gyro/src/gyro.cpp
@@ -0,0 +1,98 @@
+#include "gyro.h"
+
+
+GZ_REGISTER_MODEL_PLUGIN(Gyro)
+
+Gyro::Gyro() {}
+
+Gyro::~Gyro() {}
+
+void Gyro::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  link = model->GetLink(sdf->Get<std::string>("link"));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  std::string axisString = sdf->Get<std::string>("axis");
+  if (axisString == "roll") axis = Roll;
+  if (axisString == "pitch") axis = Pitch;
+  if (axisString == "yaw") axis = Yaw;
+
+  if (sdf->HasElement("units")) {
+    radians = sdf->Get<std::string>("units") != "degrees";
+  } else {
+    radians = true;
+  }
+  zero = GetAngle();
+
+  gzmsg << "Initializing gyro: " << topic << " link=" << link->GetName()
+        << " axis=" << axis << " radians=" << radians << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  command_sub = node->Subscribe(topic+"/control", &Gyro::Callback, this);
+  pos_pub = node->Advertise<msgs::Float64>(topic+"/position");
+  vel_pub = node->Advertise<msgs::Float64>(topic+"/velocity");
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Gyro::Update, this, _1));
+}
+
+void Gyro::Update(const common::UpdateInfo &info) {
+  msgs::Float64 pos_msg, vel_msg;
+  pos_msg.set_data(Limit(GetAngle() - zero));
+  pos_pub->Publish(pos_msg);
+  vel_msg.set_data(GetVelocity());
+  vel_pub->Publish(vel_msg);
+}
+
+void Gyro::Callback(const msgs::ConstStringPtr &msg) {
+  std::string command = msg->data();
+  if (command == "reset") {
+    zero = GetAngle();
+  } else {
+    gzerr << "WARNING: Gyro got unknown command '" << command << "'." << std::endl;
+  }
+}
+
+double Gyro::GetAngle() {
+  if (radians) {
+    return link->GetWorldCoGPose().rot.GetAsEuler()[axis];
+  } else {
+    return link->GetWorldCoGPose().rot.GetAsEuler()[axis] * (180.0 / M_PI);
+  }
+}
+
+double Gyro::GetVelocity() {
+  if (radians) {
+    return link->GetRelativeAngularVel()[axis];
+  } else {
+    return link->GetRelativeAngularVel()[axis] * (180.0 / M_PI);
+  }
+}
+
+double Gyro::Limit(double value) {
+  if (radians) {
+    while (true) {
+      if (value < -M_PI) value += 2*M_PI;
+      else if (value > M_PI) value -= 2*M_PI;
+      else break;
+    }
+  } else {
+    while (true) {
+      if (value < -180) value += 360;
+      else if (value > 180) value -= 360;
+      else break;
+    }
+  }
+  return value;
+}
diff --git a/simulation/frc_gazebo_plugins/gyro/src/gyro.h b/simulation/frc_gazebo_plugins/gyro/src/gyro.h
new file mode 100644
index 0000000..fee48b3
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/gyro/src/gyro.h
@@ -0,0 +1,85 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/gazebo.hh>
+
+
+
+using namespace gazebo;
+
+/// \brief The axis about which to measure rotation.
+typedef enum {Roll /*X*/, Pitch /*Y*/, Yaw /*Z*/} ROTATION;
+
+/**
+ * \brief Plugin for reading the speed and relative angle of a link.
+ *
+ * This plugin publishes the angle since last reset and the speed
+ * which a link is rotating about some axis to subtopics of the given
+ * topic every physics update. There is also a control topic that
+ * takes one command: "reset", which sets the current angle as zero.
+ *
+ * To add a gyro to your robot, add the following XML to your robot
+ * model:
+ *
+ *     <plugin name="my_gyro" filename="libgz_gyro.so">
+ *       <link>Joint Name</link>
+ *       <topic>~/my/topic</topic>
+ *       <units>{degrees, radians}</units>
+ *     </plugin>
+ *
+ * - `link`: Name of the link this potentiometer is attached to.
+ * - `topic`: Optional. Used as the root for subtopics. `topic`/position (gazebo.msgs.Float64),
+ *            `topic`/velocity (gazebo.msgs.Float64), `topic`/control (gazebo.msgs.String)
+ * - `units`; Optional, defaults to radians.
+ */
+class Gyro: public ModelPlugin {
+public:
+  Gyro();
+  ~Gyro();
+
+  /// \brief Load the gyro and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out the gyro reading each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Publish the angle on this topic.
+  std::string topic;
+
+  /// \brief Whether or not this gyro measures radians or degrees.
+  bool radians;
+
+  /// \brief The axis to measure rotation about.
+  ROTATION axis;
+
+  /// \brief The zero value of the gyro.
+  double zero;
+
+  /// \brief The link that this gyro measures
+  physics::LinkPtr link;
+
+  /// \brief Callback for handling control data
+  void Callback(const msgs::ConstStringPtr &msg);
+
+  /// \brief Gets the current angle, taking into account whether to
+  ///        return radians or degrees.
+  double GetAngle();
+
+  /// \brief Gets the current velocity, taking into account whether to
+  ///        return radians/second or degrees/second.
+  double GetVelocity();
+
+  /// \brief Limit the value to either [-180,180] or [-PI,PI]
+  ///       depending on whether or radians or degrees are being used.
+  double Limit(double value);
+
+  physics::ModelPtr model;                  ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn;          ///< \brief Pointer to the world update function.
+  transport::NodePtr node;                  ///< \brief The node we're advertising on.
+  transport::SubscriberPtr command_sub;     ///< \brief Subscriber handle.
+  transport::PublisherPtr pos_pub, vel_pub; ///< \brief Publisher handles.
+};
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.cpp b/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.cpp
new file mode 100644
index 0000000..67c2c7a
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.cpp
@@ -0,0 +1,15 @@
+#include "external_limit_switch.h"
+
+
+ExternalLimitSwitch::ExternalLimitSwitch(sdf::ElementPtr sdf) {
+  sensor = boost::dynamic_pointer_cast<sensors::ContactSensor>(
+               sensors::get_sensor(sdf->Get<std::string>("sensor")));
+
+  gzmsg << "\texternal limit switch: " << " sensor=" << sensor->GetName() << std::endl;
+}
+
+ExternalLimitSwitch::~ExternalLimitSwitch() {}
+
+bool ExternalLimitSwitch::Get() {
+  return sensor->GetContacts().contact().size() > 0;
+}
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.h b/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.h
new file mode 100644
index 0000000..573e93b
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/external_limit_switch.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "switch.h"
+
+#ifdef _WIN32
+	#include <Winsock2.h>
+#endif
+
+#include <gazebo/sensors/sensors.hh>
+#include <boost/pointer_cast.hpp>
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+class ExternalLimitSwitch : public Switch {
+public:
+  ExternalLimitSwitch(sdf::ElementPtr sdf);
+  ~ExternalLimitSwitch();
+
+  /// \brief Returns true when the switch is triggered.
+  virtual bool Get();
+
+private:
+  sensors::ContactSensorPtr sensor;
+};
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.cpp b/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.cpp
new file mode 100644
index 0000000..3b6d7de
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.cpp
@@ -0,0 +1,29 @@
+#include "internal_limit_switch.h"
+
+InternalLimitSwitch::InternalLimitSwitch(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  joint = model->GetJoint(sdf->Get<std::string>("joint"));
+  min = sdf->Get<double>("min");
+  max = sdf->Get<double>("max");
+
+  if (sdf->HasElement("units")) {
+    radians = sdf->Get<std::string>("units") != "degrees";
+  } else {
+    radians = true;
+  }
+
+  gzmsg << "\tinternal limit switch: " << " type=" << joint->GetName()
+        << " range=[" << min << "," << max << "] radians=" << radians << std::endl;
+}
+
+InternalLimitSwitch::~InternalLimitSwitch() {}
+
+bool InternalLimitSwitch::Get() {
+  double value;
+  joint->GetAngle(0).Normalize();
+  if (radians) {
+    value = joint->GetAngle(0).Radian();
+  } else {
+    value = joint->GetAngle(0).Degree();
+  }
+  return value >= min && value <= max;
+}
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.h b/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.h
new file mode 100644
index 0000000..bf08cbb
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/internal_limit_switch.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "switch.h"
+
+#ifdef _WIN32
+	#include <Winsock2.h>
+#endif
+#include <gazebo/physics/physics.hh>
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+class InternalLimitSwitch : public Switch {
+public:
+  InternalLimitSwitch(physics::ModelPtr model, sdf::ElementPtr sdf);
+  ~InternalLimitSwitch();
+
+  /// \brief Returns true when the switch is triggered.
+  virtual bool Get();
+
+private:
+  physics::JointPtr joint;
+  double min, max;
+  bool radians;
+};
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.cpp b/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.cpp
new file mode 100644
index 0000000..f32e65c
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.cpp
@@ -0,0 +1,45 @@
+#include "limit_switch.h"
+
+GZ_REGISTER_MODEL_PLUGIN(LimitSwitch)
+
+LimitSwitch::LimitSwitch() {}
+
+LimitSwitch::~LimitSwitch() {}
+
+void LimitSwitch::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+  std::string type = sdf->Get<std::string>("type");
+
+  gzmsg << "Initializing limit switch: " << topic << " type=" << type << std::endl;
+  if (type == "internal") {
+    ls = new InternalLimitSwitch(model, sdf);
+  } else if (type == "external") {
+    ls = new ExternalLimitSwitch(sdf);
+  } else {
+    gzerr << "WARNING: unsupported limit switch type " << type;
+  }
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  pub = node->Advertise<msgs::Bool>(topic);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&LimitSwitch::Update, this, _1));
+}
+
+void LimitSwitch::Update(const common::UpdateInfo &info) {
+  msgs::Bool msg;
+  msg.set_data(ls->Get());
+  pub->Publish(msg);
+}
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.h b/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.h
new file mode 100644
index 0000000..4d590d5
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/limit_switch.h
@@ -0,0 +1,85 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include "switch.h"
+
+#include "internal_limit_switch.h"
+#include "external_limit_switch.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for reading limit switches.
+ *
+ * This plugin publishes whether or not the limit switch has been
+ * triggered every physics update. There are two types of limit switches:
+ *
+ * - Internal: Measure joint limits. Triggerd if the joint is within
+ *             some range.
+ * - External: Measure interactions with the outside world. Triggerd
+ *             if some link is in collision.
+ *
+ * To add a limit swithch to your robot, add the following XML to your
+ * robot model.
+ *
+ * Internal:
+ *
+ *     <plugin name="my_limit_switch" filename="libgz_limit_switch.so">
+ *       <topic>~/my/topic</topic>
+ *       <type>internal</type>
+ *       <joint>Joint Name</joint>
+ *       <units>{degrees, radians}</units>
+ *       <min>Number</min>
+ *       <max>Number</max>
+ *     </plugin>
+ *
+ * External:
+ *
+ *     <plugin name="my_limit_switch" filename="libgz_limit_switch.so">
+ *       <topic>~/my/topic</topic>
+ *       <type>external</type>
+ *       <sensor>Sensor Name</sensor>
+ *     </plugin>
+ *
+ * Common:
+ * - `topic`: Optional. Message will be published as a gazebo.msgs.Float64.
+ * - `type`: Required. The type of limit switch that this is
+ *
+ * Internal
+ * - `joint`: Name of the joint this potentiometer is attached to.
+ * - `units`: Optional. Defaults to radians.
+ * - `min`: Minimum angle considered triggered.
+ * - `max`: Maximum angle considered triggered.
+ *
+ * External
+ * - `sensor`: Name of the contact sensor that this limit switch uses.
+ */
+class LimitSwitch: public ModelPlugin {
+public:
+  LimitSwitch();
+  ~LimitSwitch();
+
+  /// \brief Load the limit switch and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out the limit switch reading each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Publish the limit switch value on this topic.
+  std::string topic;
+
+  /// \brief LimitSwitch object, currently internal or external.
+  Switch* ls;
+
+
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::PublisherPtr pub;     ///< \brief Publisher handle.
+};
diff --git a/simulation/frc_gazebo_plugins/limit_switch/src/switch.h b/simulation/frc_gazebo_plugins/limit_switch/src/switch.h
new file mode 100644
index 0000000..d7d5aac
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/limit_switch/src/switch.h
@@ -0,0 +1,9 @@
+#pragma once
+
+class Switch {
+public:
+  virtual ~Switch() {}
+
+  /// \brief Returns true when the switch is triggered.
+  virtual bool Get() = 0;
+};
diff --git a/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.cpp b/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.cpp
new file mode 100644
index 0000000..11cf432
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.cpp
@@ -0,0 +1,61 @@
+#ifdef _WIN32
+  // Ensure that Winsock2.h is included before Windows.h, which can get
+  // pulled in by anybody (e.g., Boost).
+  #include <Winsock2.h>
+#endif
+
+#include "pneumatic_piston.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+
+GZ_REGISTER_MODEL_PLUGIN(PneumaticPiston)
+
+PneumaticPiston::PneumaticPiston() {}
+
+PneumaticPiston::~PneumaticPiston() {}
+
+void PneumaticPiston::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+  signal = 0;
+
+  // Parse SDF properties
+  joint = model->GetJoint(sdf->Get<std::string>("joint"));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  forward_force = sdf->Get<double>("forward-force");
+  reverse_force = sdf->Get<double>("reverse-force");
+
+  if (sdf->HasElement("direction") && sdf->Get<std::string>("direction") == "reversed") {
+    forward_force = -forward_force;
+    reverse_force = -reverse_force;
+  }
+
+  gzmsg << "Initializing piston: " << topic << " joint=" << joint->GetName()
+        << " forward_force=" << forward_force
+        << " reverse_force=" << reverse_force<< std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  sub = node->Subscribe(topic, &PneumaticPiston::Callback, this);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&PneumaticPiston::Update, this, _1));
+}
+
+void PneumaticPiston::Update(const common::UpdateInfo &info) {
+  joint->SetForce(0, signal);
+}
+
+void PneumaticPiston::Callback(const msgs::ConstFloat64Ptr &msg) {
+  if (msg->data() < -0.001) { signal = -reverse_force; }
+  else if (msg->data() > 0.001) { signal = forward_force; }
+}
diff --git a/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.h b/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.h
new file mode 100644
index 0000000..8bfb7b1
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/pneumatic_piston/src/pneumatic_piston.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for controlling a joint with a pneumatic piston.
+ *
+ * This plugin subscribes to a topic to get a signal. It accepts three
+ * values:
+ *
+ * -  1: Apply the forward force to the joint.
+ * -  0: Maintain last applied force
+ * - -1: Apply the reverse force to the joint.
+ *
+ * Every physics update the joint's torque is set to reflect the
+ * signal.
+ *
+ * To add a pneumatic piston to your robot, add the following XML to
+ * your robot model:
+ *
+ *     <plugin name="my_piston" filename="libgz_pneumatic_piston.so">
+ *       <joint>Joint Name</joint>
+ *       <topic>~/my/topic</topic>
+ *       <direction>{forward, reversed}</direction>
+ *       <forward-force>Number</forward-force>
+ *       <reverse-force>Number</reverse-force>
+ *     </plugin>
+ *
+ * - `joint`: Name of the joint this Dc motor is attached to.
+ * - `topic`: Optional. Message type should be gazebo.msgs.Float64.
+ * - `direction`: Optional. Defaults to forward. Reversed if the
+ *                piston pushes in the opposite direction of the joint
+ *                axis.
+ * - `forward-force`: Force to apply in the forward direction.
+ * - `reverse-force`: Force to apply in the reverse direction.
+ *
+ * \todo Signal should probably be made a tri-state message.
+ */
+class PneumaticPiston: public ModelPlugin {
+public:
+  PneumaticPiston();
+  ~PneumaticPiston();
+
+  /// \brief Load the pneumatic piston and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Updat the force the piston applies on the joint.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Topic to read control signal from.
+  std::string topic;
+
+  /// \brief The signal is one of: {-1,0,1}.
+  double signal;
+
+  /// \brief The magic force multipliers for each direction.
+  double forward_force, reverse_force;
+
+  /// \brief The joint that this pneumatic piston actuates.
+  physics::JointPtr joint;
+
+  /// \brief Callback for receiving msgs and updating the torque.
+  void Callback(const msgs::ConstFloat64Ptr &msg);
+
+
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::SubscriberPtr sub;    ///< \brief Subscriber handle.
+};
diff --git a/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.cpp b/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.cpp
new file mode 100644
index 0000000..f7f4251
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.cpp
@@ -0,0 +1,61 @@
+#ifdef _WIN32
+  // Ensure that Winsock2.h is included before Windows.h, which can get
+  // pulled in by anybody (e.g., Boost).
+  #include <Winsock2.h>
+#endif
+
+#include "potentiometer.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <boost/algorithm/string.hpp>
+
+
+GZ_REGISTER_MODEL_PLUGIN(Potentiometer)
+
+Potentiometer::Potentiometer() {}
+
+Potentiometer::~Potentiometer() {}
+
+void Potentiometer::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  joint = model->GetJoint(sdf->Get<std::string>("joint"));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  if (sdf->HasElement("units")) {
+    radians = sdf->Get<std::string>("units") != "degrees";
+  } else {
+    radians = true;
+  }
+
+  gzmsg << "Initializing potentiometer: " << topic << " joint=" << joint->GetName()
+        << " radians=" << radians << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  pub = node->Advertise<msgs::Float64>(topic);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Potentiometer::Update, this, _1));
+}
+
+void Potentiometer::Update(const common::UpdateInfo &info) {
+  joint->GetAngle(0).Normalize();
+  msgs::Float64 msg;
+  if (radians) {
+    msg.set_data(joint->GetAngle(0).Radian());
+  } else {
+    msg.set_data(joint->GetAngle(0).Degree());
+  }
+  pub->Publish(msg);
+}
diff --git a/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.h b/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.h
new file mode 100644
index 0000000..422ff20
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/potentiometer/src/potentiometer.h
@@ -0,0 +1,54 @@
+#pragma once
+
+#include <simulation/gz_msgs/msgs.h>
+
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for reading the angle of a joint.
+ *
+ * This plugin publishes the angle of a joint to the topic every
+ * physics update. Supports reading in either radians or degrees.
+ *
+ * To add a potentiometer to your robot, add the following XML to your
+ * robot model:
+ *
+ *     <plugin name="my_pot" filename="libgz_potentiometer.so">
+ *       <joint>Joint Name</joint>
+ *       <topic>~/my/topic</topic>
+ *       <units>{degrees, radians}</units>
+ *     </plugin>
+ *
+ * - `joint`: Name of the joint this potentiometer is attached to.
+ * - `topic`: Optional. Message will be published as a gazebo.msgs.Float64.
+ * - `units`: Optional. Defaults to radians.
+ */
+class Potentiometer: public ModelPlugin {
+public:
+  Potentiometer();
+  ~Potentiometer();
+
+  /// \brief Load the potentiometer and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out the potentiometer reading each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Publish the angle on this topic.
+  std::string topic;
+
+  /// \brief Whether or not this potentiometer measures radians or degrees.
+  bool radians;
+
+  /// \brief The joint that this potentiometer measures
+  physics::JointPtr joint;
+
+
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::PublisherPtr pub;     ///< \brief Publisher handle.
+};
diff --git a/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.cpp b/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.cpp
new file mode 100644
index 0000000..c91cfb2
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.cpp
@@ -0,0 +1,51 @@
+#ifdef _WIN32
+  // Ensure that Winsock2.h is included before Windows.h, which can get
+  // pulled in by anybody (e.g., Boost).
+  #include <Winsock2.h>
+#endif
+
+#include "rangefinder.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+#include <gazebo/sensors/sensors.hh>
+
+#include <boost/pointer_cast.hpp>
+
+GZ_REGISTER_MODEL_PLUGIN(Rangefinder)
+
+Rangefinder::Rangefinder() {}
+
+Rangefinder::~Rangefinder() {}
+
+void Rangefinder::Load(physics::ModelPtr model, sdf::ElementPtr sdf) {
+  this->model = model;
+
+  // Parse SDF properties
+  sensor = boost::dynamic_pointer_cast<sensors::SonarSensor>(
+               sensors::get_sensor(sdf->Get<std::string>("sensor")));
+  if (sdf->HasElement("topic")) {
+    topic = sdf->Get<std::string>("topic");
+  } else {
+    topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+  }
+
+  gzmsg << "Initializing rangefinder: " << topic << " sensor=" << sensor->GetName() << std::endl;
+
+  // Connect to Gazebo transport for messaging
+  std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+  boost::replace_all(scoped_name, "::", "/");
+  node = transport::NodePtr(new transport::Node());
+  node->Init(scoped_name);
+  pub = node->Advertise<msgs::Float64>(topic);
+
+  // Connect to the world update event.
+  // This will trigger the Update function every Gazebo iteration
+  updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Rangefinder::Update, this, _1));
+}
+
+void Rangefinder::Update(const common::UpdateInfo &info) {
+  msgs::Float64 msg;
+  msg.set_data(sensor->GetRange());
+  pub->Publish(msg);
+}
diff --git a/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.h b/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.h
new file mode 100644
index 0000000..f9a7ef4
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/rangefinder/src/rangefinder.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <simulation/gz_msgs/msgs.h>
+
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for reading the range of obstacles.
+ *
+ * This plugin publishes the range of obstacles detected by a sonar
+ * rangefinder every physics update.
+ *
+ * To add a rangefinder to your robot, add the following XML to your
+ * robot model:
+ *
+ *     <plugin name="my_rangefinder" filename="libgz_rangefinder.so">
+ *       <sensor>Sensor Name</sensor>
+ *       <topic>~/my/topic</topic>
+ *     </plugin>
+ *
+ * - `sensor`: Name of the sonar sensor that this rangefinder uses.
+ * - `topic`: Optional. Message will be published as a gazebo.msgs.Float64.
+ */
+class Rangefinder: public ModelPlugin {
+public:
+  Rangefinder();
+  ~Rangefinder();
+
+  /// \brief Load the rangefinder and configures it according to the sdf.
+  void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+  /// \brief Sends out the rangefinder reading each timestep.
+  void Update(const common::UpdateInfo &info);
+
+private:
+  /// \brief Publish the range on this topic.
+  std::string topic;
+
+  /// \brief The sonar sensor that this rangefinder uses
+  sensors::SonarSensorPtr sensor;
+
+  physics::ModelPtr model;         ///< \brief The model that this is attached to.
+  event::ConnectionPtr updateConn; ///< \brief Pointer to the world update function.
+  transport::NodePtr node;         ///< \brief The node we're advertising on.
+  transport::PublisherPtr pub;     ///< \brief Publisher handle.
+};
diff --git a/simulation/frc_gazebo_plugins/servo/src/servo.cpp b/simulation/frc_gazebo_plugins/servo/src/servo.cpp
new file mode 100644
index 0000000..8298280
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/servo/src/servo.cpp
@@ -0,0 +1,70 @@
+#ifdef _WIN32
+  // Ensure that Winsock2.h is included before Windows.h, which can get
+  // pulled in by anybody (e.g., Boost).
+  #include <Winsock2.h>
+#endif
+
+#include "servo.h"
+
+#include <gazebo/physics/physics.hh>
+#include <gazebo/transport/transport.hh>
+
+GZ_REGISTER_MODEL_PLUGIN(Servo)
+
+Servo::Servo() {}
+
+Servo::~Servo() {}
+
+void Servo::Load(physics::ModelPtr model, sdf::ElementPtr sdf){
+	this->model = model;
+	signal = 0;
+
+	//parse SDF Properries
+	joint = model->GetJoint(sdf->Get<std::string>("joint"));
+	if (sdf->HasElement("topic")) {
+		topic = sdf->Get<std::string>("topic");
+	}
+	else {
+		topic = "~/"+sdf->GetAttribute("name")->GetAsString();
+	}
+
+	if (sdf->HasElement("torque")) {
+		torque = sdf->Get<double>("torque");
+	}
+	else {
+		torque = 5;
+	}
+
+	gzmsg << "initializing awesome servo: " << topic
+		<< " joint=" << joint->GetName()
+		<< " torque=" << torque << std::endl;
+
+	//Connect to Gazebo transport for messaging
+	std::string scoped_name = model->GetWorld()->GetName()+"::"+model->GetScopedName();
+	boost::replace_all(scoped_name, "::","/");
+	node = transport::NodePtr(new transport::Node());
+	node->Init(scoped_name);
+	sub = node->Subscribe(topic, &Servo::Callback, this);
+
+	//connect to the world update event
+	//this will call update every iteration
+	updateConn = event::Events::ConnectWorldUpdateBegin(boost::bind(&Servo::Update, this, _1));
+}
+
+void Servo::Update(const common::UpdateInfo &info){
+	//torque is in kg*cm
+	//joint->SetAngle(0,signal*180);
+  if (joint->GetAngle(0) < signal){
+    joint->SetForce(0,torque);
+  }
+  else if (joint->GetAngle(0) > signal){
+    joint->SetForce(0,torque);
+  }
+  joint->SetForce(0,0);
+}
+
+void Servo::Callback(const msgs::ConstFloat64Ptr &msg){
+  	signal = msg->data();
+    if (signal < -1) { signal = -1; }
+    else if (signal > 1) { signal = 1; }
+}
diff --git a/simulation/frc_gazebo_plugins/servo/src/servo.h b/simulation/frc_gazebo_plugins/servo/src/servo.h
new file mode 100644
index 0000000..a998761
--- /dev/null
+++ b/simulation/frc_gazebo_plugins/servo/src/servo.h
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "simulation/gz_msgs/msgs.h"
+
+#include <gazebo/gazebo.hh>
+
+using namespace gazebo;
+
+/**
+ * \brief Plugin for controlling a servo.
+ *
+ * This plugin subscribes to a topic to get a signal in the range
+ * [-1,1]. Every physics update the joint's torque is set as
+ * multiplier*signal.
+ *
+ * To add a servo to your robot, add the following XML to your robot
+ * model:
+ *
+ *     <plugin name="my_servo" filename="libgz_servo.so">
+ *       <joint>Joint Name</joint>
+ *       <topic>/gzebo/frc/simulator/pwm/1</topic>
+ *     </plugin>
+ *
+ * - `link`: Name of the link the servo is attached to.
+ * - `topic`: Optional. Message type should be gazebo.msgs.Float64.
+ */
+class Servo: public ModelPlugin {
+public:
+	Servo();
+	~Servo();
+
+	/// \brief load the servo and configure it according to the sdf
+	void Load(physics::ModelPtr model, sdf::ElementPtr sdf);
+
+	/// \brief Update the torque on the joint from the dc motor each timestep.
+	void Update(const common::UpdateInfo &info);
+
+private:
+	/// \brief Topic to read control signal from.
+	std::string topic;
+
+	/// \brief the pwm signal limited to the range [-1,1]
+	double signal;
+
+	/// \brief the torque of the motor in kg/cm
+	double torque;
+
+	/// \brief the joint that this servo moves
+	physics::JointPtr joint;
+
+	/// \brief Callback for receiving msgs and storing the signal
+	void Callback(const msgs::ConstFloat64Ptr &msg);
+
+	physics::ModelPtr model; 			///< \brief The model that this is attached to
+	event::ConnectionPtr updateConn; 	///< \brief The Pointer to the world update function
+	transport::NodePtr node; 			///< \brief The node we're advertising torque on
+	transport::SubscriberPtr sub; 		///< \brief the Subscriber for the pwm signal
+
+};
diff --git a/simulation/frcsim.sh b/simulation/frcsim.sh
new file mode 100755
index 0000000..a923f53
--- /dev/null
+++ b/simulation/frcsim.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+export GAZEBO_PLUGIN_PATH="${GAZEBO_PLUGIN_PATH}:${HOME}/wpilib/simulation/plugins"
+export GAZEBO_MODEL_PATH="${GAZEBO_MODEL_PATH}:${HOME}/wpilib/simulation/models"
+export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${HOME}/wpilib/simulation/plugins"
+gazebo $@
diff --git a/simulation/gz_msgs/CMakeLists.txt b/simulation/gz_msgs/CMakeLists.txt
new file mode 100644
index 0000000..17ecf5c
--- /dev/null
+++ b/simulation/gz_msgs/CMakeLists.txt
@@ -0,0 +1,64 @@
+cmake_minimum_required(VERSION 2.8)
+project(gz_msgs)
+
+#list all proto files used
+get_filename_component(PROTO_DIR src/main/proto ABSOLUTE)
+set(msgs
+  "${PROTO_DIR}/bool.proto"
+  "${PROTO_DIR}/driver-station.proto"
+  "${PROTO_DIR}/float64.proto"
+  "${PROTO_DIR}/frc_joystick.proto"
+)
+
+set (GZ_MSGS_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE FILEPATH "gz_msgs include directory")
+set (GZ_MSGS_INCLUDE_SUBDIR "${GZ_MSGS_INCLUDE_DIR}/simulation/gz_msgs")
+file(MAKE_DIRECTORY ${GZ_MSGS_INCLUDE_SUBDIR})
+
+set(PROTO_SRCS)
+set(PROTO_HDRS)
+set(MSGS_HEADER "${GZ_MSGS_INCLUDE_SUBDIR}/msgs.h")
+foreach(FIL ${msgs})
+  get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
+  get_filename_component(FIL_WE ${FIL} NAME_WE)
+
+  list(APPEND PROTO_SRCS "${GZ_MSGS_INCLUDE_SUBDIR}/${FIL_WE}.pb.cc")
+  list(APPEND PROTO_HDRS "${GZ_MSGS_INCLUDE_SUBDIR}/${FIL_WE}.pb.h")
+
+  add_custom_command(
+    OUTPUT
+    "${GZ_MSGS_INCLUDE_SUBDIR}/${FIL_WE}.pb.cc"
+    "${GZ_MSGS_INCLUDE_SUBDIR}/${FIL_WE}.pb.h"
+
+    COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
+    ARGS --cpp_out=${GZ_MSGS_INCLUDE_SUBDIR} --proto_path=${PROTO_DIR} ${ABS_FIL}
+    COMMENT "compiling ${ABS_FIL}"
+    VERBATIM)
+endforeach()
+
+set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS} PROPERTIES GENERATED TRUE)
+
+
+###############################################
+#Generating msgs.h
+
+#create the message_headers and keep it in cache
+set (message_headers "" CACHE INTERNAL "Include dirs description")
+
+#add includes to the msgs.h file
+foreach (hdr ${PROTO_HDRS})
+  string (REPLACE "${CMAKE_CURRENT_BINARY_DIR}/generated/" "" hdr ${hdr})
+  APPEND_TO_CACHED_STRING(message_headers
+    "Message Types" "#include \"${hdr}\"\n")
+endforeach()
+
+configure_file(msgs.h.in ${MSGS_HEADER})
+
+file(GLOB_RECURSE COM_SRC_FILES msgs/*.cc)
+include_directories(msgs ${PROTOBUF_INCLUDE_DIR})
+if (WIN32)
+  add_library(${PROJECT_NAME} ${PROTO_SRCS} ${SRC_FILES})
+else()
+  add_library(${PROJECT_NAME} SHARED ${PROTO_SRCS} ${SRC_FILES})
+endif()
+
+target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
diff --git a/simulation/gz_msgs/README.md b/simulation/gz_msgs/README.md
new file mode 100644
index 0000000..203457d
--- /dev/null
+++ b/simulation/gz_msgs/README.md
@@ -0,0 +1,6 @@
+Building gz_msgs
+================
+
+Currently uses cmake.
+This is build as a part of the whole cmake project.
+see top level building.md for detail
diff --git a/simulation/gz_msgs/msgs.h.in b/simulation/gz_msgs/msgs.h.in
new file mode 100644
index 0000000..42cccc7
--- /dev/null
+++ b/simulation/gz_msgs/msgs.h.in
@@ -0,0 +1,40 @@
+//Auto Generated
+//@author Peter Mitrano <peter@osrfoundation.org>
+#ifndef _FRC_MSGS_H_
+#define _FRC_MSGS_H_
+
+#ifdef _WIN32
+  //include this before anything else includes windows.h
+  //putting this here saves putting it in more files
+  #include <Winsock2.h>
+#endif
+
+
+${message_headers}
+
+#include <gazebo/msgs/msgs.hh>
+#include <boost/shared_ptr.hpp>
+
+namespace gazebo {
+  namespace msgs {
+
+    typedef GzString String;
+
+    typedef boost::shared_ptr< gazebo::msgs::String > StringPtr;
+    typedef const boost::shared_ptr< const gazebo::msgs::String > ConstStringPtr;
+
+    typedef boost::shared_ptr< msgs::Float64 > Float64Ptr;
+    typedef const boost::shared_ptr< const msgs::Float64 > ConstFloat64Ptr;
+
+    typedef boost::shared_ptr< msgs::Bool > BoolPtr;
+    typedef const boost::shared_ptr< const msgs::Bool > ConstBoolPtr;
+
+    typedef boost::shared_ptr< msgs::FRCJoystick > FRCJoystickPtr;
+    typedef const boost::shared_ptr< const msgs::FRCJoystick > ConstFRCJoystickPtr;
+
+    typedef boost::shared_ptr< msgs::DriverStation > DriverStationPtr;
+    typedef const boost::shared_ptr< const msgs::DriverStation > ConstDriverStationPtr;
+  }
+}
+
+#endif /* _FRC_MSGS_H_ */
diff --git a/simulation/gz_msgs/src/main/proto/bool.proto b/simulation/gz_msgs/src/main/proto/bool.proto
new file mode 100644
index 0000000..90ab7fa
--- /dev/null
+++ b/simulation/gz_msgs/src/main/proto/bool.proto
@@ -0,0 +1,15 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Bool
+/// \brief A message for boolean data
+/// \verbatim
+
+option java_outer_classname = "GzBool";
+
+message Bool
+{
+  required bool data = 1;
+}
+
+/// \endverbatim
diff --git a/simulation/gz_msgs/src/main/proto/driver-station.proto b/simulation/gz_msgs/src/main/proto/driver-station.proto
new file mode 100644
index 0000000..187e056
--- /dev/null
+++ b/simulation/gz_msgs/src/main/proto/driver-station.proto
@@ -0,0 +1,21 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface DriverStation
+/// \brief A message for DriverStation data
+/// \verbatim
+
+option java_outer_classname = "GzDriverStation";
+
+message DriverStation
+{
+  required bool enabled = 1;
+  enum State {
+    AUTO = 0;
+    TELEOP = 1;
+    TEST = 2;
+  }
+  required State state = 2;
+}
+
+/// \endverbatim
diff --git a/simulation/gz_msgs/src/main/proto/float64.proto b/simulation/gz_msgs/src/main/proto/float64.proto
new file mode 100644
index 0000000..dd3ddcc
--- /dev/null
+++ b/simulation/gz_msgs/src/main/proto/float64.proto
@@ -0,0 +1,15 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Float64
+/// \brief A message for floating point data
+/// \verbatim
+
+option java_outer_classname = "GzFloat64";
+
+message Float64
+{
+  required double data = 1;
+}
+
+/// \endverbatim
diff --git a/simulation/gz_msgs/src/main/proto/frc_joystick.proto b/simulation/gz_msgs/src/main/proto/frc_joystick.proto
new file mode 100644
index 0000000..ec98aba
--- /dev/null
+++ b/simulation/gz_msgs/src/main/proto/frc_joystick.proto
@@ -0,0 +1,16 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Joystick
+/// \brief A message for joystick data
+/// \verbatim
+
+option java_outer_classname = "GzFRCJoystick";
+
+message FRCJoystick
+{
+  repeated double axes = 1;
+  repeated bool buttons = 2;
+}
+
+/// \endverbatim
