diff --git a/src/driver/nbiot.be b/src/driver/nbiot.be
index b710b53f27a196c1f5f7d61ec613130688b3e954..1cfe03078ad2e653fb6cb9eca4902b39f27af956 100644
--- a/src/driver/nbiot.be
+++ b/src/driver/nbiot.be
@@ -124,13 +124,15 @@ class NBIoTCommand
   var cmd
   var rsp
   var retries
-  var done
 
   def init(cmd, rsp, retries)
     self.cmd = cmd
     self.rsp = rsp
     self.retries = retries
-    self.done = false
+
+    if self.retries == nil
+      self.retries = 0
+    end
   end
 end
 
@@ -251,27 +253,63 @@ end
 
 class NBIoTResetProcedure : NBIoTProcedure
   var cmd_reset
+  var cmd_at
 
   def init(ser)
     super(self).init(ser)
 
-    self.cmd_reset = NBIoTCommand('AT+QRST=1\r\n', 'RDY', 0)
+    self.cmd_reset = NBIoTCommand('AT+QRST=1\r\n', 'RDY')
+    self.cmd_at = NBIoTCommand('AT\r\n', 'OK')
   end
 
   def execute()
     if self.cmd_in_process == nil
       self.cmd_in_process = self.cmd_reset
+    elif self.cmd_in_process == self.cmd_reset
+      if self.read_rsp_contains_expected_rsp_or_send()
+        self.cmd_in_process = self.cmd_at
+      end
+    elif self.cmd_in_process == self.cmd_at
+      self.done = self.read_rsp_contains_expected_rsp_or_send()
     end
+  end
+end
 
-    self.done = self.read_rsp_contains_expected_rsp_or_send()
+class NBIoTDisablePSMProcedure : NBIoTProcedure
+  var cmd_register
+  var cmd_disable_psm
+  var cmd_disable_sleep
+
+  def init(ser)
+    super(self).init(ser)
+
+    self.cmd_register = NBIoTCommand('AT+CEREG=1\r\n', 'OK')
+    self.cmd_disable_psm = NBIoTCommand('AT+CPSMS=0\r\n', 'OK')
+    self.cmd_disable_sleep = NBIoTCommand('AT+QSCLK=0\r\n', 'OK')
+  end
+
+  def execute()
+    if self.cmd_in_process == nil
+      self.cmd_in_process = self.cmd_register
+    elif self.cmd_in_process == self.cmd_register
+      if self.read_rsp_contains_expected_rsp_or_send()
+        self.cmd_in_process = self.cmd_disable_psm
+      end
+    elif self.cmd_in_process == self.cmd_disable_psm
+      if self.read_rsp_contains_expected_rsp_or_send()
+        self.cmd_in_process = self.cmd_disable_sleep
+      end
+    elif self.cmd_in_process == self.cmd_disable_sleep
+      self.done = self.read_rsp_contains_expected_rsp_or_send()
+    end
   end
 end
 
 class NBIoTNTPProcedure : NBIoTProcedure
   var cmd_ntp
 
-  def init(ser)
-    super(self).init(ser)
+  def init(ser, request)
+    super(self).init(ser, request)
 
     self.cmd_ntp = NBIoTCommand('AT+QNTP=1,\"0.at.pool.ntp.org\"\r\n', '+QNTP: 0', 10)
   end
@@ -312,10 +350,12 @@ end
 # ------------------------------------------------------- #
 
 class NBIoTDriverState
-  static var IDLE = 0
-  static var RESET = 1
-  static var READY = 2
-  static var BUSY = 3
+  static var INIT = 0
+  static var IDLE = 1
+  static var RESET = 2
+  static var DISABLE_PSM = 3
+  static var READY = 4
+  static var BUSY = 5
 end
 
 # ------------------------------------------------------- #
@@ -333,7 +373,7 @@ class NBIoTDriver
     self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1)
     self.psm_eint = psm_eint
 
-    self.state = NBIoTDriverState.RESET
+    self.state = NBIoTDriverState.INIT
     self.request_queue = []
     self.procedure = nil
   end
@@ -360,9 +400,16 @@ class NBIoTDriver
     self.state = state
   end
 
+  def set_psm_pin(value)
+    gpio.digital_write(self.psm_eint, value)
+  end
+
   def every_second()
     if self.state == NBIoTDriverState.IDLE
       return
+    elif self.state == NBIoTDriverState.INIT
+      self.set_psm_pin(1)
+      self.next_state(NBIoTDriverState.RESET)
     elif self.state == NBIoTDriverState.RESET
       if self.procedure == nil
         self.init_procedure(NBIoTResetProcedure(self.ser))
@@ -371,6 +418,18 @@ class NBIoTDriver
       self.procedure.execute()
 
       if self.procedure.is_done()
+        self.finish_procedure()
+        self.next_state(NBIoTDriverState.DISABLE_PSM)
+      end
+    elif self.state == NBIoTDriverState.DISABLE_PSM
+      if self.procedure == nil
+        self.init_procedure(NBIoTDisablePSMProcedure(self.ser))
+      end
+
+      self.procedure.execute()
+
+      if self.procedure.is_done()
+        self.finish_procedure()
         self.next_state(NBIoTDriverState.READY)
       end
     elif self.state == NBIoTDriverState.READY
@@ -383,7 +442,7 @@ class NBIoTDriver
         if request.request_type == NBIoTRequestType.DEBUG
           procedure = NBIoTDebugProcedure(self.ser, request)
         elif request.request_type == NBIoTRequestType.NTP
-          procedure = NBIoTNTPProcedure(self.ser)
+          procedure = NBIoTNTPProcedure(self.ser, request)
         elif
           tasmota.log(string.format('NBT: Request with type %i not supported, discarding request', request.request_type), 2)
         end
@@ -478,6 +537,10 @@ nbiot.init = def (m)
     end
 
     def debug_send(cmd, rsp, retries)
+      if retries == nil
+        retries = 0
+      end
+      
       var request = NBIoTDebugRequest(cmd, rsp, retries)
 
       self._driver.queue_request(request)