diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp
index 761607147cd4f89f9782431447816f62d769379b..755dcb437ec231e1e46878bc2f213ad80833ef3a 100644
--- a/src/shared/radio/CC3135/CC3135.cpp
+++ b/src/shared/radio/CC3135/CC3135.cpp
@@ -41,13 +41,13 @@
 using namespace Boardcore::CC3135Defs;
 using namespace miosix;
 
-constexpr uint8_t TEST_CHANNEL = 6;
+constexpr uint8_t TEST_CHANNEL = 64;
 
 namespace Boardcore
 {
 
 CC3135::CC3135(std::unique_ptr<ICC3135Iface> &&iface)
-    : iface(std::move(iface)), sd(-1)
+    : iface(std::move(iface)), sd(128)
 {
     irq_wait_thread = thread;
 }
@@ -78,8 +78,7 @@ CC3135::Error CC3135::init(bool wait_for_init)
     this->start();
 
     // Setup transceiver mode
-    TRY(setupTransceiver());
-    TRY(startRecv());
+    // TRY(setupTransceiver());
 
     return Error::NO_ERROR;
 }
@@ -92,6 +91,20 @@ CC3135::Error CC3135::prepareForReset()
     return Error::NO_ERROR;
 }
 
+CC3135::Error CC3135::setApChannel(uint8_t ch)
+{
+    TRY(wlanSet(WLAN_CFG_AP_ID, WLAN_AP_OPT_CHANNEL, Buffer::from(&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); }
@@ -142,15 +155,16 @@ CC3135::Error CC3135::setupTransceiver()
 CC3135::Error CC3135::getVersion(DeviceVersion &version)
 {
     version = {};
-    return devigeGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
+    return deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
                      Buffer::from<DeviceVersion>(&version));
 }
 
-CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value)
+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 = {};
 
@@ -161,6 +175,22 @@ CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value)
     return errorFromStatus(rx_command.status);
 }
 
+CC3135::Error CC3135::wlanSet(uint16_t config_id, uint16_t option, Buffer value)
+{
+    WlanCfgSetGet tx_command = {};
+    tx_command.config_id     = config_id;
+    tx_command.option        = option;
+    tx_command.config_len    = value.len;
+
+    BasicResponse rx_command = {};
+
+    TRY(inoutPacketSync(OPCODE_WLAN_CFG_SET, Buffer::from(&tx_command), value,
+                        OPCODE_WLAN_CFG_SET_RESPONSE, Buffer::from(&rx_command),
+                        Buffer::null()));
+
+    return errorFromStatus(rx_command.status);
+}
+
 CC3135::Error CC3135::wlanSetMode(CC3135Defs::Mode mode)
 {
     WlanSetMode tx_command = {};
@@ -356,28 +386,44 @@ void CC3135::defaultPacketHandler(CC3135Defs::ResponseHeader header)
 
             safeRead(len, Buffer::from(&rx_command));
 
+            // if (rx_command.status_or_len < 0)
+            //     noprintf("Status: %d\n", rx_command.status_or_len);
+
             // 8 byte proprietary header, format information?
             uint64_t header2;
             safeRead(len, Buffer::from(&header2));
             rx_command.status_or_len -= 8;
 
-            /*
-            notprintf("Header: %8x\n", header2);
+            // noprintf("Header: %8llx\n", header2);
+            //
+            // if (rx_command.status_or_len >= 0)
+            // {
+            //     noprintf("%d %d\n", len, rx_command.status_or_len);
+            //
+            //     uint8_t response[len];
+            //     safeRead(len, Buffer{response, len});
+            //
+            //     for (int i = 0; i < rx_command.status_or_len; i++)
+            //     {
+            //         noprintf("%2x ", response[i]);
+            //     }
+            //     noprintf("\n");
+            //
+            //     while (1)
+            //         ;
+            // }
 
-            if (rx_command.status_or_len >= 0)
-            {
-                notprintf("%d %d\n", len, rx_command.status_or_len);
+            break;
+        }
+        case OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
+        {
+            BasicResponse rx_command = {};
 
-                uint8_t response[len];
-                safeRead(len, Buffer{response, len});
+            safeRead(len, Buffer::from(&rx_command));
 
-                for (int i = 0; i < rx_command.status_or_len; i++)
-                {
-                    notprintf("%2x ", response[i]);
-                }
-                notprintf("\n");
-            }
-            */
+            TRACE("[cc3135] Async general error occurred!\n");
+            TRACE("- Status: %d\n", rx_command.status);
+            TRACE("- Source: %d\n", rx_command.sender);
 
             break;
         }
@@ -483,10 +529,24 @@ CC3135::Error CC3135::writePacket(OpCode opcode, CC3135::Buffer command,
     TRY(writeHeader(&header));
 
     if (command.len > 0)
+    {
         iface->write(command.ptr, command.len);
+        len -= command.len;
+    }
 
     if (payload.len > 0)
+    {
         iface->write(payload.ptr, payload.len);
+        len -= payload.len;
+    }
+
+    // Write final padding
+    while (len > 0)
+    {
+        uint8_t buf[] = {0, 0, 0, 0};
+        iface->write(buf, std::min(len, (size_t)4));
+        len -= std::min(len, (size_t)4);
+    }
 
     return Error::NO_ERROR;
 }
