diff --git a/src/improv.rs b/src/improv.rs
index ef4a13b..83326fa 100644
--- a/src/improv.rs
+++ b/src/improv.rs
@@ -126,6 +126,7 @@ pub enum RPCCommand {
     SendWifiSettings = 0x01,
     RequestCurrentState = 0x02,
     RequestDeviceInformation = 0x03,
+    RequestScannedWiFiNetworks = 0x04,
 }
 
 impl TryFrom<&u8> for RPCCommand {
@@ -136,6 +137,7 @@ impl TryFrom<&u8> for RPCCommand {
             0x01 => Ok(Self::SendWifiSettings),
             0x02 => Ok(Self::RequestCurrentState),
             0x03 => Ok(Self::RequestDeviceInformation),
+            0x04 => Ok(Self::RequestScannedWiFiNetworks),
             _ => Err(anyhow!("Cannot convert to RPC command")),
         }
     }
@@ -240,6 +242,7 @@ pub enum ImprovPacket {
     ErrorState(ErrorStatePacket),
     RequestCurrentState(RequestCurrentStatePacket),
     RequestDeviceInformation(RequestDeviceInformationPacket),
+    RequestScannedWiFiNetworks(RequestScannedWiFiNetworksPacket),
     RPCResult(RPCResultPacket),
 }
 
@@ -339,6 +342,22 @@ impl ImprovDataToPacket for RequestDeviceInformationPacket {
     }
 }
 
+pub struct RequestScannedWiFiNetworksPacket {
+}
+
+impl ImprovDataPacketType for RequestScannedWiFiNetworksPacket {
+    const packet_type: PacketType = PacketType::RPCCommand;
+}
+
+impl ImprovDataToPacket for RequestScannedWiFiNetworksPacket {
+    fn to_bytes(self: &Self) -> Vec<u8> {
+        let mut out = Vec::new();
+        out.push(RPCCommand::RequestScannedWiFiNetworks as u8);
+        out.push(0x00); // rpc command payload length
+        return out;
+    }
+}
+
 pub struct RPCResultPacket {
     pub command_responded_to: RPCCommand,
     pub results: Vec<String>,
diff --git a/src/main.rs b/src/main.rs
index 8c93256..c47f679 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -12,6 +12,7 @@ use improv_setup::improv::{
     ImprovPacket,
     RequestCurrentStatePacket,
     RequestDeviceInformationPacket,
+    RequestScannedWiFiNetworksPacket,
 };
 use improv_setup::serial;
 use tokio_serial;
@@ -30,6 +31,8 @@ enum DeviceCommands {
     },
     /// Request device info
     Info,
+    /// WiFi networks visible to device
+    Scan,
 }
 
 impl Default for DeviceCommands {
@@ -118,6 +121,29 @@ async fn main() -> Result<()>{
                         }
                     }
                 },
+                DeviceCommands::Scan => {
+                    let request_scanned_wifi_networks_packet = RequestScannedWiFiNetworksPacket {};
+
+                    let mut serial_interface = serial::SerialInterface::new(path, *baud_rate).context("Couldn't init serial interface")?;
+
+                    serial_interface.send(&request_scanned_wifi_networks_packet).context("Failed to send improv packet")?;
+
+                    loop {
+                        let result_bytes = serial_interface.recv_bytes().context("Couldn't receive any improv packet")?;
+                        let raw_packet = RawPacket::try_from_bytes(&result_bytes).context("Failed to deserialize packet")?;
+
+                        if let ImprovPacket::RPCResult(rpc_result) = ImprovPacket::try_from_raw_packet(&raw_packet).context("Failed to read packet")? {
+                            if rpc_result.results.len() <= 0 {
+                                break;
+                            }
+                            println!("{:<25}   {:>3}   {}", &rpc_result.results[0], &rpc_result.results[1], match rpc_result.results[2].as_str() {
+                                "YES" => "secure",
+                                "NO" => "open",
+                                _ => "",
+                            });
+                        }
+                    }
+                },
             };
 
         },