diff --git a/message_generation/build.gradle b/message_generation/build.gradle
index 1de91f4f26dcf945a83a1a386f036fbf312475bf..9958016b58d58a1581dccfa22720d309e024f048 100644
--- a/message_generation/build.gradle
+++ b/message_generation/build.gradle
@@ -15,13 +15,14 @@
  */
 
 dependencies {
-  compile "com.google.guava:guava:12.0"
-  compile "commons-pool:commons-pool:1.6"
-  compile "io.netty:netty:3.5.2.Final"
-  compile "org.apache.commons:com.springsource.org.apache.commons.codec:1.3.0"
-  compile "org.apache.commons:com.springsource.org.apache.commons.io:1.4.0"
-  compile "org.apache.commons:com.springsource.org.apache.commons.lang:2.4.0"
-  testCompile "junit:junit:4.8.2"
+  compile 'io.netty:netty:3.5.2.Final'
+  compile 'com.google.guava:guava:12.0'
+  compile 'org.apache.commons:com.springsource.org.apache.commons.codec:1.3.0'
+  compile 'org.apache.commons:com.springsource.org.apache.commons.io:1.4.0'
+  compile 'commons-pool:commons-pool:1.6'
+  compile 'org.apache.commons:com.springsource.org.apache.commons.lang:2.4.0'
+  compile project(':gradle_plugins')
+  testCompile 'junit:junit:4.8.2'
 }
 
 apply plugin: "application"
