diff --git a/state_machines/enb_acs_manager.py b/state_machines/enb_acs_manager.py
index d8b5947..ba6ae27 100644
--- a/state_machines/enb_acs_manager.py
+++ b/state_machines/enb_acs_manager.py
@@ -3,6 +3,7 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
+import time
 from typing import Any, List, Optional
 
 from common.service import MagmaService
diff --git a/state_machines/enb_acs_states.py b/state_machines/enb_acs_states.py
index bfd0824..071cd49 100644
--- a/state_machines/enb_acs_states.py
+++ b/state_machines/enb_acs_states.py
@@ -136,16 +136,25 @@
         """
         if not isinstance(message, models.Inform):
             return AcsReadMsgResult(False, None)
+
         process_inform_message(
             message, self.acs.data_model,
             self.acs.device_cfg,
         )
+
+        # Switch enodeb status to connected
+        metrics.set_enb_status(
+            self.acs.device_cfg.get_parameter("Serial number"),
+            status="connected"
+        )
+
         if does_inform_have_event(message, '1 BOOT'):
             return AcsReadMsgResult(True, self.boot_transition)
         return AcsReadMsgResult(True, None)
 
     def get_msg(self, message: Any) -> AcsMsgAndTransition:
         """ Reply with InformResponse """
+        
         response = models.InformResponse()
         # Set maxEnvelopes to 1, as per TR-069 spec
         response.MaxEnvelopes = 1
@@ -962,16 +971,23 @@
                     )
             self._mark_as_configured()
 
-            metrics.STAT_ENODEB_LAST_CONFIGURED.labels(
-                serial_number=self.acs.device_cfg.get_parameter("Serial number"),
-                ip_address=self.acs.device_cfg.get_parameter("ip_address"),
-                gps_lat=self.acs.device_cfg.get_parameter("GPS lat"),
-                gps_lon=self.acs.device_cfg.get_parameter("GPS long")
-            ).set(int(time.time()))
+            metrics.set_enb_last_configured_time(
+                self.acs.device_cfg.get_parameter("Serial number"),
+                self.acs.device_cfg.get_parameter("ip_address"),
+                int(time.time())
+            )
+
+            # Switch enodeb status to configured
+            metrics.set_enb_status(
+                self.acs.device_cfg.get_parameter("Serial number"),
+                status="configured"
+            )
 
             if not self.acs.are_invasive_changes_applied:
                 return AcsReadMsgResult(True, self.apply_invasive_transition)
+
             return AcsReadMsgResult(True, self.done_transition)
+
         elif type(message) == models.Fault:
             logger.error(
                 'Received Fault in response to SetParameterValues, '
@@ -1046,6 +1062,12 @@
         return AcsReadMsgResult(False, None)
 
     def get_msg(self, message: Any) -> AcsMsgAndTransition:
+        # Switch enodeb status to disconnected
+        metrics.set_enb_status(
+            self.acs.device_cfg.get_parameter("Serial number"),
+            status="disconnected"
+        )
+
         request = models.DummyInput()
         return AcsMsgAndTransition(request, None)
 
@@ -1274,20 +1296,24 @@
 
     def get_msg(self, message: Any) -> AcsMsgAndTransition:
 
-        print("ACS Device CFG")
-        print(self.acs.device_cfg._param_to_value)
+        # Switch enodeb status to firmware upgrading
+        metrics.set_enb_status(
+            self.acs.device_cfg.get_parameter("Serial number"),
+            status="firmware_upgrading"
+        )
 
         request = models.Download()
         request.CommandKey = "20220206215200"
         request.FileType = "1 Firmware Upgrade Image"
-        request.URL = "http://10.128.250.131/firmware/Qproject_TEST3918_2102241222.ffw"
+        request.URL = "http://10.128.250.131/firmware/Qproject_RC3923_2202151120.ffw"
         request.Username = ""
         request.Password = ""
-        request.FileSize = 57208579
-        request.TargetFileName = "Qproject_TEST3918_2102241222.ffw"
+        request.FileSize = 57399275
+        request.TargetFileName = "Qproject_RC3923_2202151120.ffw"
         request.DelaySeconds = 0
         request.SuccessURL = ""
         request.FailureURL = ""
+
         return AcsMsgAndTransition(request, self.done_transition)
 
     def state_description(self) -> str:
@@ -1371,6 +1397,77 @@
     def state_description(self) -> str:
         return "Wait DownloadResponse message"
 
+class CheckStatusState(EnodebAcsState):
+    """
+    Sent a request to enodeb to get the basic status from device
+    """
+
+    def __init__(
+        self,
+        acs: EnodebAcsStateMachine,
+        when_done: str,
+    ):
+        super().__init__()
+        self.acs = acs
+        self.done_transition = when_done
+
+    def get_msg(self, message: Any) -> AcsMsgAndTransition:
+        """
+        Send with GetParameterValuesRequest
+        """
+
+        self.PARAMETERS = [
+            ParameterName.RF_TX_STATUS,
+            ParameterName.GPS_STATUS,
+            ParameterName.GPS_LAT,
+            ParameterName.GPS_LONG,
+        ]
+
+        request = models.GetParameterValues()
+        request.ParameterNames = models.ParameterNames()
+        request.ParameterNames.arrayType = 'xsd:string[1]'
+        request.ParameterNames.string = []
+
+        for name in self.PARAMETERS:
+            if self.acs.data_model.is_parameter_present(name):
+                path = self.acs.data_model.get_parameter(name).path
+                request.ParameterNames.string.append(path)
+
+        request.ParameterNames.arrayType = \
+            'xsd:string[%d]' % len(request.ParameterNames.string)
+
+        return AcsMsgAndTransition(request, self.done_transition)
+
+    def read_msg(self, message: Any) -> AcsReadMsgResult:
+
+        if not isinstance(message, models.GetParameterValuesResponse):
+            return AcsReadMsgResult(msg_handled=False, next_state=when_done)
+        
+        name_to_val = parse_get_parameter_values_response(self.acs.data_model, message, )
+        logger.info("CheckStatusState: %s", str(name_to_val))
+
+        # Call set_enb_gps_status to update the parameter in prometheus api
+        metrics.set_enb_gps_status(
+            self.acs.device_cfg.get_parameter("Serial number"),
+            name_to_val["GPS lat"], name_to_val["GPS long"],
+            name_to_val["gps_status"]
+        )
+
+        # Call set_enb_op_status to update the parameter in prometheus api
+        metrics.set_enb_op_status(
+            self.acs.device_cfg.get_parameter("Serial number"),
+            name_to_val["Opstate"]
+        )
+
+        # Sleep 1 minute and check status again
+        time.sleep(60)
+
+        return AcsReadMsgResult(msg_handled=True, next_state=self.done_transition)
+
+    def state_description(self) -> str:
+        return 'Getting'
+
+
 class ErrorState(EnodebAcsState):
     """
     The eNB handler will enter this state when an unhandled Fault is received.
