diff --git a/system/system_monitor/CHANGELOG.rst b/system/system_monitor/CHANGELOG.rst
new file mode 100644
index 0000000000000..ce6769d12e186
--- /dev/null
+++ b/system/system_monitor/CHANGELOG.rst
@@ -0,0 +1,8 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package system_monitor
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+1.1x.0 (2020-xx-xx)
+-------------------
+* Initial commit
+* Contributors: Fumihito Ito
diff --git a/system/system_monitor/CMakeLists.txt b/system/system_monitor/CMakeLists.txt
new file mode 100644
index 0000000000000..03ca85213b40b
--- /dev/null
+++ b/system/system_monitor/CMakeLists.txt
@@ -0,0 +1,315 @@
+cmake_minimum_required(VERSION 3.5)
+project(system_monitor)
+
+## Compile as C++14, supported in ROS Melodic and newer
+if(NOT CMAKE_CXX_STANDARD)
+ set(CMAKE_CXX_STANDARD 14)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+ set(CMAKE_CXX_EXTENSIONS OFF)
+endif()
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ add_compile_options(-Wall -Wextra -Wpedantic -Werror)
+endif()
+
+find_package(ament_cmake_auto REQUIRED)
+ament_auto_find_build_dependencies()
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+find_package(NVML)
+find_package(fmt REQUIRED)
+set(LIBRARIES fmt)
+
+###########
+## Build ##
+###########
+
+## Specify additional locations of header files
+
+find_path(LIBNL3_INCLUDE_DIRS
+ NAMES netlink/netlink.h
+ PATH_SUFFIXES libnl3
+)
+
+if(NVML_FOUND)
+ include_directories(
+ include
+ ${LIBNL3_INCLUDE_DIRS}
+ ${NVML_INCLUDE_DIRS}
+ )
+else()
+ include_directories(
+ include
+ ${LIBNL3_INCLUDE_DIRS}
+ )
+endif()
+
+## Declare a C++ executable
+
+if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ set(CMAKE_CPU_PLATFORM "intel")
+ add_definitions(-D_CPU_INTEL_)
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
+ if(CMAKE_HOST_SYSTEM_VERSION MATCHES ".*raspi.*")
+ set(CMAKE_CPU_PLATFORM "raspi")
+ add_definitions(-D_CPU_RASPI_)
+ elseif(CMAKE_HOST_SYSTEM_VERSION MATCHES ".*tegra.*")
+ set(CMAKE_CPU_PLATFORM "tegra")
+ add_definitions(-D_CPU_TEGRA_)
+ else()
+ set(CMAKE_CPU_PLATFORM "arm")
+ add_definitions(-D_CPU_ARM_)
+ endif()
+else()
+ set(CMAKE_CPU_PLATFORM "unknown")
+endif()
+
+if(NVML_FOUND)
+ set(CMAKE_GPU_PLATFORM "nvml")
+ add_definitions(-D_GPU_NVML_)
+ set(GPU_LIBRARY ${NVML_LIBRARIES})
+else()
+ if(CMAKE_CPU_PLATFORM STREQUAL "tegra")
+ set(CMAKE_GPU_PLATFORM "tegra")
+ add_definitions(-D_GPU_TEGRA_)
+ else()
+ set(CMAKE_GPU_PLATFORM "unknown")
+ endif()
+endif()
+
+message(STATUS "HOST_SYSTEM_VERSION: " ${CMAKE_HOST_SYSTEM_VERSION})
+message(STATUS "SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR})
+message(STATUS "CPU PLATFORM: " ${CMAKE_CPU_PLATFORM})
+message(STATUS "GPU PLATFORM: " ${CMAKE_GPU_PLATFORM})
+
+set(CPU_MONITOR_SOURCE
+ src/cpu_monitor/cpu_monitor_base.cpp
+ src/cpu_monitor/${CMAKE_CPU_PLATFORM}_cpu_monitor.cpp
+)
+
+ament_auto_add_library(cpu_monitor_lib SHARED
+ ${CPU_MONITOR_SOURCE}
+)
+
+ament_auto_add_library(hdd_monitor_lib SHARED
+ src/hdd_monitor/hdd_monitor.cpp
+)
+
+ament_auto_add_library(mem_monitor_lib SHARED
+ src/mem_monitor/mem_monitor.cpp
+)
+
+ament_auto_add_library(net_monitor_lib SHARED
+ src/net_monitor/net_monitor.cpp
+ src/net_monitor/nl80211.cpp
+)
+
+ament_auto_add_library(ntp_monitor_lib SHARED
+ src/ntp_monitor/ntp_monitor.cpp
+)
+
+ament_auto_add_library(process_monitor_lib SHARED
+ src/process_monitor/process_monitor.cpp
+)
+
+set(GPU_MONITOR_SOURCE
+ src/gpu_monitor/gpu_monitor_base.cpp
+ src/gpu_monitor/${CMAKE_GPU_PLATFORM}_gpu_monitor.cpp
+)
+ament_auto_add_library(gpu_monitor_lib SHARED
+ ${GPU_MONITOR_SOURCE}
+)
+
+ament_auto_add_executable(msr_reader
+ reader/msr_reader/msr_reader.cpp
+)
+
+ament_auto_add_executable(hdd_reader
+ reader/hdd_reader/hdd_reader.cpp
+)
+
+find_library(NL3 nl-3 REQUIRED)
+find_library(NLGENL3 nl-genl-3 REQUIRED)
+list(APPEND NL_LIBS ${NL3} ${NLGENL3})
+
+find_package(Boost REQUIRED COMPONENTS
+ serialization
+ thread
+ filesystem
+ regex
+)
+
+## Specify libraries to link a library or executable target against
+target_link_libraries(cpu_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES})
+target_link_libraries(hdd_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES})
+target_link_libraries(mem_monitor_lib ${LIBRARIES})
+target_link_libraries(net_monitor_lib ${NL_LIBS} ${LIBRARIES})
+target_link_libraries(ntp_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES})
+target_link_libraries(process_monitor_lib ${LIBRARIES})
+target_link_libraries(gpu_monitor_lib ${GPU_LIBRARY} ${Boost_LIBRARIES} ${LIBRARIES})
+target_link_libraries(msr_reader ${Boost_LIBRARIES} ${LIBRARIES})
+target_link_libraries(hdd_reader ${Boost_LIBRARIES} ${LIBRARIES})
+
+rclcpp_components_register_node(cpu_monitor_lib
+ PLUGIN "CPUMonitor"
+ EXECUTABLE cpu_monitor
+)
+
+rclcpp_components_register_node(hdd_monitor_lib
+ PLUGIN "HDDMonitor"
+ EXECUTABLE hdd_monitor
+)
+
+rclcpp_components_register_node(mem_monitor_lib
+ PLUGIN "MemMonitor"
+ EXECUTABLE mem_monitor
+)
+
+rclcpp_components_register_node(net_monitor_lib
+ PLUGIN "NetMonitor"
+ EXECUTABLE net_monitor
+)
+
+rclcpp_components_register_node(ntp_monitor_lib
+ PLUGIN "NTPMonitor"
+ EXECUTABLE ntp_monitor
+)
+
+rclcpp_components_register_node(process_monitor_lib
+ PLUGIN "ProcessMonitor"
+ EXECUTABLE process_monitor
+)
+
+rclcpp_components_register_node(gpu_monitor_lib
+ PLUGIN "GPUMonitor"
+ EXECUTABLE gpu_monitor
+)
+
+# TODO(yunus.caliskan): Port the tests to ROS2, robustify the tests.
+if(BUILD_TESTING)
+ find_package(ament_lint_auto REQUIRED)
+ ament_lint_auto_find_test_dependencies()
+
+ # ament_add_gtest(test_cpu_monitor
+ # test/src/cpu_monitor/test_${CMAKE_CPU_PLATFORM}_cpu_monitor.cpp
+ # ${CPU_MONITOR_SOURCE}
+ # )
+
+ # ament_target_dependencies(test_cpu_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_cpu_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_cpu_monitor ${Boost_LIBRARIES} ${LIBRARIES})
+
+ # ament_add_gtest(test_hdd_monitor
+ # test/src/hdd_monitor/test_hdd_monitor.cpp
+ # src/hdd_monitor/hdd_monitor.cpp
+ # )
+
+ # ament_target_dependencies(test_hdd_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_hdd_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_hdd_monitor ${Boost_LIBRARIES} ${LIBRARIES}
+ # )
+
+ # ament_add_gtest(test_mem_monitor
+ # test/src/mem_monitor/test_mem_monitor.cpp
+ # src/mem_monitor/mem_monitor.cpp
+ # )
+
+ # ament_target_dependencies(test_mem_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_mem_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_mem_monitor ${Boost_LIBRARIES} ${LIBRARIES})
+
+ # ament_add_gtest(test_net_monitor
+ # test/src/net_monitor/test_net_monitor.cpp
+ # src/net_monitor/net_monitor.cpp
+ # src/net_monitor/nl80211.cpp
+ # )
+
+ # ament_target_dependencies(test_net_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_net_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_net_monitor ${Boost_LIBRARIES} ${NL_LIBS} ${LIBRARIES})
+
+ # ament_add_gtest(test_ntp_monitor
+ # test/src/ntp_monitor/test_ntp_monitor.cpp
+ # src/ntp_monitor/ntp_monitor.cpp
+ # )
+
+ # ament_target_dependencies(test_ntp_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_ntp_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_ntp_monitor ${Boost_LIBRARIES} ${LIBRARIES})
+
+ # ament_add_gtest(test_process_monitor
+ # test/src/process_monitor/test_process_monitor.cpp
+ # src/process_monitor/process_monitor.cpp
+ # )
+
+ # ament_target_dependencies(test_process_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_process_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_process_monitor ${Boost_LIBRARIES} ${LIBRARIES})
+
+ # ament_add_gtest(test_gpu_monitor
+ # test/src/gpu_monitor/test_${CMAKE_GPU_PLATFORM}_gpu_monitor.cpp
+ # ${GPU_MONITOR_SOURCE}
+ # )
+
+ # ament_target_dependencies(test_gpu_monitor
+ # "rclcpp"
+ # "diagnostic_msgs"
+ # )
+
+ # target_include_directories(test_gpu_monitor
+ # PRIVATE "include"
+ # )
+
+ # target_link_libraries(test_gpu_monitor ${GPU_LIBRARY} ${LIBRARIES})
+
+endif()
+
+#############
+## Install ##
+#############
+
+ament_auto_package(INSTALL_TO_SHARE
+ launch
+ config
+)
diff --git a/system/system_monitor/README.md b/system/system_monitor/README.md
new file mode 100644
index 0000000000000..8b4dd9873f7ba
--- /dev/null
+++ b/system/system_monitor/README.md
@@ -0,0 +1,179 @@
+# System Monitor for Autoware
+
+**Further improvement of system monitor functionality for Autoware.**
+
+## Description
+
+This package provides the following nodes for monitoring system:
+
+- CPU Monitor
+- HDD Monitor
+- Memory Monitor
+- Network Monitor
+- NTP Monitor
+- Process Monitor
+- GPU Monitor
+
+### Supported architecture
+
+- x86_64
+- arm64v8/aarch64
+
+### Operation confirmed platform
+
+- PC system intel core i7
+- NVIDIA Jetson AGX Xavier
+- Raspberry Pi4 Model B
+
+## How to use
+
+Use colcon build and launch in the same way as other packages.
+
+```sh
+colcon build
+source install/setup.bash
+ros2 launch system_monitor system_monitor.launch.xml
+```
+
+CPU and GPU monitoring method differs depending on platform.
+CMake automatically chooses source to be built according to build environment.
+If you build this package on intel platform, CPU monitor and GPU monitor which run on intel platform are built.
+
+## ROS topics published by system monitor
+
+Every topic is published in 1 minute interval.
+
+- [CPU Monitor](docs/topics_cpu_monitor.md)
+- [HDD Monitor](docs/topics_hdd_monitor.md)
+- [Mem Monitor](docs/topics_mem_monitor.md)
+- [Net Monitor](docs/topics_net_monitor.md)
+- [NTP Monitor](docs/topics_ntp_monitor.md)
+- [Process Monitor](docs/topics_process_monitor.md)
+- [GPU Monitor](docs/topics_gpu_monitor.md)
+
+[Usage] ✓:Supported, -:Not supported
+
+| Node | Message | Intel | arm64(tegra) | arm64(raspi) | Notes |
+| --------------- | ---------------------- | :---: | :----------: | :----------: | ------------------------------------------------------------- |
+| CPU Monitor | CPU Temperature | ✓ | ✓ | ✓ | |
+| | CPU Usage | ✓ | ✓ | ✓ | |
+| | CPU Load Average | ✓ | ✓ | ✓ | |
+| | CPU Thermal Throttling | ✓ | - | ✓ | |
+| | CPU Frequency | ✓ | ✓ | ✓ | Notification of frequency only, normally error not generated. |
+| HDD Monitor | HDD Temperature | ✓ | ✓ | ✓ | |
+| | HDD Usage | ✓ | ✓ | ✓ | |
+| Memory Monitor | Memory Usage | ✓ | ✓ | ✓ | |
+| Net Monitor | Network Usage | ✓ | ✓ | ✓ | |
+| NTP Monitor | NTP Offset | ✓ | ✓ | ✓ | |
+| Process Monitor | Tasks Summary | ✓ | ✓ | ✓ | |
+| | High-load Proc[0-9] | ✓ | ✓ | ✓ | |
+| | High-mem Proc[0-9] | ✓ | ✓ | ✓ | |
+| GPU Monitor | GPU Temperature | ✓ | ✓ | - | |
+| | GPU Usage | ✓ | ✓ | - | |
+| | GPU Memory Usage | ✓ | - | - | |
+| | GPU Thermal Throttling | ✓ | - | - | |
+| | GPU Frequency | - | ✓ | - | |
+
+## ROS parameters
+
+See [ROS parameters](docs/ros_parameters.md).
+
+## Notes
+
+### CPU monitor for intel platform
+
+Thermal throttling event can be monitored by reading contents of MSR(Model Specific Register), and accessing MSR is only allowed for root by default, so this package provides the following approach to minimize security risks as much as possible:
+
+- Provide a small program named 'msr_reader' which accesses MSR and sends thermal throttling status to CPU monitor by using socket programming.
+- Run 'msr_reader' as a specific user instead of root.
+- CPU monitor is able to know the status as an unprivileged user since thermal throttling status is sent by socket communication.
+
+### Instructions before starting
+
+1. Create a user to run 'msr_reader'.
+
+ ```sh
+ sudo adduser
+ ```
+
+2. Load kernel module 'msr' into your target system.
+ The path '/dev/cpu/CPUNUM/msr' appears.
+
+ ```sh
+ sudo modprobe msr
+ ```
+
+3. Allow user to access MSR with read-only privilege using the Access Control List (ACL).
+
+ ```sh
+ sudo setfacl -m u::r /dev/cpu/*/msr
+ ```
+
+4. Assign capability to 'msr_reader' since msr kernel module requires rawio capability.
+
+ ```sh
+ sudo setcap cap_sys_rawio=ep install/system_monitor/lib/system_monitor/msr_reader
+ ```
+
+5. Run 'msr_reader' as the user you created, and run system_monitor as a generic user.
+
+ ```sh
+ su
+ install/system_monitor/lib/system_monitor/msr_reader
+ ```
+
+### See also
+
+[msr_reader](docs/msr_reader.md)
+
+## HDD Monitor
+
+Generally, S.M.A.R.T. information is used to monitor HDD temperature, and normally accessing disk device node is allowed for root user or disk group.
+As with the CPU monitor, this package provides an approach to minimize security risks as much as possible:
+
+- Provide a small program named 'hdd_reader' which accesses S.M.A.R.T. information and sends HDD temperature to HDD monitor by using socket programming.
+- Run 'hdd_reader' as a specific user.
+- HDD monitor is able to know HDD temperature as an unprivileged user since HDD temperature is sent by socket communication.
+
+### Instructions before starting
+
+1. Create a user to run 'hdd_reader'.
+
+ ```sh
+ sudo adduser
+ ```
+
+2. Add user to the disk group.
+
+ ```sh
+ sudo usermod -a -G disk
+ ```
+
+3. Assign capabilities to 'hdd_reader' since SCSI kernel module requires rawio capability to send ATA PASS-THROUGH (12) command and NVMe kernel module requires admin capability to send Admin Command.
+
+ ```sh
+ sudo setcap 'cap_sys_rawio=ep cap_sys_admin=ep' install/system_monitor/lib/system_monitor/hdd_reader
+ ```
+
+4. Run 'hdd_reader' as the user you created, and run system_monitor as a generic user.
+
+ ```sh
+ su
+ install/system_monitor/lib/system_monitor/hdd_reader
+ ```
+
+### See also
+
+[hdd_reader](docs/hdd_reader.md)
+
+## GPU Monitor for intel platform
+
+Currently GPU monitor for intel platform only supports NVIDIA GPU whose information can be accessed by NVML API.
+
+Also you need to install CUDA libraries.
+For installation instructions for CUDA 10.0, see [NVIDIA CUDA Installation Guide for Linux](https://docs.nvidia.com/cuda/archive/10.0/cuda-installation-guide-linux/index.html).
+
+## UML diagrams
+
+See [Class diagrams](docs/class_diagrams.md).
+See [Sequence diagrams](docs/seq_diagrams.md).
diff --git a/system/system_monitor/cmake/FindNVML.cmake b/system/system_monitor/cmake/FindNVML.cmake
new file mode 100644
index 0000000000000..0a79009ab98d2
--- /dev/null
+++ b/system/system_monitor/cmake/FindNVML.cmake
@@ -0,0 +1,34 @@
+# Copyright 2020 Tier IV, 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.
+
+# - Find NVML
+# Find the native NVML(NVIDIA Management Library) includes and libraries
+#
+# NVML_INCLUDE_DIRS - where to find nvml.h.
+# NVML_LIBRARIES - the library needed to use NVML.
+# NVML_FOUND - True if NVML found.
+
+if(NOT NVML_INCLUDE_DIRS)
+ find_path(NVML_INCLUDE_DIRS nvml.h PATHS /usr/local/cuda/include)
+endif()
+
+if(NOT NVML_LIBRARIES)
+ find_library(NVML_LIBRARIES NAMES nvidia-ml)
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NVML DEFAULT_MSG NVML_LIBRARIES NVML_INCLUDE_DIRS)
+
+message(STATUS "NVML include dir: ${NVML_INCLUDE_DIRS}")
+message(STATUS "NVML library : ${NVML_LIBRARIES}")
diff --git a/system/system_monitor/config/cpu_monitor.param.yaml b/system/system_monitor/config/cpu_monitor.param.yaml
new file mode 100644
index 0000000000000..e9f91cb1708e4
--- /dev/null
+++ b/system/system_monitor/config/cpu_monitor.param.yaml
@@ -0,0 +1,8 @@
+/**:
+ ros__parameters:
+ temp_warn: 90.0
+ temp_error: 95.0
+ usage_warn: 0.90
+ usage_error: 1.00
+ usage_avg: true
+ msr_reader_port: 7634
diff --git a/system/system_monitor/config/gpu_monitor.param.yaml b/system/system_monitor/config/gpu_monitor.param.yaml
new file mode 100644
index 0000000000000..d96b9f24640b2
--- /dev/null
+++ b/system/system_monitor/config/gpu_monitor.param.yaml
@@ -0,0 +1,8 @@
+/**:
+ ros__parameters:
+ temp_warn: 90.0
+ temp_error: 95.0
+ gpu_usage_warn: 0.90
+ gpu_usage_error: 1.00
+ memory_usage_warn: 0.95
+ memory_usage_error: 0.99
diff --git a/system/system_monitor/config/hdd_monitor.param.yaml b/system/system_monitor/config/hdd_monitor.param.yaml
new file mode 100644
index 0000000000000..bf687ae848059
--- /dev/null
+++ b/system/system_monitor/config/hdd_monitor.param.yaml
@@ -0,0 +1,11 @@
+/**:
+ ros__parameters:
+ hdd_reader_port: 7635
+ num_disks: 1
+ disks: # Until multi type lists are allowed, name N the disks as disk0...disk{N-1}
+ disk0:
+ name: /dev/sda
+ temp_warn: 55.0
+ temp_error: 70.0
+ usage_warn: 0.95
+ usage_error: 0.99
diff --git a/system/system_monitor/config/mem_monitor.param.yaml b/system/system_monitor/config/mem_monitor.param.yaml
new file mode 100644
index 0000000000000..93688d608a9ef
--- /dev/null
+++ b/system/system_monitor/config/mem_monitor.param.yaml
@@ -0,0 +1,4 @@
+/**:
+ ros__parameters:
+ usage_warn: 0.95
+ usage_error: 0.99
diff --git a/system/system_monitor/config/net_monitor.param.yaml b/system/system_monitor/config/net_monitor.param.yaml
new file mode 100644
index 0000000000000..d0707ddba399f
--- /dev/null
+++ b/system/system_monitor/config/net_monitor.param.yaml
@@ -0,0 +1,4 @@
+/**:
+ ros__parameters:
+ devices: ["*"]
+ usage_warn: 0.95
diff --git a/system/system_monitor/config/ntp_monitor.param.yaml b/system/system_monitor/config/ntp_monitor.param.yaml
new file mode 100644
index 0000000000000..db54f70d1ce59
--- /dev/null
+++ b/system/system_monitor/config/ntp_monitor.param.yaml
@@ -0,0 +1,5 @@
+/**:
+ ros__parameters:
+ server: ntp.nict.jp
+ offset_warn: 0.1
+ offset_error: 5.0
diff --git a/system/system_monitor/config/process_monitor.param.yaml b/system/system_monitor/config/process_monitor.param.yaml
new file mode 100644
index 0000000000000..3d6d82fae5ce2
--- /dev/null
+++ b/system/system_monitor/config/process_monitor.param.yaml
@@ -0,0 +1,3 @@
+/**:
+ ros__parameters:
+ num_of_procs: 5
diff --git a/system/system_monitor/docs/class_diagrams.md b/system/system_monitor/docs/class_diagrams.md
new file mode 100644
index 0000000000000..662e6a26195a7
--- /dev/null
+++ b/system/system_monitor/docs/class_diagrams.md
@@ -0,0 +1,29 @@
+# Class diagrams
+
+## CPU Monitor
+
+![CPU Monitor](images/class_cpu_monitor.png)
+
+## HDD Monitor
+
+![HDD Monitor](images/class_hdd_monitor.png)
+
+## Memory Monitor
+
+![Memory Monitor](images/class_mem_monitor.png)
+
+## Net Monitor
+
+![Net Monitor](images/class_net_monitor.png)
+
+## NTP Monitor
+
+![NTP Monitor](images/class_ntp_monitor.png)
+
+## Process Monitor
+
+![Process Monitor](images/class_process_monitor.png)
+
+## GPU Monitor
+
+![GPU Monitor](images/class_gpu_monitor.png)
diff --git a/system/system_monitor/docs/hdd_reader.md b/system/system_monitor/docs/hdd_reader.md
new file mode 100644
index 0000000000000..f1092286df0e2
--- /dev/null
+++ b/system/system_monitor/docs/hdd_reader.md
@@ -0,0 +1,58 @@
+# hdd_reader
+
+## Name
+
+hdd_reader - Read S.M.A.R.T. information for monitoring HDD temperature
+
+## Synopsis
+
+hdd_reader [OPTION]
+
+## Description
+
+Read S.M.A.R.T. information for monitoring HDD temperature.
+This runs as a daemon process and listens to a TCP/IP port (7635 by default).
+
+**Options:**
+_-h, --help_
+ Display help
+_-p, --port #_
+ Port number to listen to
+
+**Exit status:**
+Returns 0 if OK; non-zero otherwise.
+
+## Notes
+
+The 'hdd_reader' accesses minimal data enough to get Model number, Serial number, and HDD temperature.
+This is an approach to limit its functionality, however, the functionality can be expanded for further improvements and considerations in the future.
+
+### [ATA]
+
+| Purpose | Name | Length |
+| --------------------------- | -------------------- | -------------------- |
+| Model number, Serial number | IDENTIFY DEVICE data | 256 words(512 bytes) |
+| HDD temperature | SMART READ DATA | 256 words(512 bytes) |
+
+For details please see the documents below.
+
+- [ATA Command Set - 4 (ACS-4)](https://www.t13.org/system/files/Project%20Drafts/2017/di529r20-ATA/ATAPI%20Command%20Set%20-%204_2.pdf)
+- [ATA/ATAPI Command Set - 3 (ACS-3)](https://www.t13.org/system/files/Standards/2013/d2161r5-ATA/ATAPI%20Command%20Set%20-%203.pdf)
+- [SMART Attribute Overview](https://www.t13.org/system/files/Documents/2005/e05171r0-SMART%20Attributes%20Overview_1.pdf)
+- [SMART Attribute Annex](https://www.t13.org/system/files/Documents/2005/e05148r0-ACS-SMART%20Attributes%20Annex_1.pdf)
+
+### [NVMe]
+
+| Purpose | Name | Length |
+| --------------------------- | ---------------------------------- | ---------------- |
+| Model number, Serial number | Identify Controller data structure | 4096 bytes |
+| HDD temperature | SMART / Health Information | 1 Dword(4 bytes) |
+
+For details please see the documents below.
+
+- [NVM Express 1.2b](https://www.nvmexpress.org/wp-content/uploads/NVM_Express_1_2b_Gold_20160603.pdf)
+
+## Operation confirmed drives
+
+- SAMSUNG MZVLB1T0HALR (SSD)
+- Western Digital My Passport (Portable HDD)
diff --git a/system/system_monitor/docs/images/class_cpu_monitor.png b/system/system_monitor/docs/images/class_cpu_monitor.png
new file mode 100644
index 0000000000000..3fb87810b0209
Binary files /dev/null and b/system/system_monitor/docs/images/class_cpu_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_gpu_monitor.png b/system/system_monitor/docs/images/class_gpu_monitor.png
new file mode 100644
index 0000000000000..857f3bc8b0ff1
Binary files /dev/null and b/system/system_monitor/docs/images/class_gpu_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_hdd_monitor.png b/system/system_monitor/docs/images/class_hdd_monitor.png
new file mode 100644
index 0000000000000..3ae7f9bf0dccf
Binary files /dev/null and b/system/system_monitor/docs/images/class_hdd_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_mem_monitor.png b/system/system_monitor/docs/images/class_mem_monitor.png
new file mode 100644
index 0000000000000..a0261a4a9b0b2
Binary files /dev/null and b/system/system_monitor/docs/images/class_mem_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_net_monitor.png b/system/system_monitor/docs/images/class_net_monitor.png
new file mode 100644
index 0000000000000..126547faeef46
Binary files /dev/null and b/system/system_monitor/docs/images/class_net_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_ntp_monitor.png b/system/system_monitor/docs/images/class_ntp_monitor.png
new file mode 100644
index 0000000000000..71660ea938af4
Binary files /dev/null and b/system/system_monitor/docs/images/class_ntp_monitor.png differ
diff --git a/system/system_monitor/docs/images/class_process_monitor.png b/system/system_monitor/docs/images/class_process_monitor.png
new file mode 100644
index 0000000000000..8cecef0c3e161
Binary files /dev/null and b/system/system_monitor/docs/images/class_process_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_cpu_monitor.png b/system/system_monitor/docs/images/seq_cpu_monitor.png
new file mode 100644
index 0000000000000..23499d053bc36
Binary files /dev/null and b/system/system_monitor/docs/images/seq_cpu_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_gpu_monitor.png b/system/system_monitor/docs/images/seq_gpu_monitor.png
new file mode 100644
index 0000000000000..f0b145a40cb99
Binary files /dev/null and b/system/system_monitor/docs/images/seq_gpu_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_hdd_monitor.png b/system/system_monitor/docs/images/seq_hdd_monitor.png
new file mode 100644
index 0000000000000..73538f8cf2370
Binary files /dev/null and b/system/system_monitor/docs/images/seq_hdd_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_mem_monitor.png b/system/system_monitor/docs/images/seq_mem_monitor.png
new file mode 100644
index 0000000000000..969ff8cc9285b
Binary files /dev/null and b/system/system_monitor/docs/images/seq_mem_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_net_monitor.png b/system/system_monitor/docs/images/seq_net_monitor.png
new file mode 100644
index 0000000000000..2d2b26fe87499
Binary files /dev/null and b/system/system_monitor/docs/images/seq_net_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_ntp_monitor.png b/system/system_monitor/docs/images/seq_ntp_monitor.png
new file mode 100644
index 0000000000000..53e97d2ced661
Binary files /dev/null and b/system/system_monitor/docs/images/seq_ntp_monitor.png differ
diff --git a/system/system_monitor/docs/images/seq_process_monitor.png b/system/system_monitor/docs/images/seq_process_monitor.png
new file mode 100644
index 0000000000000..b759fcc5cca4b
Binary files /dev/null and b/system/system_monitor/docs/images/seq_process_monitor.png differ
diff --git a/system/system_monitor/docs/msr_reader.md b/system/system_monitor/docs/msr_reader.md
new file mode 100644
index 0000000000000..c8594be011625
--- /dev/null
+++ b/system/system_monitor/docs/msr_reader.md
@@ -0,0 +1,40 @@
+# msr_reader
+
+## Name
+
+msr_reader - Read MSR register for monitoring thermal throttling event
+
+## Synopsis
+
+msr_reader [OPTION]
+
+## Description
+
+Read MSR register for monitoring thermal throttling event.
+This runs as a daemon process and listens to a TCP/IP port (7634 by default).
+
+**Options:**
+_-h, --help_
+ Display help
+_-p, --port #_
+ Port number to listen to
+
+**Exit status:**
+Returns 0 if OK; non-zero otherwise.
+
+## Notes
+
+The 'msr_reader' accesses minimal data enough to get thermal throttling event.
+This is an approach to limit its functionality, however, the functionality can be expanded for further improvements and considerations in the future.
+
+| Register Address | Name | Length |
+| ---------------- | ------------------------- | ------ |
+| 1B1H | IA32_PACKAGE_THERM_STATUS | 64bit |
+
+For details please see the documents below.
+
+- [Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual](https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf)
+
+## Operation confirmed platform
+
+- PC system intel core i7
diff --git a/system/system_monitor/docs/ros_parameters.md b/system/system_monitor/docs/ros_parameters.md
new file mode 100644
index 0000000000000..e42f843c78992
--- /dev/null
+++ b/system/system_monitor/docs/ros_parameters.md
@@ -0,0 +1,84 @@
+# ROS parameters
+
+## CPU Monitor
+
+cpu_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :-------------- | :---: | :-----: | :-----: | :---------------------------------------------------------------------------- |
+| temp_warn | float | DegC | 90.0 | Generates warning when CPU temperature reaches a specified value or higher. |
+| temp_error | float | DegC | 95.0 | Generates error when CPU temperature reaches a specified value or higher. |
+| usage_warn | float | %(1e-2) | 0.90 | Generates warning when CPU usage reaches a specified value or higher. |
+| usage_error | float | %(1e-2) | 1.00 | Generates error when CPU usage reaches a specified value or higher. |
+| load1_warn | float | %(1e-2) | 0.90 | Generates warning when load average 1min reaches a specified value or higher. |
+| load5_warn | float | %(1e-2) | 0.80 | Generates warning when load average 5min reaches a specified value or higher. |
+| msr_reader_port | int | n/a | 7634 | Port number to connect to msr_reader. |
+
+## HDD Monitor
+
+hdd_monitor:
+
+ disks:
+
+| Name | Type | Unit | Default | Notes |
+| :--------- | :----: | :--: | :-----: | :-------------------------------------------------------------------------- |
+| name | string | n/a | none | The disk name to monitor temperature. (e.g. /dev/sda) |
+| temp_error | float | DegC | 55.0 | Generates warning when HDD temperature reaches a specified value or higher. |
+| temp_error | float | DegC | 70.0 | Generates error when HDD temperature reaches a specified value or higher. |
+
+hdd_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :-------------- | :---: | :-----: | :-----: | :--------------------------------------------------------------------- |
+| hdd_reader_port | int | n/a | 7635 | Port number to connect to hdd_reader. |
+| usage_warn | float | %(1e-2) | 0.95 | Generates warning when disk usage reaches a specified value or higher. |
+| usage_error | float | %(1e-2) | 0.99 | Generates error when disk usage reaches a specified value or higher. |
+
+## Memory Monitor
+
+mem_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :---------- | :---: | :-----: | :-----: | :-------------------------------------------------------------------------------- |
+| usage_warn | float | %(1e-2) | 0.95 | Generates warning when physical memory usage reaches a specified value or higher. |
+| usage_error | float | %(1e-2) | 0.99 | Generates error when physical memory usage reaches a specified value or higher. |
+
+## Net Monitor
+
+net_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :--------- | :----------: | :-----: | :-----: | :----------------------------------------------------------------------------------- |
+| devices | list[string] | n/a | none | The name of network interface to monitor. (e.g. eth0, \* for all network interfaces) |
+| usage_warn | float | %(1e-2) | 0.95 | Generates warning when network usage reaches a specified value or higher. |
+
+## NTP Monitor
+
+ntp_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :----------- | :----: | :--: | :------------: | :---------------------------------------------------------------------------------------- |
+| server | string | n/a | ntp.ubuntu.com | The name of NTP server to synchronize date and time. (e.g. ntp.nict.jp for Japan) |
+| offset_warn | float | sec | 0.1 | Generates warning when NTP offset reaches a specified value or higher. (default is 100ms) |
+| offset_error | float | sec | 5.0 | Generates warning when NTP offset reaches a specified value or higher. (default is 5sec) |
+
+## Process Monitor
+
+process_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :----------- | :--: | :--: | :-----: | :------------------------------------------------------------------------------ |
+| num_of_procs | int | n/a | 5 | The number of processes to generate High-load Proc[0-9] and High-mem Proc[0-9]. |
+
+## GPU Monitor
+
+gpu_monitor:
+
+| Name | Type | Unit | Default | Notes |
+| :----------------- | :---: | :-----: | :-----: | :--------------------------------------------------------------------------- |
+| temp_warn | float | DegC | 90.0 | Generates warning when GPU temperature reaches a specified value or higher. |
+| temp_error | float | DegC | 95.0 | Generates error when GPU temperature reaches a specified value or higher. |
+| gpu_usage_warn | float | %(1e-2) | 0.90 | Generates warning when GPU usage reaches a specified value or higher. |
+| gpu_usage_error | float | %(1e-2) | 1.00 | Generates error when GPU usage reaches a specified value or higher. |
+| memory_usage_warn | float | %(1e-2) | 0.90 | Generates warning when GPU memory usage reaches a specified value or higher. |
+| memory_usage_error | float | %(1e-2) | 1.00 | Generates error when GPU memory usage reaches a specified value or higher. |
diff --git a/system/system_monitor/docs/seq_diagrams.md b/system/system_monitor/docs/seq_diagrams.md
new file mode 100644
index 0000000000000..8fadedb6416a1
--- /dev/null
+++ b/system/system_monitor/docs/seq_diagrams.md
@@ -0,0 +1,29 @@
+# Sequence diagrams
+
+## CPU Monitor
+
+![CPU Monitor](images/seq_cpu_monitor.png)
+
+## HDD Monitor
+
+![HDD Monitor](images/seq_hdd_monitor.png)
+
+## Memory Monitor
+
+![Memory Monitor](images/seq_mem_monitor.png)
+
+## Net Monitor
+
+![Net Monitor](images/seq_net_monitor.png)
+
+## NTP Monitor
+
+![NTP Monitor](images/seq_ntp_monitor.png)
+
+## Process Monitor
+
+![Process Monitor](images/seq_process_monitor.png)
+
+## GPU Monitor
+
+![GPU Monitor](images/seq_gpu_monitor.png)
diff --git a/system/system_monitor/docs/topics_cpu_monitor.md b/system/system_monitor/docs/topics_cpu_monitor.md
new file mode 100644
index 0000000000000..6243ea0cdda56
--- /dev/null
+++ b/system/system_monitor/docs/topics_cpu_monitor.md
@@ -0,0 +1,104 @@
+# ROS topics: CPU Monitor
+
+## CPU Temperature
+
+/diagnostics/cpu_monitor: CPU Temperature
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+| WARN | warm |
+| ERROR | hot |
+
+[values]
+
+| key (example) | value (example) |
+| ------------------------------------------- | --------------- |
+| Package id 0, Core [0-9], thermal_zone[0-9] | 50.0 DegC |
+
+\*key: thermal_zone[0-9] for ARM architecture.
+
+## CPU Usage
+
+/diagnostics/cpu_monitor: CPU Usage
+
+[summary]
+
+| level | message |
+| ----- | --------------- |
+| OK | OK |
+| WARN | high load |
+| ERROR | very high Lload |
+
+[values]
+
+| key | value (example) |
+| --------------------- | ------------------------------- |
+| CPU [all,0-9]: status | OK / high load / very high load |
+| CPU [all,0-9]: usr | 2.00% |
+| CPU [all,0-9]: nice | 0.00% |
+| CPU [all,0-9]: sys | 1.00% |
+| CPU [all,0-9]: idle | 97.00% |
+
+## CPU Load Average
+
+/diagnostics/cpu_monitor: CPU Load Average
+
+[summary]
+
+| level | message |
+| ----- | --------- |
+| OK | OK |
+| WARN | high load |
+
+[values]
+
+| key | value (example) |
+| ----- | --------------- |
+| 1min | 14.50% |
+| 5min | 14.55% |
+| 15min | 9.67% |
+
+## CPU Thermal Throttling
+
+> Intel and raspi platform only.
+> Tegra platform not supported.
+
+/diagnostics/cpu_monitor: CPU Thermal Throttling
+
+[summary]
+
+| level | message |
+| ----- | ---------- |
+| OK | OK |
+| ERROR | throttling |
+
+[values for intel platform]
+
+| key | value (example) |
+| ----------------------------- | --------------- |
+| CPU [0-9]: Pkg Thermal Status | OK / throttling |
+
+[values for raspi platform]
+
+| key | value (example) |
+| ------ | --------------------------------------------------------------- |
+| status | All clear / Currently throttled / Soft temperature limit active |
+
+## CPU Frequency
+
+/diagnostics/cpu_monitor: CPU Frequency
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+
+[values]
+
+| key | value (example) |
+| ---------------- | --------------- |
+| CPU [0-9]: clock | 2879MHz |
diff --git a/system/system_monitor/docs/topics_gpu_monitor.md b/system/system_monitor/docs/topics_gpu_monitor.md
new file mode 100644
index 0000000000000..42ce63fab2e64
--- /dev/null
+++ b/system/system_monitor/docs/topics_gpu_monitor.md
@@ -0,0 +1,113 @@
+# ROS topics: GPU Monitor
+
+> Intel and tegra platform only.
+> Raspi platform not supported.
+
+## GPU Temperature
+
+/diagnostics/gpu_monitor: GPU Temperature
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+| WARN | warm |
+| ERROR | hot |
+
+[values]
+
+| key (example) | value (example) |
+| ----------------------------------- | --------------- |
+| GeForce GTX 1650, thermal_zone[0-9] | 46.0 DegC |
+
+\*key: thermal_zone[0-9] for ARM architecture.
+
+## GPU Usage
+
+/diagnostics/gpu_monitor: GPU Usage
+
+[summary]
+
+| level | message |
+| ----- | -------------- |
+| OK | OK |
+| WARN | high load |
+| ERROR | very high load |
+
+[values]
+
+| key | value (example) |
+| ----------------- | ------------------------------- |
+| GPU [0-9]: status | OK / high load / very high load |
+| GPU [0-9]: name | GeForce GTX 1650, gpu.[0-9] |
+| GPU [0-9]: usage | 19.0% |
+
+\*key: gpu.[0-9] for ARM architecture.
+
+## GPU Memory Usage
+
+> Intel platform only.
+> There is no separate gpu memory in tegra. Both cpu and gpu uses cpu memory.
+
+/diagnostics/gpu_monitor: GPU Memory Usage
+
+[summary]
+
+| level | message |
+| ----- | -------------- |
+| OK | OK |
+| WARN | high load |
+| ERROR | very high load |
+
+[values]
+
+| key | value (example) |
+| ----------------- | ------------------------------- |
+| GPU [0-9]: status | OK / high load / very high load |
+| GPU [0-9]: name | GeForce GTX 1650 |
+| GPU [0-9]: usage | 13.0% |
+| GPU [0-9]: total | 3G |
+| GPU [0-9]: used | 1G |
+| GPU [0-9]: free | 2G |
+
+## GPU Thermal Throttling
+
+> Intel platform only.
+> Tegra platform not supported.
+
+/diagnostics/gpu_monitor: GPU Thermal Throttling
+
+[summary]
+
+| level | message |
+| ----- | ---------- |
+| OK | OK |
+| ERROR | throttling |
+
+[values]
+
+| key | value (example) |
+| ------------------------- | -------------------------------- |
+| GPU [0-9]: status | OK / throttling |
+| GPU [0-9]: name | GeForce GTX 1650 |
+| GPU [0-9]: graphics clock | 1020 MHz |
+| GPU [0-9]: reasons | GpuIdle / SwThermalSlowdown etc. |
+
+## GPU Frequency
+
+> Tegra platform only.
+
+/diagnostics/gpu_monitor: GPU Frequency
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+
+[values]
+
+| key (example) | value (example) |
+| ------------------------- | --------------- |
+| GPU 17000000.gv11b: clock | 318 MHz |
diff --git a/system/system_monitor/docs/topics_hdd_monitor.md b/system/system_monitor/docs/topics_hdd_monitor.md
new file mode 100644
index 0000000000000..dbc9820edd24c
--- /dev/null
+++ b/system/system_monitor/docs/topics_hdd_monitor.md
@@ -0,0 +1,47 @@
+# ROS topics: CPU Monitor
+
+## HDD Temperature
+
+/diagnostics/hdd_monitor: HDD Temperature
+
+[summary]
+
+| level | message |
+| ----- | ------------ |
+| OK | OK |
+| WARN | hot |
+| ERROR | critical hot |
+
+[values]
+
+| key | value (example) |
+| ---------------------- | -------------------------- |
+| HDD [0-9]: status | OK / hot / critical hot |
+| HDD [0-9]: name | /dev/nvme0 |
+| HDD [0-9]: model | SAMSUNG MZVLB1T0HBLR-000L7 |
+| HDD [0-9]: serial | S4EMNF0M820682 |
+| HDD [0-9]: temperature | 37.0 DegC |
+
+## HDD Usage
+
+/diagnostics/hdd_monitor: HDD Usage
+
+[summary]
+
+| level | message |
+| ----- | ------------------- |
+| OK | OK |
+| WARN | low disk space |
+| ERROR | very low disk space |
+
+[values]
+
+| key | value (example) |
+| --------------------- | ----------------------------------------- |
+| HDD [0-9]: status | OK / low disk space / very low disk space |
+| HDD [0-9]: filesystem | /dev/nvme0n1p4 |
+| HDD [0-9]: size | 264G |
+| HDD [0-9]: used | 172G |
+| HDD [0-9]: avail | 749G |
+| HDD [0-9]: use | 69% |
+| HDD [0-9]: mounted on | / |
diff --git a/system/system_monitor/docs/topics_mem_monitor.md b/system/system_monitor/docs/topics_mem_monitor.md
new file mode 100644
index 0000000000000..ae55c2aff0246
--- /dev/null
+++ b/system/system_monitor/docs/topics_mem_monitor.md
@@ -0,0 +1,28 @@
+# ROS topics: Memory Monitor
+
+## Memory Usage
+
+/diagnostics/mem_monitor: Memory Usage
+
+[summary]
+
+| level | message |
+| ----- | -------------- |
+| OK | OK |
+| WARN | high load |
+| ERROR | very high load |
+
+[values]
+
+| key | value (example) |
+| ------------ | --------------- |
+| Mem: usage | 18.99% |
+| Mem: total | 31G |
+| Mem: used | 5.9G |
+| Mem: free | 15G |
+| Swap: total | 2.0G |
+| Swap: used | 0B |
+| Swap: free | 2.0G |
+| Total: total | 33G |
+| Total: used | 5.9G |
+| Total: free | 17G |
diff --git a/system/system_monitor/docs/topics_net_monitor.md b/system/system_monitor/docs/topics_net_monitor.md
new file mode 100644
index 0000000000000..1e0eefe12063c
--- /dev/null
+++ b/system/system_monitor/docs/topics_net_monitor.md
@@ -0,0 +1,31 @@
+# ROS topics: Net Monitor
+
+## Network Usage
+
+/diagnostics/cpu_monitor: Network Usage
+
+[summary]
+
+| level | message |
+| ----- | --------- |
+| OK | OK |
+| WARN | high load |
+| ERROR | down |
+
+[values]
+
+| key | value (example) |
+| ----------------------------- | --------------------- |
+| Network [0-9]: status | OK / high load / down |
+| Network [0-9]: interface name | wlp82s0 |
+| Network [0-9]: rx_usage | 0.00% |
+| Network [0-9]: tx_usage | 0.00% |
+| Network [0-9]: rx_traffic | 0.00 MB/s |
+| Network [0-9]: tx_traffic | 0.00 MB/s |
+| Network [0-9]: capacity | 400.0 MB/s |
+| Network [0-9]: mtu | 1500 |
+| Network [0-9]: rx_bytes | 58455228 |
+| Network [0-9]: rx_errors | 0 |
+| Network [0-9]: tx_bytes | 11069136 |
+| Network [0-9]: tx_errors | 0 |
+| Network [0-9]: collisions | 0 |
diff --git a/system/system_monitor/docs/topics_ntp_monitor.md b/system/system_monitor/docs/topics_ntp_monitor.md
new file mode 100644
index 0000000000000..398c40026707a
--- /dev/null
+++ b/system/system_monitor/docs/topics_ntp_monitor.md
@@ -0,0 +1,20 @@
+# ROS topics: NTP Monitor
+
+## NTP Offset
+
+/diagnostics/ntp_monitor: NTP Offset
+
+[summary]
+
+| level | message |
+| ----- | -------- |
+| OK | OK |
+| WARN | high |
+| ERROR | too high |
+
+[values]
+
+| key | value (example) |
+| ---------- | --------------- |
+| NTP Offset | -0.013181 sec |
+| NTP Delay | 0.053880 sec |
diff --git a/system/system_monitor/docs/topics_process_monitor.md b/system/system_monitor/docs/topics_process_monitor.md
new file mode 100644
index 0000000000000..97899172881fe
--- /dev/null
+++ b/system/system_monitor/docs/topics_process_monitor.md
@@ -0,0 +1,75 @@
+# ROS topics: Process Monitor
+
+## Tasks Summary
+
+/diagnostics/process_monitor: Tasks Summary
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+
+[values]
+
+| key | value (example) |
+| -------- | --------------- |
+| total | 409 |
+| running | 2 |
+| sleeping | 321 |
+| stopped | 0 |
+| zombie | 0 |
+
+## High-load Proc[0-9]
+
+/diagnostics/process_monitor: High-load Proc[0-9]
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+
+[values]
+
+| key | value (example) |
+| ------- | ------------------------ |
+| COMMAND | /usr/lib/firefox/firefox |
+| %CPU | 37.5 |
+| %MEM | 2.1 |
+| PID | 14062 |
+| USER | autoware |
+| PR | 20 |
+| NI | 0 |
+| VIRT | 3461152 |
+| RES | 669052 |
+| SHR | 481208 |
+| S | S |
+| TIME+ | 23:57.49 |
+
+## High-mem Proc[0-9]
+
+/diagnostics/process_monitor: High-mem Proc[0-9]
+
+[summary]
+
+| level | message |
+| ----- | ------- |
+| OK | OK |
+
+[values]
+
+| key | value (example) |
+| ------- | ----------------------------------------------- |
+| COMMAND | /snap/multipass/1784/usr/bin/qemu-system-x86_64 |
+| %CPU | 0 |
+| %MEM | 2.5 |
+| PID | 1565 |
+| USER | root |
+| PR | 20 |
+| NI | 0 |
+| VIRT | 3722320 |
+| RES | 812432 |
+| SHR | 20340 |
+| S | S |
+| TIME+ | 0:22.84 |
diff --git a/system/system_monitor/include/hdd_reader/hdd_reader.hpp b/system/system_monitor/include/hdd_reader/hdd_reader.hpp
new file mode 100644
index 0000000000000..e06bd6766dccc
--- /dev/null
+++ b/system/system_monitor/include/hdd_reader/hdd_reader.hpp
@@ -0,0 +1,64 @@
+// Copyright 2020 Tier IV, 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.
+
+/**
+ * @file hdd_reader.h
+ * @brief HDD reader definitions
+ */
+
+#ifndef HDD_READER__HDD_READER_HPP_
+#define HDD_READER__HDD_READER_HPP_
+
+#include
+#include
+#include
+
+#include