diff --git a/message_generation/src/test/java/org/ros/internal/message/Md5GeneratorTest.java b/message_generation/src/test/java/org/ros/internal/message/Md5GeneratorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ff244a66ee97b7cd953490494cbf5bf6cd7474d
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/Md5GeneratorTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message;
+
+import static org.junit.Assert.assertEquals;
+
+import org.ros.internal.message.definition.MessageDefinitionProviderChain;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.ros.internal.message.service.ServiceDefinitionResourceProvider;
+import org.ros.internal.message.service.ServiceDescription;
+import org.ros.internal.message.service.ServiceDescriptionFactory;
+import org.ros.internal.message.topic.TopicDefinitionResourceProvider;
+import org.ros.internal.message.topic.TopicDescription;
+import org.ros.internal.message.topic.TopicDescriptionFactory;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class Md5GeneratorTest {
+
+  private TopicDescriptionFactory topicDescriptionFactory;
+  private ServiceDescriptionFactory serviceDescriptionFactory;
+
+  @Before
+  public void setUp() {
+    MessageDefinitionProviderChain messageDefinitionProviderChain =
+        new MessageDefinitionProviderChain();
+    messageDefinitionProviderChain
+        .addMessageDefinitionProvider(new TopicDefinitionResourceProvider());
+    messageDefinitionProviderChain
+        .addMessageDefinitionProvider(new ServiceDefinitionResourceProvider());
+    topicDescriptionFactory = new TopicDescriptionFactory(messageDefinitionProviderChain);
+    serviceDescriptionFactory = new ServiceDescriptionFactory(messageDefinitionProviderChain);
+  }
+
+  @Test
+  public void testPrimitives() {
+    TopicDescription topicDescription =
+        topicDescriptionFactory.newFromType("test_msgs/TestPrimitives");
+    assertEquals("3e70f428a22c0d26ca67f87802c8e00f", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testString() {
+    TopicDescription topicDescription = topicDescriptionFactory.newFromType("test_msgs/TestString");
+    assertEquals("334ff4377be93faa44ebc66d23d40fd3", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testHeader() {
+    TopicDescription topicDescription = topicDescriptionFactory.newFromType("test_msgs/TestHeader");
+    assertEquals("4b5a00f536da2f756ba6aebcf795a967", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testArrays() {
+    TopicDescription topicDescription = topicDescriptionFactory.newFromType("test_msgs/TestArrays");
+    assertEquals("4cc9b5e2cebe791aa3e994f5bc159eb6", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testComposite() {
+    TopicDescription topicDescription = topicDescriptionFactory.newFromType("test_msgs/Composite");
+    assertEquals("d8fb6eb869ad3956b50e8737d96dc9fa", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testOdometry() {
+    TopicDescription topicDescription = topicDescriptionFactory.newFromType("nav_msgs/Odometry");
+    assertEquals("cd5e73d190d741a2f92e81eda573aca7", topicDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testEmpty() {
+    ServiceDescription serviceDescription = serviceDescriptionFactory.newFromType("std_srvs/Empty");
+    assertEquals("d41d8cd98f00b204e9800998ecf8427e", serviceDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testAddTwoInts() {
+    ServiceDescription serviceDescription =
+        serviceDescriptionFactory.newFromType("test_msgs/AddTwoInts");
+    assertEquals("6a2e34150c00229791cc89ff309fff21", serviceDescription.getMd5Checksum());
+  }
+
+  @Test
+  public void testTransitiveSrv() {
+    ServiceDescription serviceDescription =
+        serviceDescriptionFactory.newFromType("test_msgs/TransitiveSrv");
+    assertEquals("8b7918ee2b81eaf825f4c70de011f6fa", serviceDescription.getMd5Checksum());
+  }
+}
diff --git a/message_generation/src/test/java/org/ros/internal/message/MessageInterfaceBuilderTest.java b/message_generation/src/test/java/org/ros/internal/message/MessageInterfaceBuilderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..38e5316113765c178b347e9eaf82872e4e7a489b
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/MessageInterfaceBuilderTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.ros.internal.message.topic.TopicDefinitionResourceProvider;
+import org.ros.message.MessageDeclaration;
+import org.ros.message.MessageFactory;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class MessageInterfaceBuilderTest {
+
+  private TopicDefinitionResourceProvider topicDefinitionResourceProvider;
+  private MessageFactory messageFactory;
+
+  @Before
+  public void before() {
+    topicDefinitionResourceProvider = new TopicDefinitionResourceProvider();
+    messageFactory = new DefaultMessageFactory(topicDefinitionResourceProvider);
+  }
+
+  @Test
+  public void testDuplicateFieldNames() {
+    MessageInterfaceBuilder builder = new MessageInterfaceBuilder();
+    builder.setPackageName("foo");
+    builder.setInterfaceName("bar");
+    builder.setMessageDeclaration(MessageDeclaration.of("foo/bar", "int32 foo\nint32 Foo"));
+    builder.setAddConstantsAndMethods(true);
+    String result = builder.build(messageFactory);
+    assertEquals("package foo;\n\n"
+        + "public interface bar extends org.ros.internal.message.Message {\n"
+        + "  static final java.lang.String _TYPE = \"foo/bar\";\n"
+        + "  static final java.lang.String _DEFINITION = \"int32 foo\\nint32 Foo\";\n"
+        + "  int getFoo();\n" + "  void setFoo(int value);\n" + "}\n", result);
+  }
+}
diff --git a/message_generation/src/test/java/org/ros/internal/message/MessageTest.java b/message_generation/src/test/java/org/ros/internal/message/MessageTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe80bb483e139b811229ddf2453e02abcc866e22
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/MessageTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.ros.internal.message.topic.TopicDefinitionResourceProvider;
+import org.ros.message.MessageFactory;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class MessageTest {
+
+  private TopicDefinitionResourceProvider topicDefinitionResourceProvider;
+  private MessageFactory messageFactory;
+
+  @Before
+  public void before() {
+    topicDefinitionResourceProvider = new TopicDefinitionResourceProvider();
+    messageFactory = new DefaultMessageFactory(topicDefinitionResourceProvider);
+  }
+
+  @Test
+  public void testCreateEmptyMessage() {
+    topicDefinitionResourceProvider.add("foo/foo", "");
+    messageFactory.newFromType("foo/foo");
+  }
+
+  @Test
+  public void testCreateEmptyMessageWithBlankLines() {
+    topicDefinitionResourceProvider.add("foo/foo", "\n\n\n\n\n");
+    messageFactory.newFromType("foo/foo");
+  }
+
+  @Test
+  public void testString() {
+    String data = "Hello, ROS!";
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/String");
+    rawMessage.setString("data", data);
+    assertEquals(data, rawMessage.getString("data"));
+  }
+
+  @Test
+  public void testStringWithComments() {
+    topicDefinitionResourceProvider.add("foo/foo", "# foo\nstring data\n    # string other data");
+    String data = "Hello, ROS!";
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    rawMessage.setString("data", data);
+    assertEquals(data, rawMessage.getString("data"));
+  }
+
+  @Test
+  public void testInt8() {
+    byte data = 42;
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int8");
+    rawMessage.setInt8("data", data);
+    assertEquals(data, rawMessage.getInt8("data"));
+  }
+
+  @Test
+  public void testNestedMessage() {
+    topicDefinitionResourceProvider.add("foo/foo", "bar data");
+    topicDefinitionResourceProvider.add("foo/bar", "int8 data");
+    RawMessage fooMessage = messageFactory.newFromType("foo/foo");
+    RawMessage barMessage = messageFactory.newFromType("foo/bar");
+    fooMessage.setMessage("data", barMessage);
+    byte data = 42;
+    barMessage.setInt8("data", data);
+    assertEquals(data, fooMessage.getMessage("data").toRawMessage().getInt8("data"));
+  }
+
+  @Test
+  public void testNestedMessageList() {
+    topicDefinitionResourceProvider.add("foo/foo", "bar[] data");
+    topicDefinitionResourceProvider.add("foo/bar", "int8 data");
+    RawMessage fooMessage = messageFactory.newFromType("foo/foo");
+    RawMessage barMessage = messageFactory.newFromType("foo/bar");
+    fooMessage.setMessageList("data", Lists.<Message>newArrayList(barMessage));
+    byte data = 42;
+    barMessage.toRawMessage().setInt8("data", data);
+    assertEquals(data, fooMessage.getMessageList("data").get(0).toRawMessage().getInt8("data"));
+  }
+
+  @Test
+  public void testConstantInt8() {
+    topicDefinitionResourceProvider.add("foo/foo", "int8 data=42");
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    assertEquals(42, rawMessage.getInt8("data"));
+  }
+
+  @Test
+  public void testConstantString() {
+    topicDefinitionResourceProvider.add("foo/foo", "string data=Hello, ROS! # comment ");
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    assertEquals("Hello, ROS! # comment", rawMessage.getString("data"));
+  }
+
+  public void testInt8List() {
+    topicDefinitionResourceProvider.add("foo/foo", "int8[] data");
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    byte[] data = new byte[] { (byte) 1, (byte) 2, (byte) 3 };
+    rawMessage.setInt8Array("data", data);
+    assertEquals(data, rawMessage.getInt8Array("data"));
+  }
+}
\ No newline at end of file
diff --git a/message_generation/src/test/java/org/ros/internal/message/RawMessageSerializationTest.java b/message_generation/src/test/java/org/ros/internal/message/RawMessageSerializationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf1bbce7e81cec0c1aca33b8bab7331d3eee6b
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/RawMessageSerializationTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message;
+
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.collect.Lists;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.junit.Before;
+import org.junit.Test;
+import org.ros.internal.message.topic.TopicDefinitionResourceProvider;
+import org.ros.message.Duration;
+import org.ros.message.MessageFactory;
+import org.ros.message.Time;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class RawMessageSerializationTest {
+
+  private TopicDefinitionResourceProvider topicDefinitionResourceProvider;
+  private MessageFactory messageFactory;
+
+  @Before
+  public void before() {
+    topicDefinitionResourceProvider = new TopicDefinitionResourceProvider();
+    messageFactory = new DefaultMessageFactory(topicDefinitionResourceProvider);
+  }
+
+  private void checkSerializeAndDeserialize(Message message) {
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    DefaultMessageSerializer serializer = new DefaultMessageSerializer();
+    serializer.serialize(message, buffer);
+    DefaultMessageDeserializer<RawMessage> deserializer =
+        new DefaultMessageDeserializer<RawMessage>(message.toRawMessage().getIdentifier(),
+            messageFactory);
+    RawMessage deserializedMessage = deserializer.deserialize(buffer);
+    assertTrue(message.equals(deserializedMessage));
+  }
+
+  @Test
+  public void testBool() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Bool");
+    rawMessage.setBool("data", true);
+    checkSerializeAndDeserialize(rawMessage);
+    rawMessage.setBool("data", false);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testInt8() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int8");
+    rawMessage.setInt8("data", (byte) 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testUint8() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt8");
+    rawMessage.setUInt8("data", (byte) 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testInt16() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int16");
+    rawMessage.setInt16("data", (short) 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testUInt16() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt16");
+    rawMessage.setUInt16("data", (short) 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testInt32() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int32");
+    rawMessage.setInt32("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testUInt32() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt32");
+    rawMessage.setUInt32("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testInt64() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int64");
+    rawMessage.setInt64("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testUInt64() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt64");
+    rawMessage.setUInt64("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testFloat32() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Float32");
+    rawMessage.setFloat32("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testFloat64() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Float64");
+    rawMessage.setFloat64("data", 42);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testString() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/String");
+    rawMessage.setString("data", "Hello, ROS!");
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testTime() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Time");
+    rawMessage.setTime("data", new Time());
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testDuration() {
+    RawMessage rawMessage = messageFactory.newFromType("std_msgs/Duration");
+    rawMessage.setDuration("data", new Duration());
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testNestedMessage() {
+    topicDefinitionResourceProvider.add("foo/foo", "std_msgs/String data");
+    RawMessage fooMessage = messageFactory.newFromType("foo/foo");
+    RawMessage stringMessage = messageFactory.newFromType("std_msgs/String");
+    stringMessage.setString("data", "Hello, ROS!");
+    fooMessage.setMessage("data", stringMessage);
+    checkSerializeAndDeserialize(fooMessage);
+  }
+
+  @Test
+  public void testNestedMessageArray() {
+    topicDefinitionResourceProvider.add("foo/foo", "std_msgs/String[] data");
+    RawMessage fooMessage = messageFactory.newFromType("foo/foo");
+    RawMessage stringMessageA = messageFactory.newFromType("std_msgs/String");
+    stringMessageA.setString("data", "Hello, ROS!");
+    RawMessage stringMessageB = messageFactory.newFromType("std_msgs/String");
+    stringMessageB.setString("data", "Goodbye, ROS!");
+    fooMessage.setMessageList("data", Lists.<Message>newArrayList(stringMessageA, stringMessageB));
+    checkSerializeAndDeserialize(fooMessage);
+  }
+
+  @Test
+  public void testChannelBuffer() {
+    topicDefinitionResourceProvider.add("foo/foo", "uint8[] data");
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    buffer.writeBytes(new byte[] { 1, 2, 3, 4, 5 });
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    rawMessage.setChannelBuffer("data", buffer);
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testInt32Array() {
+    topicDefinitionResourceProvider.add("foo/foo", "int32[] data");
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    rawMessage.setInt32Array("data", new int[] { 1, 2, 3, 4, 5 });
+    checkSerializeAndDeserialize(rawMessage);
+  }
+
+  @Test
+  public void testFloat64Array() {
+    topicDefinitionResourceProvider.add("foo/foo", "float64[] data");
+    RawMessage rawMessage = messageFactory.newFromType("foo/foo");
+    rawMessage.setFloat64Array("data", new double[] { 1, 2, 3, 4, 5 });
+    checkSerializeAndDeserialize(rawMessage);
+  }
+}
diff --git a/message_generation/src/test/java/org/ros/internal/message/ServiceTest.java b/message_generation/src/test/java/org/ros/internal/message/ServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..decb7c333b0353dedd3c8f61a74ec3dec95acaca
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/ServiceTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.ros.internal.message.service.ServiceDefinitionResourceProvider;
+import org.ros.internal.message.service.ServiceRequestMessageFactory;
+import org.ros.internal.message.service.ServiceResponseMessageFactory;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class ServiceTest {
+
+  private ServiceDefinitionResourceProvider serviceDefinitionResourceProvider;
+  private ServiceRequestMessageFactory serviceRequestMessageFactory;
+  private ServiceResponseMessageFactory serviceResponseMessageFactory;
+
+  @Before
+  public void setUp() {
+    serviceDefinitionResourceProvider = new ServiceDefinitionResourceProvider();
+    serviceDefinitionResourceProvider.add("foo/Echo", "string data\n---\nstring data");
+    serviceRequestMessageFactory =
+        new ServiceRequestMessageFactory(serviceDefinitionResourceProvider);
+    serviceResponseMessageFactory =
+        new ServiceResponseMessageFactory(serviceDefinitionResourceProvider);
+  }
+
+  @Test
+  public void testCreateEchoService() {
+    RawMessage request = serviceRequestMessageFactory.newFromType("foo/Echo");
+    RawMessage response = serviceResponseMessageFactory.newFromType("foo/Echo");
+    request.setString("data", "Hello, ROS!");
+    response.setString("data", "Hello, ROS!");
+  }
+}
diff --git a/message_generation/src/test/java/org/ros/internal/message/field/ArrayFieldTest.java b/message_generation/src/test/java/org/ros/internal/message/field/ArrayFieldTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ebb26489cd77a1c252685904b056e97e742b6b9
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/internal/message/field/ArrayFieldTest.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.internal.message.field;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.ros.internal.message.MessageBuffers;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.junit.Test;
+
+/**
+ * The following unit tests were created by inspecting the serialization of
+ * array fields using the ROS Python client library.
+ * 
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class ArrayFieldTest {
+
+  @Test
+  public void testBooleanArrayFieldVariableSize() {
+    BooleanArrayField field = BooleanArrayField.newVariable("foo", -1);
+    boolean[] value = new boolean[] { true, false, true, false };
+    field.setValue(value);
+    assertEquals(PrimitiveFieldType.BOOL, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 4, 0, 0, 0, 1, 0, 1, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testBooleanArrayFieldFixedSize() {
+    BooleanArrayField field = BooleanArrayField.newVariable("foo", 4);
+    field.setValue(new boolean[] { true, false, true, false });
+    assertEquals(PrimitiveFieldType.BOOL, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 1, 0, 1, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void testByteArrayFieldVariableSize() {
+    testByteArrayFieldVariableSize(PrimitiveFieldType.INT8);
+    testByteArrayFieldVariableSize(PrimitiveFieldType.BYTE);
+    testByteArrayFieldVariableSize(PrimitiveFieldType.UINT8);
+    testByteArrayFieldVariableSize(PrimitiveFieldType.CHAR);
+  }
+
+  private void testByteArrayFieldVariableSize(FieldType type) {
+    ByteArrayField field = ByteArrayField.newVariable(type, "foo", -1);
+    field.setValue(new byte[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 4, 0, 0, 0, 1, 2, 3, 4 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void testByteArrayFieldFixedSize() {
+    testByteArrayFieldFixedSize(PrimitiveFieldType.INT8);
+    testByteArrayFieldFixedSize(PrimitiveFieldType.BYTE);
+    testByteArrayFieldFixedSize(PrimitiveFieldType.UINT8);
+    testByteArrayFieldFixedSize(PrimitiveFieldType.CHAR);
+  }
+
+  private void testByteArrayFieldFixedSize(FieldType type) {
+    ByteArrayField field = ByteArrayField.newVariable(type, "foo", 4);
+    field.setValue(new byte[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 1, 2, 3, 4 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testDoubleArrayFieldVariableSize() {
+    DoubleArrayField field = DoubleArrayField.newVariable("foo", -1);
+    field.setValue(new double[] { 1, 2, 3, 4 });
+    assertEquals(PrimitiveFieldType.FLOAT64, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected =
+        new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
+            0, 8, 64, 0, 0, 0, 0, 0, 0, 16, 64 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testDoubleArrayFieldFixedSize() {
+    DoubleArrayField field = DoubleArrayField.newVariable("foo", 4);
+    field.setValue(new double[] { 1, 2, 3, 4 });
+    assertEquals(PrimitiveFieldType.FLOAT64, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected =
+        new byte[] { 0, 0, 0, 0, 0, 0, -16, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 8, 64,
+            0, 0, 0, 0, 0, 0, 16, 64 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testFloatArrayFieldVariableSize() {
+    FloatArrayField field = FloatArrayField.newVariable("foo", -1);
+    field.setValue(new float[] { 1, 2, 3, 4 });
+    assertEquals(PrimitiveFieldType.FLOAT32, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected =
+        new byte[] { 4, 0, 0, 0, 0, 0, -128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, -128, 64 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testFloatArrayFieldFixedSize() {
+    FloatArrayField field = FloatArrayField.newVariable("foo", 4);
+    field.setValue(new float[] { 1, 2, 3, 4 });
+    assertEquals(PrimitiveFieldType.FLOAT32, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 0, 0, -128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, -128, 64 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testIntegerArrayFieldVariableSize() {
+    testIntegerArrayFieldVariableSize(PrimitiveFieldType.INT32);
+    testIntegerArrayFieldVariableSize(PrimitiveFieldType.UINT32);
+  }
+
+  private void testIntegerArrayFieldVariableSize(FieldType type) {
+    IntegerArrayField field = IntegerArrayField.newVariable(type, "foo", -1);
+    field.setValue(new int[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testIntegerArrayFieldFixedSize() {
+    testIntegerArrayFieldFixedSize(PrimitiveFieldType.INT32);
+    testIntegerArrayFieldFixedSize(PrimitiveFieldType.UINT32);
+  }
+
+  private void testIntegerArrayFieldFixedSize(FieldType type) {
+    IntegerArrayField field = IntegerArrayField.newVariable(type, "foo", 4);
+    field.setValue(new int[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testLongArrayFieldVariableSize() {
+    testLongArrayFieldVariableSize(PrimitiveFieldType.INT64);
+    testLongArrayFieldVariableSize(PrimitiveFieldType.UINT64);
+  }
+
+  private void testLongArrayFieldVariableSize(FieldType type) {
+    LongArrayField field = LongArrayField.newVariable(type, "foo", -1);
+    field.setValue(new long[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected =
+        new byte[] { 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+            0, 0, 4, 0, 0, 0, 0, 0, 0, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testLongArrayFieldFixedSize() {
+    testLongArrayFieldFixedSize(PrimitiveFieldType.INT64);
+    testLongArrayFieldFixedSize(PrimitiveFieldType.UINT64);
+  }
+
+  private void testLongArrayFieldFixedSize(FieldType type) {
+    LongArrayField field = LongArrayField.newVariable(type, "foo", 4);
+    field.setValue(new long[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected =
+        new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+            0, 0, 0, 0, 0, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testShortArrayFieldVariableSize() {
+    testShortArrayFieldVariableSize(PrimitiveFieldType.INT16);
+    testShortArrayFieldVariableSize(PrimitiveFieldType.UINT16);
+  }
+
+  private void testShortArrayFieldVariableSize(FieldType type) {
+    ShortArrayField field = ShortArrayField.newVariable(type, "foo", -1);
+    field.setValue(new short[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 4, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+
+  @Test
+  public void testShortArrayFieldFixedSize() {
+    testShortArrayFieldFixedSize(PrimitiveFieldType.INT16);
+    testShortArrayFieldFixedSize(PrimitiveFieldType.UINT16);
+  }
+
+  private void testShortArrayFieldFixedSize(FieldType type) {
+    ShortArrayField field = ShortArrayField.newVariable(type, "foo", 4);
+    field.setValue(new short[] { 1, 2, 3, 4 });
+    assertEquals(type, field.getType());
+    ChannelBuffer buffer = MessageBuffers.dynamicBuffer();
+    field.serialize(buffer);
+    byte[] expected = new byte[] { 1, 0, 2, 0, 3, 0, 4, 0 };
+    byte[] actual = new byte[buffer.readableBytes()];
+    buffer.readBytes(actual);
+    assertArrayEquals(expected, actual);
+  }
+}
diff --git a/message_generation/src/test/java/org/ros/message/DurationTest.java b/message_generation/src/test/java/org/ros/message/DurationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb337eb43c7dc0998f3d830eadc28314e6c85440
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/message/DurationTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.message;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author kwc@willowgarage.com (Ken Conley)
+ */
+public class DurationTest {
+
+  @Before
+  public void setUp()  {
+  }
+
+  @Test
+  public void testConstructor() {
+    // Test no args constructor.
+    Duration t = new Duration();
+    assertEquals(0, t.nsecs);
+    assertEquals(0, t.secs);
+      
+    // Test secs/nsecs constructor with no normalization.
+    t = new Duration(1, 2);
+    assertEquals(1, t.secs);
+    assertEquals(2, t.nsecs);
+
+    // Test secs/nsecs constructor with normalization.
+    t = new Duration(2, -1);
+    assertEquals(1, t.secs);
+    assertEquals(1000000000 - 1, t.nsecs);
+    
+    t = new Duration(2, 1000000000 + 2);
+    assertEquals(3, t.secs);
+    assertEquals(2, t.nsecs);
+  }
+  
+  @Test
+  public void testNormalize() { 
+    Duration d = new Duration(0, 0);
+    d.secs = 1;
+    d.nsecs = 1000000000;
+    d.normalize();
+    assertEquals(2, d.secs);
+    assertEquals(0, d.nsecs);
+    
+    d.secs = 1;
+    d.nsecs = -1;
+    d.normalize();
+    assertEquals(0, d.secs);
+    assertEquals(1000000000-1, d.nsecs);
+  }
+  
+  @Test
+  public void testIsZero() {
+    assertTrue(new Duration(0, 0).isZero());
+    assertFalse(new Duration(1, 0).isZero());
+    assertFalse(new Duration(0, 1).isZero());
+  }
+  
+  @Test
+  public void testComparable() {
+    assertEquals(0, new Duration(0, 0).compareTo(new Duration(0, 0)));
+    assertEquals(0, new Duration(1, 0).compareTo(new Duration(1, 0)));
+    
+    assertTrue(new Duration(0, 0).compareTo(new Duration(0, -1)) > 0);
+    assertTrue(new Duration(0, -1).compareTo(new Duration(0, 0)) < 0);
+    
+    assertTrue(new Duration(0, 0).compareTo(new Duration(-1, 0)) > 0);
+    assertTrue(new Duration(-1, 0).compareTo(new Duration(0, 0)) < 0);
+    
+    assertTrue(new Duration(1, 0).compareTo(new Duration(0, 0)) > 0);
+    assertTrue(new Duration(0, 0).compareTo(new Duration(1, 0)) < 0);
+    
+    assertTrue(new Duration(0, 1).compareTo(new Duration(0, 0)) > 0);
+    assertTrue(new Duration(0, 0).compareTo(new Duration(0, 1)) < 0);
+  }
+}
\ No newline at end of file
diff --git a/message_generation/src/test/java/org/ros/message/TimeTest.java b/message_generation/src/test/java/org/ros/message/TimeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ef0c4d5c631a23571a2b9261866e1f7d46bc6e3
--- /dev/null
+++ b/message_generation/src/test/java/org/ros/message/TimeTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.message;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author kwc@willowgarage.com (Ken Conley)
+ */
+public class TimeTest {
+
+  @Before
+  public void setUp() {
+  }
+
+  @Test
+  public void testConstructor() {
+    // Test no args constructor.
+    Time t = new Time();
+    assertEquals(0, t.nsecs);
+    assertEquals(0, t.secs);
+
+    // Test secs/nsecs constructor with no normalization.
+    t = new Time(1, 2);
+    assertEquals(1, t.secs);
+    assertEquals(2, t.nsecs);
+
+    // Test secs/nsecs constructor with normalization.
+    t = new Time(2, -1);
+    assertEquals(1, t.secs);
+    assertEquals(1000000000 - 1, t.nsecs);
+
+    t = new Time(2, 1000000000 + 2);
+    assertEquals(3, t.secs);
+    assertEquals(2, t.nsecs);
+  }
+
+  @Test
+  public void testFromMillis() {
+    assertEquals(new Time(0, 0), Time.fromMillis(0));
+    assertEquals(new Time(0, 1000000), Time.fromMillis(1));
+    assertEquals(new Time(1, 0), Time.fromMillis(1000));
+    assertEquals(new Time(10, 0), Time.fromMillis(10000));
+    assertEquals(new Time(1, 1000000), Time.fromMillis(1001));
+    assertEquals(new Time(1, 11000000), Time.fromMillis(1011));
+  }
+
+  @Test
+  public void testNormalize() {
+    Time t = new Time(0, 0);
+    t.secs = 1;
+    t.nsecs = 1000000000;
+    t.normalize();
+    assertEquals(2, t.secs);
+    assertEquals(0, t.nsecs);
+
+    t.secs = 1;
+    t.nsecs = -1;
+    t.normalize();
+    assertEquals(0, t.secs);
+    assertEquals(1000000000 - 1, t.nsecs);
+  }
+
+  @Test
+  public void testIsZero() {
+    assertTrue(new Time(0, 0).isZero());
+    assertFalse(new Time(1, 0).isZero());
+    assertFalse(new Time(0, 1).isZero());
+  }
+
+  @Test
+  public void testComparable() {
+    assertEquals(0, new Time(0, 0).compareTo(new Time(0, 0)));
+    assertEquals(0, new Time(1, 1).compareTo(new Time(1, 1)));
+    assertTrue(new Time(0, 1).compareTo(new Time(0, 0)) > 0);
+    
+    assertEquals(-1, new Time(0, 0).compareTo(new Time(0, 1)));
+    assertTrue(new Time(0, 0).compareTo(new Time(0, 1)) < 0);
+    assertTrue(new Time(1, 0).compareTo(new Time(0, 0)) > 0);
+    assertTrue(new Time(0, 0).compareTo(new Time(1, 0)) < 0);
+
+  }
+}
\ No newline at end of file
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Point.msg b/message_generation/src/test/resources/geometry_msgs/msg/Point.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f1d3a71a853c668f066de795ba5e0f4458f3f1c0
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Point.msg
@@ -0,0 +1,4 @@
+# This contains the position of a point in free space
+float64 x
+float64 y
+float64 z
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Point32.msg b/message_generation/src/test/resources/geometry_msgs/msg/Point32.msg
new file mode 100644
index 0000000000000000000000000000000000000000..52af0a29a13b606b40945c2fd96a6473d0b2067e
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Point32.msg
@@ -0,0 +1,11 @@
+# This contains the position of a point in free space(with 32 bits of precision).
+# It is recommeded to use Point wherever possible instead of Point32.  
+# 
+# This recommendation is to promote interoperability.  
+#
+# This message is designed to take up less space when sending
+# lots of points at once, as in the case of a PointCloud.  
+
+float32 x
+float32 y
+float32 z
\ No newline at end of file
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PointStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/PointStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..82c3437946ccaf5c65817a0485cde96992b622dc
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PointStamped.msg
@@ -0,0 +1,3 @@
+# This represents a Point with reference coordinate frame and timestamp
+Header header
+Point point
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Polygon.msg b/message_generation/src/test/resources/geometry_msgs/msg/Polygon.msg
new file mode 100644
index 0000000000000000000000000000000000000000..c081fc4374ef1f3b560b441da7451829a98f5f76
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Polygon.msg
@@ -0,0 +1,2 @@
+#A specification of a polygon where the first and last points are assumed to be connected
+Point32[] points
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PolygonStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/PolygonStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..c9ee413840b3c8bd47d9c41b13a6d68176b29f56
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PolygonStamped.msg
@@ -0,0 +1,3 @@
+# This represents a Polygon with reference coordinate frame and timestamp
+Header header
+Polygon polygon
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Pose.msg b/message_generation/src/test/resources/geometry_msgs/msg/Pose.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b81919c7b256667be00908b866f8bf63404256c6
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Pose.msg
@@ -0,0 +1,3 @@
+# A representation of pose in free space, composed of postion and orientation. 
+Point position
+Quaternion orientation
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Pose2D.msg b/message_generation/src/test/resources/geometry_msgs/msg/Pose2D.msg
new file mode 100644
index 0000000000000000000000000000000000000000..e9555b466ac37570adcb69619fa3b3b78a9e602e
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Pose2D.msg
@@ -0,0 +1,5 @@
+# This expresses a position and orientation on a 2D manifold.
+
+float64 x
+float64 y
+float64 theta
\ No newline at end of file
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PoseArray.msg b/message_generation/src/test/resources/geometry_msgs/msg/PoseArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..4fe0cec7c78baf2a9ee60cb751d7f7d617a8fe3a
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PoseArray.msg
@@ -0,0 +1,5 @@
+# An array of poses with a header for global reference.
+
+Header header
+
+Pose[] poses
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PoseStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/PoseStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..7e3cdc57b7ba5856bce0cb954d20b7a74354bdc2
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PoseStamped.msg
@@ -0,0 +1,3 @@
+# A Pose with reference coordinate frame and timestamp
+Header header
+Pose pose
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovariance.msg b/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovariance.msg
new file mode 100644
index 0000000000000000000000000000000000000000..86bc45adbb5d7d64e90556ac1f24ca8f725313cd
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovariance.msg
@@ -0,0 +1,9 @@
+# This represents a pose in free space with uncertainty.
+
+Pose pose
+
+# Row-major representation of the 6x6 covariance matrix
+# The orientation parameters use a fixed-axis representation.
+# In order, the parameters are:
+# (x, y, z, rotation about X axis, rotation about Y axis, rotation about Z axis)
+float64[36] covariance
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovarianceStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovarianceStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..cdc306b906075b54479aa7a6a0db66f7edbc2f45
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/PoseWithCovarianceStamped.msg
@@ -0,0 +1,4 @@
+# This expresses an estimated pose with a reference coordinate frame and timestamp
+
+Header header
+PoseWithCovariance pose
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Quaternion.msg b/message_generation/src/test/resources/geometry_msgs/msg/Quaternion.msg
new file mode 100644
index 0000000000000000000000000000000000000000..9f4fde2bf4c13dc86a95688e4b5254aaec186e2a
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Quaternion.msg
@@ -0,0 +1,6 @@
+# This represents an orientation in free space in quaternion form.
+
+float64 x
+float64 y
+float64 z
+float64 w
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/QuaternionStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/QuaternionStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..62c2fdfe992c1a5eef9bf2c3a07aae7f7ad30b8a
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/QuaternionStamped.msg
@@ -0,0 +1,4 @@
+# This represents an orientation with reference coordinate frame and timestamp.
+
+Header header
+Quaternion quaternion
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Transform.msg b/message_generation/src/test/resources/geometry_msgs/msg/Transform.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f605c85ea8ec4c4871bdb7d77db6e7011c63e86d
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Transform.msg
@@ -0,0 +1,4 @@
+# This represents the transform between two coordinate frames in free space.
+
+Vector3 translation
+Quaternion rotation
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/TransformStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/TransformStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..c28ae8af1e841f2f7ef05f83bf570a13b891cb72
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/TransformStamped.msg
@@ -0,0 +1,10 @@
+# This expresses a transform from coordinate frame header.frame_id
+# to the coordinate frame child_frame_id
+#
+# This message is mostly used by the 
+# <a href="http://www.ros.org/wiki/tf">tf</a> package. 
+# See its documentation for more information.
+
+Header header
+string child_frame_id # the frame id of the child frame
+Transform transform
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Twist.msg b/message_generation/src/test/resources/geometry_msgs/msg/Twist.msg
new file mode 100644
index 0000000000000000000000000000000000000000..7012c2dd87ea6702f8e37a9cfbb7aab10caa8f7d
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Twist.msg
@@ -0,0 +1,3 @@
+# This expresses velocity in free space broken into its linear and angular parts.
+Vector3  linear
+Vector3  angular
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/TwistStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/TwistStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..53b8253b4251a4c6637ddd85d9937d796558949c
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/TwistStamped.msg
@@ -0,0 +1,3 @@
+# A twist with reference coordinate frame and timestamp
+Header header
+Twist twist
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovariance.msg b/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovariance.msg
new file mode 100644
index 0000000000000000000000000000000000000000..111a19c5f7da42f846ed9eaff26ffc6a515c9e5f
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovariance.msg
@@ -0,0 +1,9 @@
+# This expresses velocity in free space with uncertainty.
+
+Twist twist
+
+# Row-major representation of the 6x6 covariance matrix
+# The orientation parameters use a fixed-axis representation.
+# In order, the parameters are:
+# (x, y, z, rotation about X axis, rotation about Y axis, rotation about Z axis)
+float64[36] covariance
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovarianceStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovarianceStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..aba6ebe735871ba35218fcebe021fbef6e11d5d9
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/TwistWithCovarianceStamped.msg
@@ -0,0 +1,3 @@
+# This represents an estimated twist with reference coordinate frame and timestamp.
+Header header
+TwistWithCovariance twist
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Vector3.msg b/message_generation/src/test/resources/geometry_msgs/msg/Vector3.msg
new file mode 100644
index 0000000000000000000000000000000000000000..00dd4cbac99e2729865cd00faff2ac482c0794cd
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Vector3.msg
@@ -0,0 +1,5 @@
+# This represents a vector in free space. 
+
+float64 x
+float64 y
+float64 z
\ No newline at end of file
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Vector3Stamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/Vector3Stamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..e68eb062bebd5bba3cbaf9f33beae5a207f72a51
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Vector3Stamped.msg
@@ -0,0 +1,3 @@
+# This represents a Vector3 with reference coordinate frame and timestamp
+Header header
+Vector3 vector
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/Wrench.msg b/message_generation/src/test/resources/geometry_msgs/msg/Wrench.msg
new file mode 100644
index 0000000000000000000000000000000000000000..41201d4b844607ee2d3751f3f474774a2ae1e387
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/Wrench.msg
@@ -0,0 +1,4 @@
+# This represents force in free space, separated into
+# its linear and angular parts.
+Vector3  force
+Vector3  torque
diff --git a/message_generation/src/test/resources/geometry_msgs/msg/WrenchStamped.msg b/message_generation/src/test/resources/geometry_msgs/msg/WrenchStamped.msg
new file mode 100644
index 0000000000000000000000000000000000000000..dad910ed724de005e89e3422ef1ca7cec401e9e4
--- /dev/null
+++ b/message_generation/src/test/resources/geometry_msgs/msg/WrenchStamped.msg
@@ -0,0 +1,3 @@
+# A wrench with reference coordinate frame and timestamp
+Header header
+Wrench wrench
diff --git a/message_generation/src/test/resources/nav_msgs/action/GetMap.action b/message_generation/src/test/resources/nav_msgs/action/GetMap.action
new file mode 100644
index 0000000000000000000000000000000000000000..080e54fe195b4dd96a8c5ba0e08e824aa94c0416
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/action/GetMap.action
@@ -0,0 +1,5 @@
+# Get the map as a nav_msgs/OccupancyGrid
+---
+nav_msgs/OccupancyGrid map
+---
+# no feedback
\ No newline at end of file
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapAction.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapAction.msg
new file mode 100644
index 0000000000000000000000000000000000000000..1cbd69ca56edab0cb1590f60636bdc664eee96c9
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapAction.msg
@@ -0,0 +1,5 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+
+GetMapActionGoal action_goal
+GetMapActionResult action_result
+GetMapActionFeedback action_feedback
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapActionFeedback.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionFeedback.msg
new file mode 100644
index 0000000000000000000000000000000000000000..485360150b18d2411696610d80cb7758bef9cfbd
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionFeedback.msg
@@ -0,0 +1,5 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+
+Header header
+actionlib_msgs/GoalStatus status
+GetMapFeedback feedback
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapActionGoal.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionGoal.msg
new file mode 100644
index 0000000000000000000000000000000000000000..8782a1e363336ed8220ce9a33547dbd46fd9268c
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionGoal.msg
@@ -0,0 +1,5 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+
+Header header
+actionlib_msgs/GoalID goal_id
+GetMapGoal goal
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapActionResult.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionResult.msg
new file mode 100644
index 0000000000000000000000000000000000000000..707d61d63c5d986a1bb3e1b87c8f21e71dedf351
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapActionResult.msg
@@ -0,0 +1,5 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+
+Header header
+actionlib_msgs/GoalStatus status
+GetMapResult result
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapFeedback.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapFeedback.msg
new file mode 100644
index 0000000000000000000000000000000000000000..8eb4d4840eb0d27a33a08d42bfec821e08a2906e
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapFeedback.msg
@@ -0,0 +1,2 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+# no feedback
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapGoal.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapGoal.msg
new file mode 100644
index 0000000000000000000000000000000000000000..6354ac1172379e5191897cc96c52cb3f2e753de8
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapGoal.msg
@@ -0,0 +1,2 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+# Get the map as a nav_msgs/OccupancyGrid
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GetMapResult.msg b/message_generation/src/test/resources/nav_msgs/msg/GetMapResult.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b8c9dcd5a819bd847ff29b4b8d6e1bbaa64f4d7b
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GetMapResult.msg
@@ -0,0 +1,2 @@
+# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======
+nav_msgs/OccupancyGrid map
diff --git a/message_generation/src/test/resources/nav_msgs/msg/GridCells.msg b/message_generation/src/test/resources/nav_msgs/msg/GridCells.msg
new file mode 100644
index 0000000000000000000000000000000000000000..2c92894115110f24c745e06d9aeab55d0f3abb1d
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/GridCells.msg
@@ -0,0 +1,5 @@
+#an array of cells in a 2D grid
+Header header
+float32 cell_width
+float32 cell_height
+geometry_msgs/Point[] cells
diff --git a/message_generation/src/test/resources/nav_msgs/msg/MapMetaData.msg b/message_generation/src/test/resources/nav_msgs/msg/MapMetaData.msg
new file mode 100644
index 0000000000000000000000000000000000000000..398fbdd016f91045fd14ec727a65b6d1cf55dc0a
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/MapMetaData.msg
@@ -0,0 +1,13 @@
+# This hold basic information about the characterists of the OccupancyGrid
+
+# The time at which the map was loaded
+time map_load_time
+# The map resolution [m/cell]
+float32 resolution
+# Map width [cells]
+uint32 width
+# Map height [cells]
+uint32 height
+# The origin of the map [m, m, rad].  This is the real-world pose of the
+# cell (0,0) in the map.
+geometry_msgs/Pose origin
\ No newline at end of file
diff --git a/message_generation/src/test/resources/nav_msgs/msg/OccupancyGrid.msg b/message_generation/src/test/resources/nav_msgs/msg/OccupancyGrid.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f2e79bdad33b17af3236514343abe486e779522a
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/OccupancyGrid.msg
@@ -0,0 +1,11 @@
+# This represents a 2-D grid map, in which each cell represents the probability of
+# occupancy.
+
+Header header 
+
+#MetaData for the map
+MapMetaData info
+
+# The map data, in row-major order, starting with (0,0).  Occupancy
+# probabilities are in the range [0,100].  Unknown is -1.
+int8[] data
diff --git a/message_generation/src/test/resources/nav_msgs/msg/Odometry.msg b/message_generation/src/test/resources/nav_msgs/msg/Odometry.msg
new file mode 100644
index 0000000000000000000000000000000000000000..73578ed85765ca14b040dc888d9cb148530a95d3
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/Odometry.msg
@@ -0,0 +1,7 @@
+# This represents an estimate of a position and velocity in free space.  
+# The pose in this message should be specified in the coordinate frame given by header.frame_id.
+# The twist in this message should be specified in the coordinate frame given by the child_frame_id
+Header header
+string child_frame_id
+geometry_msgs/PoseWithCovariance pose
+geometry_msgs/TwistWithCovariance twist
diff --git a/message_generation/src/test/resources/nav_msgs/msg/Path.msg b/message_generation/src/test/resources/nav_msgs/msg/Path.msg
new file mode 100644
index 0000000000000000000000000000000000000000..979cb7d368d4246445d43e62df9d9aa20939fbe1
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/msg/Path.msg
@@ -0,0 +1,3 @@
+#An array of poses that represents a Path for a robot to follow
+Header header
+geometry_msgs/PoseStamped[] poses
diff --git a/message_generation/src/test/resources/nav_msgs/srv/GetMap.srv b/message_generation/src/test/resources/nav_msgs/srv/GetMap.srv
new file mode 100644
index 0000000000000000000000000000000000000000..6bd8e4a60a0f746dd500dbd550559f4735749208
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/srv/GetMap.srv
@@ -0,0 +1,3 @@
+# Get the map as a nav_msgs/OccupancyGrid
+---
+nav_msgs/OccupancyGrid map
diff --git a/message_generation/src/test/resources/nav_msgs/srv/GetPlan.srv b/message_generation/src/test/resources/nav_msgs/srv/GetPlan.srv
new file mode 100644
index 0000000000000000000000000000000000000000..f5c23edb78558e6fef8cda881c45c2bf3e94486a
--- /dev/null
+++ b/message_generation/src/test/resources/nav_msgs/srv/GetPlan.srv
@@ -0,0 +1,13 @@
+# Get a plan from the current position to the goal Pose 
+
+# The start pose for the plan
+geometry_msgs/PoseStamped start
+
+# The final pose of the goal position
+geometry_msgs/PoseStamped goal
+
+# If the goal is obstructed, how many meters the planner can 
+# relax the constraint in x and y before failing. 
+float32 tolerance
+---
+nav_msgs/Path plan
diff --git a/message_generation/src/test/resources/std_msgs/msg/Bool.msg b/message_generation/src/test/resources/std_msgs/msg/Bool.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f7cabb94fc04ac5f83ca8f219357b439f29d002f
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Bool.msg
@@ -0,0 +1 @@
+bool data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/Byte.msg b/message_generation/src/test/resources/std_msgs/msg/Byte.msg
new file mode 100644
index 0000000000000000000000000000000000000000..d993b3455539598fdc5db3365a4534ed9f125b5d
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Byte.msg
@@ -0,0 +1 @@
+byte data
diff --git a/message_generation/src/test/resources/std_msgs/msg/ByteMultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/ByteMultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..bb00bd348bc726b4bf52ae12c1fe740855447b95
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/ByteMultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+byte[]            data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Char.msg b/message_generation/src/test/resources/std_msgs/msg/Char.msg
new file mode 100644
index 0000000000000000000000000000000000000000..39a1d46a97c419a2b8ab45b30c68758ed03b905b
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Char.msg
@@ -0,0 +1 @@
+char data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/ColorRGBA.msg b/message_generation/src/test/resources/std_msgs/msg/ColorRGBA.msg
new file mode 100644
index 0000000000000000000000000000000000000000..182dbc8349abec122d95436cb840906503f569f2
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/ColorRGBA.msg
@@ -0,0 +1,4 @@
+float32 r
+float32 g
+float32 b
+float32 a
diff --git a/message_generation/src/test/resources/std_msgs/msg/Duration.msg b/message_generation/src/test/resources/std_msgs/msg/Duration.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f13931ec8a7937ca624ff91af7f861559b5fc3fe
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Duration.msg
@@ -0,0 +1 @@
+duration data
diff --git a/message_generation/src/test/resources/std_msgs/msg/Empty.msg b/message_generation/src/test/resources/std_msgs/msg/Empty.msg
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/message_generation/src/test/resources/std_msgs/msg/Float32.msg b/message_generation/src/test/resources/std_msgs/msg/Float32.msg
new file mode 100644
index 0000000000000000000000000000000000000000..e89740534bd9c0344c18709de0c29667620295bd
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Float32.msg
@@ -0,0 +1 @@
+float32 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/Float32MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Float32MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..915830846dd023a111abd8ad2831d982b9c85a82
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Float32MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+float32[]         data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Float64.msg b/message_generation/src/test/resources/std_msgs/msg/Float64.msg
new file mode 100644
index 0000000000000000000000000000000000000000..cd09d39b8caedf067b9548d62ecab3c73b6ecace
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Float64.msg
@@ -0,0 +1 @@
+float64 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/Float64MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Float64MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..0a13b928fd70d116defc17ec0acc09a6296b57ff
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Float64MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+float64[]         data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Header.msg b/message_generation/src/test/resources/std_msgs/msg/Header.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b2f34f6f1d15f22149dae16e5e6bbf190a89a0d8
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Header.msg
@@ -0,0 +1,15 @@
+# Standard metadata for higher-level stamped data types.
+# This is generally used to communicate timestamped data 
+# in a particular coordinate frame.
+# 
+# sequence ID: consecutively increasing ID 
+uint32 seq
+#Two-integer timestamp that is expressed as:
+# * stamp.secs: seconds (stamp_secs) since epoch
+# * stamp.nsecs: nanoseconds since stamp_secs
+# time-handling sugar is provided by the client library
+time stamp
+#Frame this data is associated with
+# 0: no frame
+# 1: global frame
+string frame_id
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int16.msg b/message_generation/src/test/resources/std_msgs/msg/Int16.msg
new file mode 100644
index 0000000000000000000000000000000000000000..c4389faf706f189e64bc576af0f7788f06d16c86
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int16.msg
@@ -0,0 +1 @@
+int16 data
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int16MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Int16MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..d2ddea1d1d6a69a15cb17e434900a1afbadaac89
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int16MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+int16[]           data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int32.msg b/message_generation/src/test/resources/std_msgs/msg/Int32.msg
new file mode 100644
index 0000000000000000000000000000000000000000..0ecfe35f5f480f463e0b26e696c4f0e858aba06c
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int32.msg
@@ -0,0 +1 @@
+int32 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int32MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Int32MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..af60abda3a697bac5e596b23b04038414258188a
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int32MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+int32[]           data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int64.msg b/message_generation/src/test/resources/std_msgs/msg/Int64.msg
new file mode 100644
index 0000000000000000000000000000000000000000..6961e00f52989d8e03f54e0a0e0333ae470e6508
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int64.msg
@@ -0,0 +1 @@
+int64 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int64MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Int64MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f4f35e171b316dacbb0eb3a80e20885977171ebd
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int64MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+int64[]           data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int8.msg b/message_generation/src/test/resources/std_msgs/msg/Int8.msg
new file mode 100644
index 0000000000000000000000000000000000000000..1e42e554feea25175f15af74433d802e86ed0180
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int8.msg
@@ -0,0 +1 @@
+int8 data
diff --git a/message_generation/src/test/resources/std_msgs/msg/Int8MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/Int8MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..a59a37259e5e97c8dbee0072f4e6c282d7fc8fd3
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Int8MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+int8[]            data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/MultiArrayDimension.msg b/message_generation/src/test/resources/std_msgs/msg/MultiArrayDimension.msg
new file mode 100644
index 0000000000000000000000000000000000000000..08240462c4315969a5a8cde9292683c51865a5d3
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/MultiArrayDimension.msg
@@ -0,0 +1,3 @@
+string label   # label of given dimension
+uint32 size    # size of given dimension (in type units)
+uint32 stride  # stride of given dimension
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/MultiArrayLayout.msg b/message_generation/src/test/resources/std_msgs/msg/MultiArrayLayout.msg
new file mode 100644
index 0000000000000000000000000000000000000000..5437f8542af613c0058e380c27ab59cb5ebb7df0
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/MultiArrayLayout.msg
@@ -0,0 +1,26 @@
+# The multiarray declares a generic multi-dimensional array of a
+# particular data type.  Dimensions are ordered from outer most
+# to inner most.
+
+MultiArrayDimension[] dim # Array of dimension properties
+uint32 data_offset        # padding bytes at front of data
+
+# Accessors should ALWAYS be written in terms of dimension stride
+# and specified outer-most dimension first.
+# 
+# multiarray(i,j,k) = data[data_offset + dim_stride[1]*i + dim_stride[2]*j + k]
+#
+# A standard, 3-channel 640x480 image with interleaved color channels
+# would be specified as:
+#
+# dim[0].label  = "height"
+# dim[0].size   = 480
+# dim[0].stride = 3*640*480 = 921600  (note dim[0] stride is just size of image)
+# dim[1].label  = "width"
+# dim[1].size   = 640
+# dim[1].stride = 3*640 = 1920
+# dim[2].label  = "channel"
+# dim[2].size   = 3
+# dim[2].stride = 3
+#
+# multiarray(i,j,k) refers to the ith row, jth column, and kth channel.
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/String.msg b/message_generation/src/test/resources/std_msgs/msg/String.msg
new file mode 100644
index 0000000000000000000000000000000000000000..ae721739e8fa7035347d3fed3cca1b137e670c97
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/String.msg
@@ -0,0 +1 @@
+string data
diff --git a/message_generation/src/test/resources/std_msgs/msg/Time.msg b/message_generation/src/test/resources/std_msgs/msg/Time.msg
new file mode 100644
index 0000000000000000000000000000000000000000..7f8f721711fbbc620fa7f6b58a9f89d5667281be
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/Time.msg
@@ -0,0 +1 @@
+time data
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt16.msg b/message_generation/src/test/resources/std_msgs/msg/UInt16.msg
new file mode 100644
index 0000000000000000000000000000000000000000..87d0c44eb59dca29f419aaa77801b4fbc278f9f6
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt16.msg
@@ -0,0 +1 @@
+uint16 data
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt16MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/UInt16MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f38970b656cf1160e292f9effc8f5d8c3281a12b
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt16MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+uint16[]            data        # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt32.msg b/message_generation/src/test/resources/std_msgs/msg/UInt32.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b6c696b421e4a4c89c7f1420fbaa15af83913093
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt32.msg
@@ -0,0 +1 @@
+uint32 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt32MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/UInt32MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b2bb0771f0208bc3c45210a918d689d5a24b53a7
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt32MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+uint32[]          data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt64.msg b/message_generation/src/test/resources/std_msgs/msg/UInt64.msg
new file mode 100644
index 0000000000000000000000000000000000000000..2eb1afad37e320a366f7b0296fb207569a30db47
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt64.msg
@@ -0,0 +1 @@
+uint64 data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt64MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/UInt64MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..30d0cd92854159d4cc3fa5e996763cc08e9dcdf9
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt64MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+uint64[]          data          # array of data
+
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt8.msg b/message_generation/src/test/resources/std_msgs/msg/UInt8.msg
new file mode 100644
index 0000000000000000000000000000000000000000..5eefd870db82c99cf7d62e7ccff1824c114bd462
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt8.msg
@@ -0,0 +1 @@
+uint8 data
diff --git a/message_generation/src/test/resources/std_msgs/msg/UInt8MultiArray.msg b/message_generation/src/test/resources/std_msgs/msg/UInt8MultiArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..31f7d6a213995f216f4d124f1d6402852d1572b2
--- /dev/null
+++ b/message_generation/src/test/resources/std_msgs/msg/UInt8MultiArray.msg
@@ -0,0 +1,6 @@
+# Please look at the MultiArrayLayout message definition for
+# documentation on all multiarrays.
+
+MultiArrayLayout  layout        # specification of data layout
+uint8[]           data          # array of data
+
diff --git a/message_generation/src/test/resources/std_srvs/srv/Empty.srv b/message_generation/src/test/resources/std_srvs/srv/Empty.srv
new file mode 100644
index 0000000000000000000000000000000000000000..73b314ff7c704c18889cf90fdc024716c634adb6
--- /dev/null
+++ b/message_generation/src/test/resources/std_srvs/srv/Empty.srv
@@ -0,0 +1 @@
+---
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/ArrayVal.msg b/message_generation/src/test/resources/test_msgs/msg/ArrayVal.msg
new file mode 100644
index 0000000000000000000000000000000000000000..4a34dd1bb8c84ef12a33f1782a27acaaa8dc8812
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/ArrayVal.msg
@@ -0,0 +1,2 @@
+Val[] vals
+#Val[10] vals_fixed
diff --git a/message_generation/src/test/resources/test_msgs/msg/Composite.msg b/message_generation/src/test/resources/test_msgs/msg/Composite.msg
new file mode 100644
index 0000000000000000000000000000000000000000..4629d3e56c7c03e55052196f34f3a5976024f524
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/Composite.msg
@@ -0,0 +1,3 @@
+# composite message. required for testing import calculation in generators
+CompositeA a
+CompositeB b
diff --git a/message_generation/src/test/resources/test_msgs/msg/CompositeA.msg b/message_generation/src/test/resources/test_msgs/msg/CompositeA.msg
new file mode 100644
index 0000000000000000000000000000000000000000..9f4fde2bf4c13dc86a95688e4b5254aaec186e2a
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/CompositeA.msg
@@ -0,0 +1,6 @@
+# This represents an orientation in free space in quaternion form.
+
+float64 x
+float64 y
+float64 z
+float64 w
diff --git a/message_generation/src/test/resources/test_msgs/msg/CompositeB.msg b/message_generation/src/test/resources/test_msgs/msg/CompositeB.msg
new file mode 100644
index 0000000000000000000000000000000000000000..fb689bc8225e2c6f60b45c852c7f19da3dcd00cb
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/CompositeB.msg
@@ -0,0 +1,4 @@
+# copy of geometry_msgs/Point for testing
+float64 x
+float64 y
+float64 z
diff --git a/message_generation/src/test/resources/test_msgs/msg/EmbedTest.msg b/message_generation/src/test/resources/test_msgs/msg/EmbedTest.msg
new file mode 100644
index 0000000000000000000000000000000000000000..e1962cd4e10b88807c085907284686a85e1b9026
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/EmbedTest.msg
@@ -0,0 +1,6 @@
+std_msgs/String str1
+std_msgs/Int32 int1
+std_msgs/Int32[] ints
+Val val
+Val[] vals
+ArrayVal[] arrayval
diff --git a/message_generation/src/test/resources/test_msgs/msg/Floats.msg b/message_generation/src/test/resources/test_msgs/msg/Floats.msg
new file mode 100644
index 0000000000000000000000000000000000000000..6bd8052d3121617bd05bb32247181ab8819791a1
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/Floats.msg
@@ -0,0 +1,2 @@
+# exact copy of rospy_tutorials/Floats, used for testing
+float32[] data
diff --git a/message_generation/src/test/resources/test_msgs/msg/HeaderHeaderVal.msg b/message_generation/src/test/resources/test_msgs/msg/HeaderHeaderVal.msg
new file mode 100644
index 0000000000000000000000000000000000000000..6882d7ac4ae5e42bab89bdb212d21aba8dedf918
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/HeaderHeaderVal.msg
@@ -0,0 +1,2 @@
+Header header
+HeaderVal val
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/HeaderVal.msg b/message_generation/src/test/resources/test_msgs/msg/HeaderVal.msg
new file mode 100644
index 0000000000000000000000000000000000000000..91f99b2545dbf8b10e20be09e7cbbd0478531d12
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/HeaderVal.msg
@@ -0,0 +1,2 @@
+Header header
+string val
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/PythonKeyword.msg b/message_generation/src/test/resources/test_msgs/msg/PythonKeyword.msg
new file mode 100644
index 0000000000000000000000000000000000000000..0949ea888777ebf179376c7c044c8886c9eac1bd
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/PythonKeyword.msg
@@ -0,0 +1 @@
+int32 yield
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestArrays.msg b/message_generation/src/test/resources/test_msgs/msg/TestArrays.msg
new file mode 100644
index 0000000000000000000000000000000000000000..2d7493fe41614d7fed5ba02067c030377780d85d
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestArrays.msg
@@ -0,0 +1,10 @@
+# caller_id of most recent node to send this message
+string caller_id
+# caller_id of the original node to send this message
+string orig_caller_id
+
+int32[] int32_array
+float32[] float32_array
+time[] time_array
+TestString[] test_string_array
+# TODO: array of arrays
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestConstants.msg b/message_generation/src/test/resources/test_msgs/msg/TestConstants.msg
new file mode 100644
index 0000000000000000000000000000000000000000..344afc3840a05ca3247d780a54893fe263e73939
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestConstants.msg
@@ -0,0 +1,15 @@
+float32 A=-123.0
+float32 B=124.0
+float64 C=125.0
+int32 X=123
+int32 Y=-123
+uint32 Z=124
+string FOO=foo
+string SINGLEQUOTE='hi
+string DOUBLEQUOTE="hello" there
+string MULTIQUOTE="hello" 'goodbye'
+string EXAMPLE="#comments" are ignored, and leading and trailing whitespace removed
+string WHITESPACE= strip  
+string EMPTY= 
+bool TRUE=1
+bool FALSE=0
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestFixedArray.msg b/message_generation/src/test/resources/test_msgs/msg/TestFixedArray.msg
new file mode 100644
index 0000000000000000000000000000000000000000..005aa94af24fd1e3cfac5215cf76a6a6b9523999
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestFixedArray.msg
@@ -0,0 +1,16 @@
+float32[1] f32_1
+float32[3] f32_3
+float64[1] f64_1
+float64[3] f64_3
+int8[1] i8_1
+int8[3] i8_3
+uint8[1] u8_1
+uint8[3] u8_3
+int32[1] i32_1
+int32[3] i32_3
+uint32[1] u32_1
+uint32[3] u32_3
+string[1] s_1
+string[3] s_3
+bool[1] b_1
+bool[3] b_3
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestHeader.msg b/message_generation/src/test/resources/test_msgs/msg/TestHeader.msg
new file mode 100644
index 0000000000000000000000000000000000000000..22897c3b85330325819e6e8fee8ab8198ba6fe00
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestHeader.msg
@@ -0,0 +1,8 @@
+Header header
+
+# caller_id of most recent node to send this message
+string caller_id
+# caller_id of the original node to send this message
+string orig_caller_id
+
+byte auto_header # autoset header on response
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestPrimitives.msg b/message_generation/src/test/resources/test_msgs/msg/TestPrimitives.msg
new file mode 100644
index 0000000000000000000000000000000000000000..815dd5b0d18f9b94da8c8952c36cb0738d5d6438
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestPrimitives.msg
@@ -0,0 +1,21 @@
+# Integration test message of all primitive types
+
+# caller_id of most recent node to send this message
+string caller_id
+# caller_id of the original node to send this message
+string orig_caller_id
+
+string str
+byte b
+int16 int16
+int32 int32
+int64 int64
+char c
+uint16 uint16
+uint32 uint32
+uint64 uint64
+float32 float32
+float64 float64
+time t
+duration d
+
diff --git a/message_generation/src/test/resources/test_msgs/msg/TestString.msg b/message_generation/src/test/resources/test_msgs/msg/TestString.msg
new file mode 100644
index 0000000000000000000000000000000000000000..4ab04385050da20743d887191f80a17361d0f4c3
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TestString.msg
@@ -0,0 +1,6 @@
+# Integration test message
+# caller_id of most recent node to send this message
+string caller_id
+# caller_id of the original node to send this message
+string orig_caller_id
+string data
diff --git a/message_generation/src/test/resources/test_msgs/msg/TransitiveImport.msg b/message_generation/src/test/resources/test_msgs/msg/TransitiveImport.msg
new file mode 100644
index 0000000000000000000000000000000000000000..bf33d172859640df342b6ea66d89d5cfed850537
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TransitiveImport.msg
@@ -0,0 +1,2 @@
+# Bug #2133/2139: EmbedTest uses std_msgs, so TransitiveImport needs it as well
+EmbedTest data
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg1.msg b/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg1.msg
new file mode 100644
index 0000000000000000000000000000000000000000..f41ed0cf3ce5662220a8a4ce94d31e9edb521320
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg1.msg
@@ -0,0 +1,2 @@
+TransitiveMsg2 msg2
+
diff --git a/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg2.msg b/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg2.msg
new file mode 100644
index 0000000000000000000000000000000000000000..0084c088e0f5036d60aedb2f93ccebcc78dd22a5
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/TransitiveMsg2.msg
@@ -0,0 +1 @@
+test_msgs/Composite data
diff --git a/message_generation/src/test/resources/test_msgs/msg/Val.msg b/message_generation/src/test/resources/test_msgs/msg/Val.msg
new file mode 100644
index 0000000000000000000000000000000000000000..c11841ad234e1b31fc7dde9c26a5249b7181c02a
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/msg/Val.msg
@@ -0,0 +1 @@
+string val
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/srv/AddTwoInts.srv b/message_generation/src/test/resources/test_msgs/srv/AddTwoInts.srv
new file mode 100644
index 0000000000000000000000000000000000000000..3a68808ee591a3623cbf5e553eed28bac5233be8
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/AddTwoInts.srv
@@ -0,0 +1,4 @@
+int64 a
+int64 b
+---
+int64 sum
diff --git a/message_generation/src/test/resources/test_msgs/srv/ConstantsMultiplex.srv b/message_generation/src/test/resources/test_msgs/srv/ConstantsMultiplex.srv
new file mode 100644
index 0000000000000000000000000000000000000000..b955445414b95f3c56ac4e676e2d20e350b6acb4
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/ConstantsMultiplex.srv
@@ -0,0 +1,26 @@
+byte BYTE_X=0
+byte BYTE_Y=15
+byte BYTE_Z=5
+int32 INT32_X=0
+int32 INT32_Y=-12345678
+int32 INT32_Z=12345678
+uint32 UINT32_X=0
+uint32 UINT32_Y=12345678
+uint32 UINT32_Z=1
+float32 FLOAT32_X=0.0
+float32 FLOAT32_Y=-3.14159
+float32 FLOAT32_Z=12345.78
+byte SELECT_X=1
+byte SELECT_Y=2
+byte SELECT_Z=3
+byte selection
+---
+# test response constants as well
+byte CONFIRM_X=1
+byte CONFIRM_Y=2
+byte CONFIRM_Z=3
+byte select_confirm
+byte ret_byte
+int32 ret_int32
+uint32 ret_uint32
+float32 ret_float32
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/srv/EmptyReqSrv.srv b/message_generation/src/test/resources/test_msgs/srv/EmptyReqSrv.srv
new file mode 100644
index 0000000000000000000000000000000000000000..1f2c1eb6ac0db364f9ad16172625c6002c52d06e
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/EmptyReqSrv.srv
@@ -0,0 +1,2 @@
+---
+int32 fake_secret
diff --git a/message_generation/src/test/resources/test_msgs/srv/EmptyRespSrv.srv b/message_generation/src/test/resources/test_msgs/srv/EmptyRespSrv.srv
new file mode 100644
index 0000000000000000000000000000000000000000..6ef29bc8d831056d98c78522e1393160490ff326
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/EmptyRespSrv.srv
@@ -0,0 +1,2 @@
+int32 fake_secret
+---
diff --git a/message_generation/src/test/resources/test_msgs/srv/EmptySrv.srv b/message_generation/src/test/resources/test_msgs/srv/EmptySrv.srv
new file mode 100644
index 0000000000000000000000000000000000000000..ed97d539c095cf1413af30cc23dea272095b97dd
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/EmptySrv.srv
@@ -0,0 +1 @@
+---
diff --git a/message_generation/src/test/resources/test_msgs/srv/ListReturn.srv b/message_generation/src/test/resources/test_msgs/srv/ListReturn.srv
new file mode 100644
index 0000000000000000000000000000000000000000..311e806433675ad02b272023067b9e9444dc7349
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/ListReturn.srv
@@ -0,0 +1,7 @@
+# test case for having single list return value
+int32 a
+int32 b
+int32 c
+int32 d
+---
+int32[] abcd
diff --git a/message_generation/src/test/resources/test_msgs/srv/MultipleAddTwoInts.srv b/message_generation/src/test/resources/test_msgs/srv/MultipleAddTwoInts.srv
new file mode 100644
index 0000000000000000000000000000000000000000..522a482621cf430cf3ed8318667ab6896ffee9ef
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/MultipleAddTwoInts.srv
@@ -0,0 +1,8 @@
+# test case for having multiple return values
+int32 a
+int32 b
+int32 c
+int32 d
+---
+int32 ab
+int32 cd
\ No newline at end of file
diff --git a/message_generation/src/test/resources/test_msgs/srv/StringString.srv b/message_generation/src/test/resources/test_msgs/srv/StringString.srv
new file mode 100644
index 0000000000000000000000000000000000000000..a9242d416e849ba58184d8f030fef12fd5cc7a0b
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/StringString.srv
@@ -0,0 +1,4 @@
+std_msgs/String str
+Val str2
+---
+std_msgs/String str
diff --git a/message_generation/src/test/resources/test_msgs/srv/TransitiveSrv.srv b/message_generation/src/test/resources/test_msgs/srv/TransitiveSrv.srv
new file mode 100644
index 0000000000000000000000000000000000000000..09a03750a8042d51ac320d4ef6619e96a91db1b5
--- /dev/null
+++ b/message_generation/src/test/resources/test_msgs/srv/TransitiveSrv.srv
@@ -0,0 +1,4 @@
+test_msgs/TransitiveMsg1 msg
+---
+int32 a
+