diff --git a/include/AmptekSimulatorConnectionHandler.h b/include/AmptekSimulatorConnectionHandler.h
index b1823e4a2d2714345409de30c7116867eaa34669..411445b3dce00dc8ad70c9ad79e72f8ca0878487 100644
--- a/include/AmptekSimulatorConnectionHandler.h
+++ b/include/AmptekSimulatorConnectionHandler.h
@@ -4,6 +4,7 @@
 #include "AmptekConnectionHandler.h"
 #include <thread>         // std::thread
 #include <map>
+#include <random>
 
 #define STATUS_SIZE 64
 class AmptekSimulatorConnectionHandler : public AmptekConnectionHandler{
@@ -36,6 +37,10 @@ private:
 
     double acquisition_time = -1;   
     std::thread* spectrum_thread;
+    std::chrono::system_clock::time_point start_time;
+
+    std::default_random_engine delay_gen;
+    std::normal_distribution<double> delay_dist;
 };
 
 #endif
\ No newline at end of file
diff --git a/python/amptek_hardware_interface/AmptekHardwareInterface.i b/python/amptek_hardware_interface/AmptekHardwareInterface.i
index 4101576439fab34d6387e7d8e095d8ab16299216..40e4b733b691be4c7e2b1d5a8c9ca2773cc920a0 100644
--- a/python/amptek_hardware_interface/AmptekHardwareInterface.i
+++ b/python/amptek_hardware_interface/AmptekHardwareInterface.i
@@ -42,6 +42,8 @@ namespace std {
 	}
 }
 
+%ignore AmptekSimulatorConnectionHandler::start_time;
+
 %include "include/AmptekHardwareInterface.h"
 %include "include/AmptekStatus.h"
 %include "include/AmptekSpectrum.h"
diff --git a/python/amptek_hardware_interface/AmptekPX5 b/python/amptek_hardware_interface/AmptekPX5
index 586f8a54c42247fcc70c23d06b01f151fd65358e..bb6709ac87a9836423ba2c208c17b79fb32ed9c2 100644
--- a/python/amptek_hardware_interface/AmptekPX5
+++ b/python/amptek_hardware_interface/AmptekPX5
@@ -6,7 +6,7 @@ logging.basicConfig(
     level=logging.DEBUG,
     datefmt='%Y-%m-%d %H:%M:%S')
 
-from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
+from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt, AttributeProxy, EventType
 from tango.server import Device, attribute, command, pipe, device_property
 from collections import OrderedDict
 import tango
@@ -24,6 +24,8 @@ class AmptekPX5(Device):
     detector_model = device_property(dtype=str, default_value="CdTe")
     connection_mode = device_property(dtype=str, default_value="UDP")
     configuration_file = device_property(dtype=str, default_value="")
