diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp
index 755dcb437ec231e1e46878bc2f213ad80833ef3a..9ffe8f3ed8a3ef9b0f10addb2a62d3420c158668 100644
--- a/src/shared/radio/CC3135/CC3135.cpp
+++ b/src/shared/radio/CC3135/CC3135.cpp
@@ -98,13 +98,6 @@ CC3135::Error CC3135::setApChannel(uint8_t ch)
     return Error::NO_ERROR;
 }
 
-CC3135::Error CC3135::getStatus(uint16_t mask, uint8_t &status)
-{
-    TRY(deviceGet(DEVICE_STATUS, mask, Buffer::from<uint8_t>(&status)));
-
-    return Error::NO_ERROR;
-}
-
 CC3135::Error CC3135::startRecv() { return socketRecv(sd, Buffer::null(), 0); }
 
 CC3135::Error CC3135::dummyRecv() { return socketRecv(sd, Buffer::null(), 0); }
@@ -152,11 +145,99 @@ CC3135::Error CC3135::setupTransceiver()
     return Error::NO_ERROR;
 }
 
+CC3135::Error CC3135::deviceStop()
+{
+    DeviceStop tx_command = {};
+    // Deafault timeout
+    tx_command.timeout = 10;
+
+    BasicResponse rx_command = {};
+
+    TRY(inoutPacketSync(OPCODE_DEVICE_STOP_COMMAND, Buffer::from(&tx_command),
+                        Buffer::null(), OPCODE_DEVICE_STOP_RESPONSE,
+                        Buffer::from(&rx_command), Buffer::null()));
+
+    return Error::NO_ERROR;
+}
+
+CC3135::Error CC3135::factoryRestore(CC3135Defs::FsRetToFactoryOp op)
+{
+    FsFileSysControlCommand tx_command = {};
+    tx_command.token                   = 0;
+    tx_command.operation               = FS_CTL_RESTORE;
+    tx_command.buffer_length           = sizeof(FsRetToFactoryCommand);
+
+    FsRetToFactoryCommand command = {};
+    command.operation             = op;
+
+    FsFileSysControlResponse rx_command = {};
+
+    TRY(inoutPacketSync(OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND,
+                        Buffer::from(&tx_command), Buffer::from(&command),
+                        OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE,
+                        Buffer::from(&tx_command), Buffer::null()));
+
+    return errorFromStatus(rx_command.status);
+}
+
+CC3135::Error CC3135::getStatus(uint16_t mask, uint32_t &status)
+{
+    status = {};
+    TRY(deviceGet(DEVICE_STATUS, mask, Buffer::from<uint32_t>(&status)));
+
+    return Error::NO_ERROR;
+}
+
 CC3135::Error CC3135::getVersion(DeviceVersion &version)
 {
     version = {};
-    return deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
-                     Buffer::from<DeviceVersion>(&version));
+    TRY(deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
+                  Buffer::from<DeviceVersion>(&version)));
+
+    return Error::NO_ERROR;
+}
+
+CC3135::Error CC3135::deviceStatStart()
+{
+    BasicResponse rx_command = {};
+
+    TRY(inoutPacketSync(OPCODE_WLAN_STARTRXSTATCOMMAND, Buffer::null(),
+                        Buffer::null(), OPCODE_WLAN_STARTRXSTATRESPONSE,
+                        Buffer::from(&rx_command), Buffer::null()));
+
+    return errorFromStatus(rx_command.status);
+}
+
+CC3135::Error CC3135::deviceStatStop()
+{
+    BasicResponse rx_command = {};
+
+    TRY(inoutPacketSync(OPCODE_WLAN_STOPRXSTATCOMMAND, Buffer::null(),
+                        Buffer::null(), OPCODE_WLAN_STOPRXSTATRESPONSE,
+                        Buffer::from(&rx_command), Buffer::null()));
+
+    return errorFromStatus(rx_command.status);
+}
+
+CC3135::Error CC3135::deviceStatGet(CC3135Defs::DeviceGetStat &stats)
+{
+    stats = {};
+
+    TRY(inoutPacketSync(OPCODE_WLAN_GETRXSTATCOMMAND, Buffer::null(),
+                        Buffer::null(), OPCODE_WLAN_GETRXSTATRESPONE,
+                        Buffer::from<DeviceGetStat>(&stats), Buffer::null()));
+
+    return Error::NO_ERROR;
+}
+
+CC3135::Error CC3135::deviceStatGetPm(CC3135Defs::DeviceGetPmStat &stats)
+{
+    stats = {};
+
+    TRY(deviceGet(DEVICE_GENERAL, DEVICE_STAT_PM,
+                  Buffer::from<DeviceGetPmStat>(&stats)));
+
+    return Error::NO_ERROR;
 }
 
 CC3135::Error CC3135::deviceGet(uint16_t set_id, uint16_t option, Buffer value)
