diff --git a/rosgraph_msgs/msg/Action.msg b/rosgraph_msgs/msg/Action.msg
new file mode 100644
index 00000000..fcb66dfa
--- /dev/null
+++ b/rosgraph_msgs/msg/Action.msg
@@ -0,0 +1,11 @@
+# Describes a single Action endpoint, which may be a Server or Client
+
+# Fully qualified name of the Action
+string name
+
+# An action is actually a composition of the following fundamental ROS entities
+Service send_goal
+Service get_result
+Service cancel_goal
+Topic feedback
+Topic status
diff --git a/rosgraph_msgs/msg/Graph.msg b/rosgraph_msgs/msg/Graph.msg
new file mode 100644
index 00000000..0eee6979
--- /dev/null
+++ b/rosgraph_msgs/msg/Graph.msg
@@ -0,0 +1,2 @@
+# Represents a ROS node graph, which is only a collection of nodes
+Node[] nodes
diff --git a/rosgraph_msgs/msg/InterfaceType.msg b/rosgraph_msgs/msg/InterfaceType.msg
new file mode 100644
index 00000000..ad200483
--- /dev/null
+++ b/rosgraph_msgs/msg/InterfaceType.msg
@@ -0,0 +1,8 @@
+# Represent a type of a ROS Graph Interface
+
+# The plaintext namespaced name of the type - e.g. sensor_msgs/Image
+string name
+
+# The hash uniquely identifies the exact structure of the type,
+# the definition of which may change between package version
+TypeHash hash
diff --git a/rosgraph_msgs/msg/Node.msg b/rosgraph_msgs/msg/Node.msg
new file mode 100644
index 00000000..3a01df77
--- /dev/null
+++ b/rosgraph_msgs/msg/Node.msg
@@ -0,0 +1,24 @@
+# Represents the observable runtime state of a ROS Node
+# Therefore, does not perfectly align with the abstract specification which created it.
+
+# Fully qualified node name (FQN)
+string name
+
+# Parameter specifications for the node
+rcl_interfaces/ParameterDescriptor[] parameters
+
+# Current values of the node's parameters
+# NOTE:
+# parameter_values[] must be empty, or the same size as parameters[]
+# When set, parameter_values[] match 1:1 with the same index in parameters[]
+rcl_interfaces/ParameterValue[] parameter_values
+
+# Communications endpoints - Topics, Services, and Actions
+Topic[] publishers
+Topic[] subscriptions
+
+Service[] service_clients
+Service[] service_servers
+
+Action[] action_clients
+Action[] action_servers
diff --git a/rosgraph_msgs/msg/QoSProfile.msg b/rosgraph_msgs/msg/QoSProfile.msg
new file mode 100644
index 00000000..56c9d16b
--- /dev/null
+++ b/rosgraph_msgs/msg/QoSProfile.msg
@@ -0,0 +1,48 @@
+# Message-based representation of ROS 2 Quality of Service settings
+# Default values are kept in sync with RMW by integration test
+# Note that SYSTEM_DEFAULT and BEST_AVAILABLE values cannot be an observed value,
+# because they resolve concretely at runtime.
+# They are included here for completeness to match the data structures in RMW
+
+# Depth of the message queue (only meaningful when history==KEEP_LAST)
+uint32 depth
+
+# Deadline between messages (0 for no deadline)
+builtin_interfaces/Duration deadline
+
+# Lifespan of each message (0 for infinite)
+builtin_interfaces/Duration lifespan
+
+# History policy
+uint8 HISTORY_SYSTEM_DEFAULT=0
+uint8 HISTORY_KEEP_LAST=1
+uint8 HISTORY_KEEP_ALL=2
+uint8 HISTORY_UNKNOWN=3
+uint8 history
+
+# Reliability policy
+uint8 RELIABILITY_SYSTEM_DEFAULT=0
+uint8 RELIABILITY_RELIABLE=1
+uint8 RELIABILITY_BEST_EFFORT=2
+uint8 RELIABILITY_UNKNOWN=3
+uint8 RELIABILITY_BEST_AVAILABLE=4
+uint8 reliability
+
+# Durability policy
+uint8 DURABILITY_SYSTEM_DEFAULT=0
+uint8 DURABILITY_TRANSIENT_LOCAL=1
+uint8 DURABILITY_VOLATILE=2
+uint8 DURABILITY_UNKNOWN=3
+uint8 DURABILITY_BEST_AVAILABLE=4
+uint8 durability
+
+# Liveliness policy
+uint8 LIVELINESS_SYSTEM_DEFAULT=0
+uint8 LIVELINESS_AUTOMATIC=1
+uint8 LIVELINESS_MANUAL_BY_TOPIC=3
+uint8 LIVELINESS_UNKNOWN=4
+uint8 LIVELINESS_BEST_AVAILABLE=5
+uint8 liveliness
+
+# Lease duration for liveliness (0 for infinite)
+builtin_interfaces/Duration liveliness_lease_duration
diff --git a/rosgraph_msgs/msg/Service.msg b/rosgraph_msgs/msg/Service.msg
new file mode 100644
index 00000000..d00e75d0
--- /dev/null
+++ b/rosgraph_msgs/msg/Service.msg
@@ -0,0 +1,12 @@
+# Describes a single Service endpoint, which may be a Server or Client
+
+# Fully qualified name of the Service
+string name
+
+# Type and actual QoS of the request publisher (Client) or subscription (Server)
+InterfaceType request_type
+QoSProfile request_qos
+
+# Type and actual QoS of the request subscription (Client) or publisher (Server)
+InterfaceType response_type
+QoSProfile response_qos
diff --git a/rosgraph_msgs/msg/Topic.msg b/rosgraph_msgs/msg/Topic.msg
new file mode 100644
index 00000000..6932f5d8
--- /dev/null
+++ b/rosgraph_msgs/msg/Topic.msg
@@ -0,0 +1,10 @@
+# Describes a single topic endpoint, which may be a Publisher or Subscription
+
+# Fully qualified name of the topic
+string name
+
+# Type of the topic
+InterfaceType type
+
+# Observed QoS of the endpoint
+QoSProfile qos
diff --git a/rosgraph_msgs/msg/TypeHash.msg b/rosgraph_msgs/msg/TypeHash.msg
new file mode 100644
index 00000000..f039741f
--- /dev/null
+++ b/rosgraph_msgs/msg/TypeHash.msg
@@ -0,0 +1,4 @@
+# RIHS spec version
+uint8 version 1
+# ROSIDL_TYPE_HASH_SIZE == 32
+uint8[32] value
diff --git a/rosgraph_msgs/package.xml b/rosgraph_msgs/package.xml
index 18b8605f..b3d16af1 100644
--- a/rosgraph_msgs/package.xml
+++ b/rosgraph_msgs/package.xml
@@ -21,8 +21,10 @@
rosidl_default_generators
builtin_interfaces
+ rcl_interfaces
builtin_interfaces
+ rcl_interfaces
rosidl_default_runtime
ament_lint_common