+
+    incident_channel = device_property(dtype=str, default_value = "")
    
 
     MaxInfoAge = attribute(label = "MaxInfoAge", dtype=float,
@@ -49,6 +51,9 @@ class AmptekPX5(Device):
 
     SlowCount = attribute(label="SlowCount", dtype=int,
                       fget=lambda self: self.GetSlowCount(self._max_info_age))
+    
+    FastRate = attribute(label="FastRate", dtype=int,
+                      fget=lambda self: self.GetFastRate(self._max_info_age))
 
     GpCount = attribute(label="GpCount", dtype=int,
                       fget=lambda self: self.GetGpCount(self._max_info_age))
@@ -246,6 +251,21 @@ class AmptekPX5(Device):
             self.load_config_dict(c)
 
 
+        if self.connection_mode == 'Simulator':
+            if self.incident_channel != "":
+                logging.debug(f"Add change event callback to determine incident rate. Channel is {self.incident_channel}")
+                self.incident_proxy = AttributeProxy(self.incident_channel)
+                d = self.incident_proxy.get_device_proxy()
+                self.incident_proxy.poll(50)
+                cnf = d.get_attribute_config(self.incident_proxy.name())
+                cnf.events.ch_event.abs_change = "1" 
+                d.set_attribute_config(cnf)
+                self.incident_proxy.subscribe_event(EventType.CHANGE_EVENT, self.update_simulator_rate, [], False) 
+            else:
+                logging.debug(f"No (valid) channel for incident rate is given. Value will be fixed (channel: '{self.incident_channel}')")
+        else:
+            logging.debug("Device not in Simulator Mode. 'inciden_channel' property will be ignored")
+
     def load_config_dict( self, configs ):
         cmd_strings = []
         for cmd, setting in configs.items():
@@ -565,6 +585,16 @@ class AmptekPX5(Device):
     def GetFastCount(self, max_age_ms):
         return self.get_status_attribute(max_age_ms, "FastCount")
 
+    
+    @command(dtype_in = float, dtype_out=float)
+    def GetFastRate(self, max_age_ms):
+        counts = self.get_status_attribute(max_age_ms, "FastCount")
+        acctime = self.get_status_attribute(max_age_ms, "AccTime")
+        if (acctime) > 0:
+            return counts/acctime 
+        else:
+            return 0
+
     @command(dtype_in=float, dtype_out=(int,))
     def GetSpectrum(self, max_age_ms):
         return self.interface.GetSpectrum(max_age_ms)
@@ -796,5 +826,9 @@ class AmptekPX5(Device):
         outstring += "<<END>>\n"
         return outstring
 
+    def update_simulator_rate(self, event):
+        cnf_str = f"SCR={event.attr_value.value:.0f}"
+        self.interface.SetTextConfiguration( [cnf_str] )
+
 if __name__ == "__main__":
     AmptekPX5.run_server()
diff --git a/src/AmptekSimulatorConnectionHandler.cpp b/src/AmptekSimulatorConnectionHandler.cpp
index eb52b5a751dba2bfb87c3c0c293d72c298940a51..fec5a0c78d5730bdd79355c70cf2ba0869838b04 100644
--- a/src/AmptekSimulatorConnectionHandler.cpp
+++ b/src/AmptekSimulatorConnectionHandler.cpp
@@ -5,6 +5,8 @@
 #include <chrono>
 #include <iostream>
 #include <iomanip>
+#include <cmath>
+
 Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){
 
     byte pid1 = request.at(PID1);
@@ -142,11 +144,12 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){
 
 AmptekSimulatorConnectionHandler::AmptekSimulatorConnectionHandler(){
     spectrum = new unsigned int[speclen];
+    start_time = std::chrono::system_clock::now();
     clear();
     initConfigs();
+    delay_dist = std::normal_distribution<double>( 1000.,31. ); // default count rate is 1000cps, i.e. 1000us delay
     spectrum_thread = new std::thread( 
         [&]{
-            auto start_time = std::chrono::system_clock::now();
             while( is_running ){
                 if (flag_enable){
                     is_enabled = true;
@@ -169,8 +172,8 @@ AmptekSimulatorConnectionHandler::AmptekSimulatorConnectionHandler(){
                         }
                     }
                 }
-                
-                std::this_thread::sleep_for(std::chrono::milliseconds(2));
+
+                std::this_thread::sleep_for(std::chrono::microseconds( std::max(1, std::min((int) delay_dist(delay_gen),100000) ) ) );
 
                 
             }
@@ -195,6 +198,7 @@ void AmptekSimulatorConnectionHandler::disable(){
 void AmptekSimulatorConnectionHandler::clear(){
     total_counts = 0;
     acc_time = 0;
+    start_time = std::chrono::system_clock::now();
     for (int i = 0; i < speclen; ++i){
         spectrum[i] = 0;
     }
@@ -257,22 +261,34 @@ void AmptekSimulatorConnectionHandler::readConfig(char* configs){
             std::stringstream linestream(configline);
             std::getline(linestream, config_name,'=');
             linestream >> config_value;
-            if (config_name == "MCAC"){
-                speclen = std::stoi(config_value);
-                delete[] spectrum;
-                spectrum = new unsigned int[speclen];
-                for(int i = 0; i < speclen; ++i){
-                    spectrum[i] = 0;
+
+            if (config_name == "SCR"){
+                // this is a special command to set the simulator count rate, not part of the DP5 protocol!
+                // calculate average delay in us between pulses for target count rate
+                double scr = std::stoi(config_value);
+                if (scr < 1){
+                    scr = 1;
                 }
-            }else if (config_name == "PRET"){
-                if (config_value == "OFF"){
-                    acquisition_time = -1;    
-                }else{
-                    acquisition_time = std::stod( config_value );
+                double dt = 1e6/scr;
+                delay_dist = std::normal_distribution<double>( dt,sqrt(dt) );
+            }
+            else{
+                if (config_name == "MCAC"){
+                    speclen = std::stoi(config_value);
+                    delete[] spectrum;
+                    spectrum = new unsigned int[speclen];
+                    for(int i = 0; i < speclen; ++i){
+                        spectrum[i] = 0;
+                    }
+                }else if (config_name == "PRET"){
+                    if (config_value == "OFF"){
+                        acquisition_time = -1;    
+                    }else{
+                        acquisition_time = std::stod( config_value );
+                    }
                 }
+                text_configs[config_name] = config_value;
             }
-            text_configs[config_name] = config_value;
-
         }catch(...){
             std::cerr << "Failed reading config " << configline << std::endl;
         }