@@ -511,6 +571,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
     // 2. Read initial data from the device
     iface->read(&buf[0], 8);
 
+    // for(int i = 0; i < 8; i++)
+    //     noprintf("%x ", buf[i]);
+    //
+    // noprintf("\n");
+
     /*
     Here the TI driver does some weird stuff.
     Also the TI comment is wrong, soooo, I'll just skip that part
@@ -549,6 +614,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
         {
             memmove(&buf[0], &buf[4], 4);
             iface->read(&buf[4], 4);
+
+            // for(int i = 4; i < 8; i++)
+            //     noprintf("%x ", buf[i]);
+            //
+            // noprintf("\n");
         }
     }
 
@@ -630,6 +700,8 @@ CC3135::Error CC3135::errorFromStatus(int16_t status)
     {
         case -2071:
             return Error::WLAN_ALREADY_DISCONNECTED;
+        case -14343:
+            return Error::DEVICE_LOCKED;
         default:
             return Error::GENERIC_ERROR;
     }
@@ -645,6 +717,8 @@ const char *CC3135::errorToStr(Error error)
             return "SYNC_TIMEOUT";
         case Error::GENERIC_ERROR:
             return "GENERIC_ERROR";
+        case Error::DEVICE_LOCKED:
+            return "DEVICE_LOCKED";
         case Error::WLAN_ALREADY_DISCONNECTED:
             return "WLAN_ALREADY_DISCONNECTED";
         default:
diff --git a/src/shared/radio/CC3135/CC3135.h b/src/shared/radio/CC3135/CC3135.h
index d60104533039edb337d3a8ca5ca3bc4b0a09d52a..67152eec3c1d5ef2c783ee543530c6e4ee155db7 100644
--- a/src/shared/radio/CC3135/CC3135.h
+++ b/src/shared/radio/CC3135/CC3135.h
@@ -51,6 +51,7 @@ public:
         SYNC_TIMEOUT,               //< The NWP did not respond.
         GENERIC_ERROR,              //< Generic error class.
         WLAN_ALREADY_DISCONNECTED,  //< Wlan is already disconnected.
+        DEVICE_LOCKED,              //< Device is locked
     };
 
     explicit CC3135(std::unique_ptr<ICC3135Iface> &&iface);
@@ -68,6 +69,9 @@ public:
     CC3135::Error dummySend();
 
     CC3135::Error prepareForReset();
+    CC3135::Error setApChannel(uint8_t ch);
+
+    CC3135::Error getStatus(uint16_t mask, uint8_t &status);
 
     static const char *errorToStr(Error error);
 
@@ -110,7 +114,9 @@ private:
 
     // Part of the device API
 
-    CC3135::Error devigeGet(uint8_t set_id, uint8_t option, Buffer value);
+    CC3135::Error deviceGet(uint16_t set_id, uint16_t option, Buffer value);
+
+    CC3135::Error wlanSet(uint16_t config_id, uint16_t option, Buffer value);
 
     CC3135::Error wlanSetMode(CC3135Defs::Mode mode);
 
diff --git a/src/shared/radio/CC3135/CC3135Defs.h b/src/shared/radio/CC3135/CC3135Defs.h
index 0738afaa3a96e46ad38cd7c9b3b428a736ff1646..e8d5305ec229114307cf609ec67229b16bfbef63 100644
--- a/src/shared/radio/CC3135/CC3135Defs.h
+++ b/src/shared/radio/CC3135/CC3135Defs.h
@@ -46,12 +46,14 @@ enum OpCode : uint16_t
     OPCODE_DEVICE_INITCOMPLETE                  = 0x0008,
     OPCODE_DEVICE_ABORT                         = 0x000C,
     OPCODE_DEVICE_DEVICEASYNCDUMMY              = 0x0063,
+    OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR    = 0x0078,
     OPCODE_DEVICE_DEVICEGETRESPONSE             = 0x0466,
     OPCODE_DEVICE_DEVICESETRESPONSE             = 0x04B7,
     OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A,  //< ????
     OPCODE_WLAN_WLANDISCONNECTRESPONSE          = 0x0C81,
     OPCODE_WLAN_POLICYSETRESPONSE               = 0x0C86,
     OPCODE_WLAN_SET_MODE_RESPONSE               = 0x0CB4,
+    OPCODE_WLAN_CFG_SET_RESPONSE                = 0x0CB5,
     OPCODE_SOCKET_RECVASYNCRESPONSE             = 0x100A,
     OPCODE_SOCKET_SOCKETRESPONSE                = 0x1401,
     OPCODE_SOCKET_CLOSERESPONSE                 = 0x1402,
@@ -61,6 +63,7 @@ enum OpCode : uint16_t
     OPCODE_WLAN_POLICYSETCOMMAND                = 0x8C86,
     OPCODE_WLAN_WLANDISCONNECTCOMMAND           = 0x8C81,
     OPCODE_WLAN_SET_MODE                        = 0x8CB4,
+    OPCODE_WLAN_CFG_SET                         = 0x8CB5,
     OPCODE_SOCKET_SOCKET                        = 0x9401,
     OPCODE_SOCKET_CLOSE                         = 0x9402,
     OPCODE_SOCKET_RECV                          = 0x940A,
@@ -80,6 +83,8 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_DEVICE_ABORT";
         case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY:
             return "OPCODE_DEVICE_DEVICEASYNCDUMMY";
+        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_DEVICESETRESPONSE:
@@ -94,6 +99,8 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_WLAN_POLICYSETRESPONSE";
         case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE:
             return "OPCODE_WLAN_SET_MODE_RESPONSE";
+        case OpCode::OPCODE_WLAN_CFG_SET_RESPONSE:
+            return "OPCODE_WLAN_CFG_SET_RESPONSE";
         case OpCode::OPCODE_SOCKET_RECVASYNCRESPONSE:
             return "OPCODE_SOCKET_RECVASYNCRESPONSE";
         case OpCode::OPCODE_SOCKET_SOCKETRESPONSE:
@@ -110,6 +117,8 @@ inline const char *opToStr(OpCode op)
             return "OPCODE_WLAN_WLANDISCONNECTCOMMAND";
         case OpCode::OPCODE_WLAN_SET_MODE:
             return "OPCODE_WLAN_SET_MODE";
+        case OpCode::OPCODE_WLAN_CFG_SET:
+            return "OPCODE_WLAN_CFG_SET";
         case OpCode::OPCODE_SOCKET_SOCKET:
             return "OPCODE_SOCKET_SOCKET";
         case OpCode::OPCODE_SOCKET_CLOSE:
@@ -184,6 +193,26 @@ struct DeviceSetGet
 constexpr uint16_t DEVICE_GENERAL         = 1;
 constexpr uint16_t DEVICE_GENERAL_VERSION = 12;
 
+constexpr uint16_t DEVICE_STATUS              = 2;
+constexpr uint16_t DEVICE_EVENT_CLASS_DEVICE  = 1;
+constexpr uint16_t DEVICE_EVENT_CLASS_WLAN    = 2;
+constexpr uint16_t DEVICE_EVENT_CLASS_BSD     = 3;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETAPP  = 4;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETCFG  = 5;
+constexpr uint16_t DEVICE_EVENT_CLASS_FS      = 6;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETUTIL = 7;
+
+struct WlanCfgSetGet
+{
+    uint16_t status;
+    uint16_t config_id;
+    uint16_t option;
+    uint16_t config_len;
+};
+
+constexpr uint16_t WLAN_CFG_AP_ID      = 0;
+constexpr uint16_t WLAN_AP_OPT_CHANNEL = 3;
+
 struct WlanSetMode
 {
     Mode mode;
diff --git a/src/tests/drivers/CC3135/test-cc3135.cpp b/src/tests/drivers/CC3135/test-cc3135.cpp
index 863a7862933d2f36fb4d2837d2c38e5d8e1790a7..f348be66d1711777d2a43b8cc19672c8b9b243a8 100644
--- a/src/tests/drivers/CC3135/test-cc3135.cpp
+++ b/src/tests/drivers/CC3135/test-cc3135.cpp
@@ -76,7 +76,7 @@ using irq = Gpio<GPIOA_BASE, 4>;
 using hib = Gpio<GPIOA_BASE, 5>;
 
 #define CC3135_UART USART2
-#define CC3135_HIB
+// #define CC3135_HIB
 #else
 using sck  = Gpio<GPIOA_BASE, 5>;
 using miso = Gpio<GPIOB_BASE, 4>;
@@ -211,11 +211,14 @@ int main()
     {
         printf("[cc3135] Failed to start cc3135 (error: %s), retrying...\n",
                CC3135::errorToStr(result));
-        Thread::sleep(4000);
+        Thread::sleep(1000);
 
         miosix::reboot();
     }
 
+    // cc3135->prepareForReset();
+    // cc3135->setApChannel(100);
+
     printf("[cc3135] Initialization complete!\n");
 
     CC3135Defs::DeviceVersion version = {};
@@ -234,28 +237,32 @@ int main()
 
     while (true)
     {
-        cc3135->startRecv();
-        Thread::sleep(1000);
+        // cc3135->dummySend();
+        // cc3135->startRecv();
+
+        // 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);
+
         printf("[cc3135] Looping\n");
 
-        cc3135->dummySend();
-
-        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);
+        Thread::sleep(1000);
     }
 
+    while (true)
+        ;
+
     // Thread::sleep(3000);
     // miosix::reboot();
 }