diff --git a/system/bluetooth_monitor/CMakeLists.txt b/system/bluetooth_monitor/CMakeLists.txt
new file mode 100644
index 0000000000000..ea91d77abeeb8
--- /dev/null
+++ b/system/bluetooth_monitor/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 3.5)
+project(bluetooth_monitor)
+
+### Dependencies
+find_package(autoware_cmake REQUIRED)
+autoware_package()
+
+ament_auto_add_library(bluetooth_monitor_lib SHARED
+ src/bluetooth_monitor.cpp
+)
+
+### Target executable
+ament_auto_add_executable(l2ping_service
+ service/main.cpp
+ service/l2ping_service.cpp
+ service/l2ping.cpp
+)
+
+find_package(Boost REQUIRED COMPONENTS
+ serialization
+)
+
+## Specify libraries to link a library or executable target against
+target_link_libraries(bluetooth_monitor_lib ${Boost_LIBRARIES})
+target_link_libraries(l2ping_service ${Boost_LIBRARIES})
+
+rclcpp_components_register_node(bluetooth_monitor_lib
+ PLUGIN "BluetoothMonitor"
+ EXECUTABLE bluetooth_monitor
+)
+
+ament_auto_package(INSTALL_TO_SHARE
+ config
+ launch
+)
diff --git a/system/bluetooth_monitor/README.md b/system/bluetooth_monitor/README.md
new file mode 100644
index 0000000000000..54d59fd18f739
--- /dev/null
+++ b/system/bluetooth_monitor/README.md
@@ -0,0 +1,84 @@
+# bluetooth_monitor
+
+## Description
+
+This node monitors a Bluetooth connection to a wireless device by using L2ping.
+L2ping generates PING echo command on Bluetooth L2CAP layer, and it is able to receive and check echo response from a wireless device.
+
+## Block diagram
+
+L2ping 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 `l2ping_service` which performs L2ping and provides wireless device information to `bluetooth_monitor` by using socket programming.
+- `bluetooth_monitor` is able to know wireless device information and L2ping status as an unprivileged user since those information are sent by socket communication.
+
+![block_diagram](docs/block_diagram.drawio.svg)
+
+## Output
+
+### bluetooth_monitor: bluetooth_connection
+
+[summary]
+
+| level | message |
+| ----- | -------------- |
+| OK | OK |
+| WARN | RTT warning |
+| ERROR | Lost |
+| | Function error |
+
+[values]
+
+| key | value (example) |
+| -------------------------- | ----------------------------------------------------------------------- |
+| Device [0-9]: Status | OK / RTT warning / Verify error / Lost / Ping rejected / Function error |
+| Device [0-9]: Name | Wireless Controller |
+| Device [0-9]: Manufacturer | MediaTek, Inc. |
+| Device [0-9]: Address | AA:BB:CC:DD:EE:FF |
+| Device [0-9]: RTT | 0.00ms |
+
+- The following key will be added when `bluetooth_monitor` reports `Function error`.
+ ex.) The `connect` system call failed.
+
+| key (example) | value (example) |
+| --------------------- | ------------------------- |
+| Device [0-9]: connect | No such file or directory |
+
+## Parameters
+
+| Name | Type | Default Value | Explanation |
+| ----------- | ------ | ------------- | --------------------------------------------------------- |
+| `port` | int | 7640 | Port number to connect to L2ping service. |
+| `timeout` | int | 5 | Wait timeout seconds for the response. |
+| `rtt_warn` | float | 0.00 | RTT(Round-Trip Time) to generate warn. |
+| `addresses` | string | \* | List of bluetooth address of wireless devices to monitor. |
+
+- `rtt_warn`
+
+ - **0.00(zero)**: Disable checking RTT
+ - **otherwise**: Check RTT with specified seconds
+
+- `addresses`
+ - **\***: All connected devices
+ - **AA:BB:CC:DD:EE:FF**: You can specify a device to monitor by setting a Bluetooth address
+
+## Instructions before starting
+
+- You can skip this instructions if you run `l2ping_service` as root user.
+
+1. Assign capability to `l2ping_service` since L2ping requires `cap_net_raw+eip` capability.
+
+ ```sh
+ sudo setcap 'cap_net_raw+eip' ./build/bluetooth_monitor/l2ping_service
+ ```
+
+2. Run `l2ping_service` and `bluetooth_monitor`.
+
+ ```sh
+ ./build/bluetooth_monitor/l2ping_service
+ ros2 launch bluetooth_monitor bluetooth_monitor.launch.xml
+ ```
+
+## Known limitations and issues
+
+None.
diff --git a/system/bluetooth_monitor/config/bluetooth_monitor.param.yaml b/system/bluetooth_monitor/config/bluetooth_monitor.param.yaml
new file mode 100644
index 0000000000000..fd4c9eaa40d21
--- /dev/null
+++ b/system/bluetooth_monitor/config/bluetooth_monitor.param.yaml
@@ -0,0 +1,7 @@
+---
+/**:
+ ros__parameters:
+ port: 7640
+ timeout: 5
+ rtt_warn: 0.00
+ addresses: ["4C:B9:9B:6E:7F:9A"]
diff --git a/system/bluetooth_monitor/docs/block_diagram.drawio.svg b/system/bluetooth_monitor/docs/block_diagram.drawio.svg
new file mode 100644
index 0000000000000..1087283100417
--- /dev/null
+++ b/system/bluetooth_monitor/docs/block_diagram.drawio.svg
@@ -0,0 +1,3441 @@
+
\ No newline at end of file
diff --git a/system/bluetooth_monitor/include/bluetooth_monitor/bluetooth_monitor.hpp b/system/bluetooth_monitor/include/bluetooth_monitor/bluetooth_monitor.hpp
new file mode 100644
index 0000000000000..6ebca9b4189d5
--- /dev/null
+++ b/system/bluetooth_monitor/include/bluetooth_monitor/bluetooth_monitor.hpp
@@ -0,0 +1,112 @@
+// Copyright 2022 The Autoware Contributors
+//
+// 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.
+
+#ifndef BLUETOOTH_MONITOR__BLUETOOTH_MONITOR_HPP_
+#define BLUETOOTH_MONITOR__BLUETOOTH_MONITOR_HPP_
+
+#include "bluetooth_monitor/service/l2ping_interface.hpp"
+
+#include
+#include
+
+#include