diff --git a/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala b/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
index 91962327cec9685523e078e16b04432cd7d61b96..15aef0f135dbce97d0db991977d082439aa4ccf5 100644
--- a/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
+++ b/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
@@ -55,6 +55,8 @@ case class FileParsingSignalEndTree(
 sealed trait FileParsingResult extends FileParsingResultSignal {
   val result: ParseResult
   val task: FileParsingTask
+  val start: Option[StartedParsingSession]
+  val end: Option[FinishedParsingSession]
 
   val treeTask: FileTreeScanTask = task.treeTask
 }
diff --git a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
index bd2a2d4e30387c6bcd2063acbcec6ab50f5cfd20..cdde43e41e2fd18dde9e008fdd78fc8d6913afe2 100644
--- a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
+++ b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
@@ -12,10 +12,10 @@ import org.mockito.ArgumentMatchers.{ eq => raw, _ }
 import org.mockito.Mockito._
 import org.mockito.invocation.InvocationOnMock
 import org.mockito.stubbing.Answer
-import org.scalatest.WordSpec
+import org.scalatest.{ Matchers, WordSpec }
 import org.scalatest.mockito.MockitoSugar
 
-class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestDataBuilders with MessageMatchers {
+class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestDataBuilders with Matchers with FileParsingResultMatchers {
 
   val parserInfo: JObject = JObject(
     "name" -> JString("dummyParser")
@@ -80,42 +80,33 @@ class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestD
         val f = new Fixture
         f.prepareParserStandardInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.start.nonEmpty, "expected a start event to be emitted")
-        assert(inMemory.end.nonEmpty, "expected a finish event to be emitted")
+        assert(result.start.nonEmpty, "expected a start event to be emitted")
+        assert(result.end.nonEmpty, "expected a finish event to be emitted")
       }
 
       "record all emitted events in the correct order" in {
         val f = new Fixture
         f.prepareParserStandardInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        inMemory.events.zip(sampleEvents).foreach(x => assert(x._1 == x._2))
-        assert(inMemory.events === sampleEvents, "emitted and recorded events do not match")
+        result should have(events(sampleEvents))
       }
 
       "handle parsing failures and return an appropriate result" in {
         val f = new Fixture
         f.prepareParserFailureInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.result == ParseResult.ParseFailure)
-        assert(inMemory.end.nonEmpty, "should have a termination event")
-        assert(inMemory.end.get.parserErrors.children.nonEmpty, "should have error messages")
+        result should have(status(ParseResult.ParseFailure))
+        assert(result.end.nonEmpty, "should have a termination event")
+        assert(result.end.get.parserErrors.children.nonEmpty, "should have error messages")
       }
 
       "gracefully fail parsing requests with unknown parsers" in {
         val f = new Fixture
         val anotherRequest = sampleParseRequest.withParserName("nonSenseParser")
         val result = f.worker.processRequest(anotherRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.result == ParseResult.ParseFailure, "should have a failed status")
-        assert(inMemory.end.nonEmpty, "should have a termination event")
-        assert(inMemory.end.get.parserErrors.children.nonEmpty, "should have error messages")
+        result should have(status(ParseResult.ParseFailure))
+        assert(result.end.nonEmpty, "should have a termination event")
+        assert(result.end.get.parserErrors.children.nonEmpty, "should have error messages")
       }
 
       "specify the correct main file to the parser" in {
diff --git a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
index fce7320274cbf8fe8a9e3bbeeda09b4b7ed7d5c4..a3519adee4bc64896f729b43d5d81be3b8c26e62 100644
--- a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
+++ b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
@@ -4,6 +4,7 @@ import java.nio.file.{ Path, Paths }
 
 import eu.nomad_lab.integrated_pipeline.messages._
 import eu.nomad_lab.parsers.ParseResult.ParseResult
+import eu.nomad_lab.parsers.{ FinishedParsingSession, ParseEvent, StartedParsingSession }
 import org.scalatest.matchers.{ HavePropertyMatchResult, HavePropertyMatcher }
 
 trait MessageMatchers
@@ -104,4 +105,28 @@ trait FileParsingResultMatchers {
       expected = expectedValue,
       test = (x: FileParsingSignalEndTree) => x.numParsingTasks
     )
+
+  def startSignal(expectedValue: Option[StartedParsingSession]): HavePropertyMatcher[FileParsingResult, Option[StartedParsingSession]] =
+    Helpers.propertyMatcher(
+      propertyName = "session start signal",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x.start
+    )
+
+  def endSignal(expectedValue: Option[FinishedParsingSession]): HavePropertyMatcher[FileParsingResult, Option[FinishedParsingSession]] =
+    Helpers.propertyMatcher(
+      propertyName = "session end signal",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x.end
+    )
+
+  def events(expectedValue: Seq[ParseEvent]): HavePropertyMatcher[FileParsingResult, Seq[ParseEvent]] =
+    Helpers.propertyMatcher(
+      propertyName = "emitted parsing events",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x match {
+      case x: InMemoryResult => x.events
+    }
+    )
+
 }
\ No newline at end of file