@@ -164,7 +245,6 @@ CC3135::Error CC3135::deviceGet(uint16_t set_id, uint16_t option, Buffer value)
     DeviceSetGet tx_command  = {};
     tx_command.device_set_id = set_id;
     tx_command.option        = option;
-    tx_command.config_len    = value.len;
 
     DeviceSetGet rx_command = {};
 
@@ -511,7 +591,10 @@ CC3135::Error CC3135::readPacket(OpCode opcode, CC3135::Buffer command,
 
             // Read tail of remaining data
             if (len > 0)
+            {
+                TRACE("[cc3135] %d bytes still in receive buffer!\n", len);
                 dummyRead(len);
+            }
 
             break;
         }
diff --git a/src/shared/radio/CC3135/CC3135.h b/src/shared/radio/CC3135/CC3135.h
index 67152eec3c1d5ef2c783ee543530c6e4ee155db7..dcfd0c85162b4d1242c6ac1a9dc25d1dbd66fb65 100644
--- a/src/shared/radio/CC3135/CC3135.h
+++ b/src/shared/radio/CC3135/CC3135.h
@@ -59,6 +59,10 @@ public:
 
     CC3135::Error init(bool wait_for_init);
 
+    CC3135::Error deviceStop();
+
+    CC3135::Error factoryRestore(CC3135Defs::FsRetToFactoryOp op);
+
     void handleIrq();
 
     CC3135::Error getVersion(CC3135Defs::DeviceVersion &version);
@@ -71,7 +75,16 @@ public:
     CC3135::Error prepareForReset();
     CC3135::Error setApChannel(uint8_t ch);
 
-    CC3135::Error getStatus(uint16_t mask, uint8_t &status);
+    CC3135::Error deviceStatStart();
+    CC3135::Error deviceStatStop();
+    CC3135::Error deviceStatGet(CC3135Defs::DeviceGetStat &stats);
+
+    // Not working :(
+    // The device WON'T respond to this ones, not even an error, why?
+    // The comunication is not broken, it will respond to other commands, just
+    // not this one
+    CC3135::Error getStatus(uint16_t mask, uint32_t &status);
+    CC3135::Error deviceStatGetPm(CC3135Defs::DeviceGetPmStat &stats);
 
     static const char *errorToStr(Error error);
 
diff --git a/src/shared/radio/CC3135/CC3135Defs.h b/src/shared/radio/CC3135/CC3135Defs.h
index e8d5305ec229114307cf609ec67229b16bfbef63..1259c40cd6a79dfeb6737e76539216103cc8ff0a 100644
--- a/src/shared/radio/CC3135/CC3135Defs.h
+++ b/src/shared/radio/CC3135/CC3135Defs.h
@@ -46,28 +46,39 @@ enum OpCode : uint16_t
     OPCODE_DEVICE_INITCOMPLETE                  = 0x0008,
     OPCODE_DEVICE_ABORT                         = 0x000C,
     OPCODE_DEVICE_DEVICEASYNCDUMMY              = 0x0063,
+    OPCODE_DEVICE_STOP_ASYNC_RESPONSE           = 0x0073,
     OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR    = 0x0078,
     OPCODE_DEVICE_DEVICEGETRESPONSE             = 0x0466,
+    OPCODE_DEVICE_STOP_RESPONSE                 = 0x0473,
     OPCODE_DEVICE_DEVICESETRESPONSE             = 0x04B7,
     OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A,  //< ????
     OPCODE_WLAN_WLANDISCONNECTRESPONSE          = 0x0C81,
     OPCODE_WLAN_POLICYSETRESPONSE               = 0x0C86,
+    OPCODE_WLAN_STARTRXSTATRESPONSE             = 0x0CAC,
+    OPCODE_WLAN_STOPRXSTATRESPONSE              = 0x0CAB,
+    OPCODE_WLAN_GETRXSTATRESPONE                = 0x0CAF,
     OPCODE_WLAN_SET_MODE_RESPONSE               = 0x0CB4,
     OPCODE_WLAN_CFG_SET_RESPONSE                = 0x0CB5,
     OPCODE_SOCKET_RECVASYNCRESPONSE             = 0x100A,
     OPCODE_SOCKET_SOCKETRESPONSE                = 0x1401,
     OPCODE_SOCKET_CLOSERESPONSE                 = 0x1402,
