diff --git a/Ccs/packet_config_ATHENA_DE.py b/Ccs/packet_config_ATHENA_DE.py
index 8395ea9a009e08e669c22a1bb2ba3f718618093e..1b0271ef66e5f383148ffd05671bf9140838e9d0 100644
--- a/Ccs/packet_config_ATHENA_DE.py
+++ b/Ccs/packet_config_ATHENA_DE.py
@@ -471,12 +471,17 @@ class FpmPktParser:
     Parses telemetry received from FPM
     """
 
-    def __init__(self, scibytes, echobytes=None, defaultbytes=1024):
+    def __init__(self, scibytes, echobytes=None, defaultbytes=1024, scifile=None):
 
         self.scibytes = scibytes
         self.echobytes = echobytes
         self.defaultbytes = defaultbytes
 
+        if scifile is not None:
+            self.scifile = open(scifile, 'wb')
+        else:
+            self.scifile = scifile
+
         self.nbytes_tot = 0
 
         self.lastpkt = None
@@ -485,6 +490,7 @@ class FpmPktParser:
 
         strict = True
         msg = sock.recv(IF_LEN)
+        tofile = False
 
         if not msg:
             return b''
@@ -492,6 +498,7 @@ class FpmPktParser:
         if msg[0] == IfAddr.CMD:
             mlen = ACK_LEN - IF_LEN
         elif msg[0] == IfAddr.SCI:
+            tofile = True
             mlen = self.scibytes
         elif msg[0] == IfAddr.HK:
             mlen = ACK_LEN - IF_LEN
@@ -517,6 +524,9 @@ class FpmPktParser:
         self.lastpkt = msg
         self.nbytes_tot += len(msg)
 
+        if tofile and self.scifile is not None:
+            self.scifile.write(msg[1:])
+
         return msg
 
     def set_scibytes(self, nbytes):
@@ -568,7 +578,7 @@ class FpmProcessor:
 
     def __call__(self, buf, ts=None):
 
-        assert isinstance(buf, queue.Queue)
+        # assert isinstance(buf, queue.Queue)
 
         try:
             pkt = buf.get(timeout=self.queue_to)
@@ -608,7 +618,10 @@ class FpmProcessor:
         else:
 
             if self.curfrm != -1:
-                self.frames.append(self.mk_evt_frame(framesize=self.framesize, verbose=verbose))
+                if not self.process:
+                    self.frames.append(self.cfdata)
+                else:
+                    self.frames.append(self.mk_evt_frame(framesize=self.framesize, verbose=verbose))
 
             self.cfdata = ed
             self.framecnt += 1
@@ -662,6 +675,91 @@ class FpmProcessor:
         self.frames.clear()
 
 
+class FpmProcessorMod:
+    """
+    Processes FPM packets and assembles event frames.
+    """
+
+    def __init__(self, fromfile, framesize=NPIX_LD, ashex=True, process=True, notime=False, queue_to=10):
+        self.framesize = framesize
+        self.ashex = ashex
+        self.process = process
+        self.notime = notime
+
+        self.cfdata = b''
+        self.curfrm = -1
+        self.framecnt = 0
+
+        self.frames = []
+
+        self.queue_to = queue_to
+
+        self.fromfile = open(fromfile, 'rb')
+
+    def __call__(self, ts=None):
+
+        # assert isinstance(buf, queue.Queue)
+
+        try:
+            pkt = self.fromfile.read(EVT_PKT_ELEMENT_LEN)
+            if not pkt:
+                return
+        except:
+            return
+
+        self.frames.clear()
+
+        try:
+            # process data from SCI interface
+            self.proc(pkt)
+
+            if self.frames:
+                return self.frames
+
+        except Exception as err:
+            print(err)
+
+    def proc(self, ed, verbose=False):
+
+        if ed[0] == self.curfrm:
+            self.cfdata += ed
+
+        else:
+
+            if self.curfrm != -1:
+                if not self.process:
+                    self.frames.append(self.cfdata)
+                else:
+                    self.frames.append(self.mk_evt_frame(framesize=self.framesize, verbose=verbose))
+
+            self.cfdata = ed
+            self.framecnt += 1
+            self.curfrm = ed[0]
+
+    def mk_evt_frame(self, framesize=NPIX_LD, verbose=False):
+        try:
+            frame = EventFrame(self.cfdata, framesize=framesize)
+            if verbose:
+                print(frame)
+        except Exception as err:
+            print(err)
+            return self.cfdata
+
+        return frame
+
+    def close_file(self):
+        self.fromfile.close()
+
+        return self.frames
+
+    def reset(self):
+        self.cfdata = b''
+        self.curfrm = -1
+        self.framecnt = 0
+
+        self.frames.clear()
+
+
 class FrameList(list):
 
     def get_frame_ids(self):