+    OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE = 0x244B,
     OPCODE_NETAPP_IPACQUIRED                    = 0x1825,  //< ????
     OPCODE_DEVICE_DEVICEGET                     = 0x8466,
+    OPCODE_DEVICE_STOP_COMMAND                  = 0x8473,
     OPCODE_DEVICE_DEVICESET                     = 0x84B7,
     OPCODE_WLAN_POLICYSETCOMMAND                = 0x8C86,
     OPCODE_WLAN_WLANDISCONNECTCOMMAND           = 0x8C81,
+    OPCODE_WLAN_STARTRXSTATCOMMAND              = 0x8CAC,
+    OPCODE_WLAN_STOPRXSTATCOMMAND               = 0x8CAB,
+    OPCODE_WLAN_GETRXSTATCOMMAND                = 0x8CAF,
     OPCODE_WLAN_SET_MODE                        = 0x8CB4,
     OPCODE_WLAN_CFG_SET                         = 0x8CB5,
     OPCODE_SOCKET_SOCKET                        = 0x9401,
     OPCODE_SOCKET_CLOSE                         = 0x9402,
     OPCODE_SOCKET_RECV                          = 0x940A,
     OPCODE_SOCKET_SEND                          = 0x940C,
+    OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND  = 0xA44B,
 };
 
 //! Is this message synchronous?
@@ -83,10 +94,14 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_DEVICE_ABORT";
         case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY:
             return "OPCODE_DEVICE_DEVICEASYNCDUMMY";
+        case OpCode::OPCODE_DEVICE_STOP_ASYNC_RESPONSE:
+            return "OPCODE_DEVICE_STOP_ASYNC_RESPONSE";
         case OpCode::OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
             return "OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR";
         case OpCode::OPCODE_DEVICE_DEVICEGETRESPONSE:
             return "OPCODE_DEVICE_DEVICEGETRESPONSE";
+        case OpCode::OPCODE_DEVICE_STOP_RESPONSE:
+            return "OPCODE_DEVICE_STOP_RESPONSE";
         case OpCode::OPCODE_DEVICE_DEVICESETRESPONSE:
             return "OPCODE_DEVICE_DEVICESETRESPONSE";
         case OpCode::OPCODE_NETAPP_IPACQUIRED:
@@ -97,6 +112,10 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_WLAN_WLANDISCONNECTRESPONSE";
         case OpCode::OPCODE_WLAN_POLICYSETRESPONSE:
             return "OPCODE_WLAN_POLICYSETRESPONSE";
+        case OpCode::OPCODE_WLAN_STARTRXSTATRESPONSE:
+            return "OPCODE_WLAN_STARTRXSTATRESPONSE";
+        case OpCode::OPCODE_WLAN_GETRXSTATRESPONE:
+            return "OPCODE_WLAN_GETRXSTATRESPONE";
         case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE:
             return "OPCODE_WLAN_SET_MODE_RESPONSE";
         case OpCode::OPCODE_WLAN_CFG_SET_RESPONSE:
@@ -107,14 +126,22 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_SOCKET_SOCKETRESPONSE";
         case OpCode::OPCODE_SOCKET_CLOSERESPONSE:
             return "OPCODE_SOCKET_CLOSERESPONSE";
+        case OpCode::OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE:
+            return "OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE";
         case OpCode::OPCODE_DEVICE_DEVICEGET:
             return "OPCODE_DEVICE_DEVICEGET";
+        case OpCode::OPCODE_DEVICE_STOP_COMMAND:
+            return "OPCODE_DEVICE_STOP_COMMAND";
         case OpCode::OPCODE_DEVICE_DEVICESET:
             return "OPCODE_DEVICE_DEVICESET";
         case OpCode::OPCODE_WLAN_POLICYSETCOMMAND:
             return "OPCODE_WLAN_POLICYSETCOMMAND";
         case OpCode::OPCODE_WLAN_WLANDISCONNECTCOMMAND:
             return "OPCODE_WLAN_WLANDISCONNECTCOMMAND";
+        case OpCode::OPCODE_WLAN_STARTRXSTATCOMMAND:
+            return "OPCODE_WLAN_STARTRXSTATCOMMAND";
+        case OpCode::OPCODE_WLAN_GETRXSTATCOMMAND:
+            return "OPCODE_WLAN_GETRXSTATCOMMAND";
         case OpCode::OPCODE_WLAN_SET_MODE:
             return "OPCODE_WLAN_SET_MODE";
         case OpCode::OPCODE_WLAN_CFG_SET:
@@ -127,6 +154,8 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_SOCKET_RECV";
         case OpCode::OPCODE_SOCKET_SEND:
             return "OPCODE_SOCKET_SEND";
+        case OpCode::OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND:
+            return "OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND";
         default:
             return "<unknown>";
     }
@@ -141,6 +170,23 @@ enum Mode : uint8_t
     ROLE_TAG      = 4
 };
 
+enum FsCtl : uint8_t
+{
+    FS_CTL_RESTORE          = 0,
+    FS_CTL_ROLLBACK         = 1,
+    FS_CTL_COMMIT           = 2,
+    FS_CTL_RENAME           = 3,
+    FS_CTL_GET_STORAGE_INFO = 5,
+    FS_CTL_BUNDLE_ROLLBACK  = 6,
+    FS_CTL_BUNDLE_COMMIT    = 7
+};
+
+enum FsRetToFactoryOp : uint32_t
+{
+    FS_FACTORY_RET_TO_IMAGE   = 0,
+    FS_FACTORY_RET_TO_DEFAULT = 2,
+};
+
 struct DeviceVersion
 {
     uint32_t chip_id;
@@ -151,6 +197,46 @@ struct DeviceVersion
     uint8_t _pad[2];
 };
 
+struct DeviceGetPmStatClrOnRdTypes
+{
+    uint32_t disconnects;
+    uint32_t tx_frames_count;
+    uint32_t received_bytes_count;
+    uint8_t _pad[16];
+};
+
+struct DeviceGetPmStatAcc
+{
+    uint32_t time_mac_awake[2];
+    uint32_t time_mac_sleep[2];
+    uint32_t time_mac_listen_11b[2];
+    uint32_t time_nwp_deep_sleep[2];
+    uint32_t time_nwp_stand_by[2];
+    uint32_t time_nwp_awake[2];
+};
+
+struct DeviceGetPmStat
+{
+    DeviceGetPmStatClrOnRdTypes pm_clr_on_rd;
+    DeviceGetPmStatAcc pm_acc;
+    uint8_t _pad[16];
+    uint32_t start_timestamp;
+    uint32_t get_timestamp;
+};
+
+struct DeviceGetStat
+{
+    uint32_t received_valid_packets_number;
+    uint32_t received_fcs_error_packets_number;
+    uint32_t received_address_mismatch_packets_number;
+    int16_t average_data_ctrl_rssi;
+    int16_t average_mg_mnt_rssi;
+    uint16_t rate_histogram[20];
+    uint16_t rssi_histogram[6];
+    uint32_t start_timestamp;
+    uint32_t get_timestamp;
+};
+
 struct GenericHeader
 {
     OpCode opcode;
@@ -192,6 +278,8 @@ struct DeviceSetGet
 
 constexpr uint16_t DEVICE_GENERAL         = 1;
 constexpr uint16_t DEVICE_GENERAL_VERSION = 12;
+constexpr uint16_t DEVICE_STAT_WLAN_RX    = 16;
+constexpr uint16_t DEVICE_STAT_PM         = 14;
 
 constexpr uint16_t DEVICE_STATUS              = 2;
 constexpr uint16_t DEVICE_EVENT_CLASS_DEVICE  = 1;
@@ -299,6 +387,33 @@ struct SocketResponse
     uint8_t _pad;
 };
 
+struct DeviceStop
+{
+    uint16_t timeout;
+    uint8_t _pad[2];
+};
+
+struct FsFileSysControlCommand
+{
+    uint32_t token;
+    FsCtl operation;
+    uint8_t _pad[3];
+    uint32_t file_name_length;
+    uint32_t buffer_length;
+};
+
+struct FsFileSysControlResponse
+{
+    int32_t status;
+    uint32_t token;
+    uint32_t len;
+};
+
+struct FsRetToFactoryCommand
+{
+    FsRetToFactoryOp operation;
+};
+
 enum Rate : uint16_t
 {
     RATE_1M    = 1,
@@ -346,7 +461,7 @@ inline uint16_t makeWlanRawRfTxParams(uint8_t channel, Rate rate, uint8_t power,
 
     if (channel <= MAX_2_4G_CHANNEL)
     {
-        return ((channel << CHANNEL_SHIFT) | (BAND_2_4G << BAND_SHIFT) |
+        return ((channel << CHANNEL_SHIFT) | /*(BAND_2_4G << BAND_SHIFT) |*/
                 (rate << RATE_SHIFT) | (power << POWER_SHIFT) |
                 (preamble << PREAMBLE_SHIFT));
     }
diff --git a/src/tests/drivers/CC3135/test-cc3135.cpp b/src/tests/drivers/CC3135/test-cc3135.cpp
index f348be66d1711777d2a43b8cc19672c8b9b243a8..2870909681dd7c6e9bcdf7c001e49bd4f06ee8a9 100644
--- a/src/tests/drivers/CC3135/test-cc3135.cpp
+++ b/src/tests/drivers/CC3135/test-cc3135.cpp
@@ -156,6 +156,43 @@ void initBoard()
                             InterruptTrigger::RISING_EDGE);
 }
 
+void printStats()
+{
+    CC3135Defs::DeviceGetStat stats = {};
+    CHECK(cc3135->deviceStatGet(stats));
+
+    printf(
+        "[cc3135] Received valid packets: %lu\n"
+        "[cc3135] Received fcs error packets: %lu\n"
+        "[cc3135] Received address mismatch packets: %lu\n"
+        "[cc3135] Average data control rssi: %d\n"
+        "[cc3135] Average mg mnt rssi: %d\n"
+        "[cc3135] Start timestamp: %lu\n"
+        "[cc3135] Get timestamp: %lu\n",
+        stats.received_valid_packets_number,
+        stats.received_fcs_error_packets_number,
+        stats.received_address_mismatch_packets_number,
+        stats.average_data_ctrl_rssi, stats.average_mg_mnt_rssi,
+        stats.start_timestamp, stats.get_timestamp);
+}
+
+void printChipid()
+{
+    CC3135Defs::DeviceVersion version = {};
+    CHECK(cc3135->getVersion(version));
+    printf(
+        "[cc3135] Chip Id: %lx\n"
+        "[cc3135] Fw version: %u.%u.%u.%u\n"
+        "[cc3135] Phy version: %u.%u.%u.%u\n"
+        "[cc3135] Nwp version: %u.%u.%u.%u\n"
+        "[cc3135] Rom version: %x\n",
+        version.chip_id, version.fw_version[0], version.fw_version[1],
+        version.fw_version[2], version.fw_version[3], version.phy_version[0],
+        version.phy_version[1], version.phy_version[2], version.phy_version[3],
+        version.nwp_version[0], version.nwp_version[1], version.nwp_version[2],
+        version.nwp_version[3], version.rom_version);
+}
+
 int main()
 {
     // IRQ watcher thread
@@ -216,24 +253,24 @@ int main()
         miosix::reboot();
     }
 
+    cc3135->deviceStatStart();
+
     // cc3135->prepareForReset();
     // cc3135->setApChannel(100);
 
     printf("[cc3135] Initialization complete!\n");
 
-    CC3135Defs::DeviceVersion version = {};
-    CHECK(cc3135->getVersion(version));
-    printf(
-        "[cc3135] Chip Id: %lx\n"
-        "[cc3135] Fw version: %u.%u.%u.%u\n"
-        "[cc3135] Phy version: %u.%u.%u.%u\n"
-        "[cc3135] Nwp version: %u.%u.%u.%u\n"
-        "[cc3135] Rom version: %x\n",
-        version.chip_id, version.fw_version[0], version.fw_version[1],
-        version.fw_version[2], version.fw_version[3], version.phy_version[0],
-        version.phy_version[1], version.phy_version[2], version.phy_version[3],
-        version.nwp_version[0], version.nwp_version[1], version.nwp_version[2],
-        version.nwp_version[3], version.rom_version);
+    printChipid();
+
+    // uint32_t status;
+    // CHECK(cc3135->getStatus(0, status));
+    // printf("[cc3135] Device status: %lu\n", status);
+
+    // cc3135->factoryRestore(CC3135Defs::FS_FACTORY_RET_TO_IMAGE);
+    // printf("[cc3135] Requested factory reset\n");
+
+    cc3135->deviceStop();
+    printf("[cc3135] Device stopped!\n");
 
     while (true)
     {
@@ -255,7 +292,7 @@ int main()
         //     version.nwp_version[2], version.nwp_version[3],
         //     version.rom_version);
 
-        printf("[cc3135] Looping\n");
+        // printStats();
 
         Thread::sleep(1000);
     }