diff --git a/.gitattributes b/.gitattributes
index 2e3da03e8703918c330d8aae906265888125b3bc..6a318c269bf78193a03a480ef28362aae96dd1d0 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4981,6 +4981,9 @@ SubSystems/Online_Cobalt/test/Correlator/tCorrelate_3sec_2st_5sb.output/SB4.cflo
 SubSystems/Online_Cobalt/test/Correlator/tCorrelate_3sec_2st_5sb.parset -text
 SubSystems/Online_Cobalt/test/Correlator/tCorrelate_3sec_2st_5sb.run eol=lf
 SubSystems/Online_Cobalt/test/Correlator/tCorrelate_3sec_2st_5sb.sh eol=lf
+SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw-check-output.sh eol=lf
+SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.run eol=lf
+SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.sh eol=lf
 SubSystems/Online_Cobalt/test/tProductionParsets.in_parsets/CorrProc_173014.param -text
 SubSystems/Online_Cobalt/test/tProductionParsets.in_parsets/CorrProc_196344-CygAf009-225SAPS.cleaned.param -text
 SubSystems/Online_Cobalt/test/tProductionParsets.run eol=lf
diff --git a/RTCP/Cobalt/InputProc/src/Station/printRSP.cc b/RTCP/Cobalt/InputProc/src/Station/printRSP.cc
index 1cecf4aabefcdf56eadb790cf94ef299f509bb10..36694660f8ecb4bfd23f5f84128812cd269f5335 100644
--- a/RTCP/Cobalt/InputProc/src/Station/printRSP.cc
+++ b/RTCP/Cobalt/InputProc/src/Station/printRSP.cc
@@ -44,6 +44,7 @@ void report( const string &filename )
 
   struct RSP packet;
 
+  // NOTE: this program is used in output verification in some test case(s). Expect a few test output format related breakage on modification.
   try {
     for(;;) {
       // read header
diff --git a/SubSystems/Online_Cobalt/test/CMakeLists.txt b/SubSystems/Online_Cobalt/test/CMakeLists.txt
index 96f6569ebcfd759fba36b220f287e9d01042996f..324fcc49e00bc9887aac3b6e20ae91063f7cc821 100644
--- a/SubSystems/Online_Cobalt/test/CMakeLists.txt
+++ b/SubSystems/Online_Cobalt/test/CMakeLists.txt
@@ -30,4 +30,4 @@ endif(BUILD_TESTING)
 add_subdirectory(Correlator)
 add_subdirectory(Beamformer)
 add_subdirectory(Commensal)
-#add_subdirectory(RSPRaw)
+add_subdirectory(RSPRaw)
diff --git a/SubSystems/Online_Cobalt/test/RSPRaw/CMakeLists.txt b/SubSystems/Online_Cobalt/test/RSPRaw/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3b55259b67e51b252d8e24b2f49dae94ae0d2b5a
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/RSPRaw/CMakeLists.txt
@@ -0,0 +1,14 @@
+# $Id$
+
+include(LofarCTest)
+
+set(_tests
+  tRSPRaw
+)
+
+foreach(_test ${_tests})
+  lofar_add_test(${_test} DEPENDS printRSP)  # printRSP is used in *-check-output.sh script
+  if(BUILD_TESTING)
+    set_tests_properties(${_test} PROPERTIES RUN_SERIAL ON)
+  endif(BUILD_TESTING)
+endforeach(_test ${_tests})
diff --git a/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw-check-output.sh b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw-check-output.sh
new file mode 100755
index 0000000000000000000000000000000000000000..30d903a91a42947e2e898deb746135aee15ad13c
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw-check-output.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# tRSPRaw output is quite big, so instead of diff-ing to a reference output,
+# check some properties in this script.
+#
+# $Id$
+
+if [ $# -ne 1 ]; then
+  echo 'Syntax: tRSPRaw-check-output.sh <test-output-dir>' >&2
+  exit 1
+fi
+
+OUTDIR="$1"
+
+# from the .parset:
+IN_FILENAME1=/localhome/lofar/test_sets/3sec/raw-b1919-hba-CS002HBA0-0.udp
+IN_FILENAME2=/localhome/lofar/test_sets/3sec/raw-b1919-hba-CS501HBA0-0.udp
+OUT_FILENAME1="$OUTDIR/L102030_CS002HBA0_0_rsp.raw"
+OUT_FILENAME2="$OUTDIR/L102030_CS501HBA0_0_rsp.raw"
+TIMESTAMP_PATTERN="14:15:"  # to exclude the first N packets in IN_FILENAME* with timestamps before RSP raw start time
+
+# Check input vs output on number of RSP packets and their sample number written between parset RSPRaw start/stop time.
+# Echo files to compared, since the diff cmd below compares /dev/fd/N filedescriptors, which gives a useless error message.
+echo 'tRSPRaw-check-output.sh: doing rough check using diff(1) and printRSP (source under InputProc/src/Station/) on generated RSP raw input and output files'
+echo "tRSPRaw-check-output.sh: diff 1: $IN_FILENAME1 (filtered) vs $OUT_FILENAME1"
+echo "tRSPRaw-check-output.sh: diff 2: $IN_FILENAME2 (filtered) vs $OUT_FILENAME2"
+printRSP < /dev/null || exit $?  # exit 127 if printRSP not found (the next cmds do not)
+diff -q <(printRSP < "$IN_FILENAME1"  | grep "Time stamp:   Thu Dec  5 $TIMESTAMP_PATTERN") \
+        <(printRSP < "$OUT_FILENAME1" | grep "Time stamp:   Thu Dec  5 $TIMESTAMP_PATTERN") \
+&& \
+diff -q <(printRSP < "$IN_FILENAME2"  | grep "Time stamp:   Thu Dec  5 $TIMESTAMP_PATTERN") \
+        <(printRSP < "$OUT_FILENAME2" | grep "Time stamp:   Thu Dec  5 $TIMESTAMP_PATTERN")
+
diff --git a/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.parset b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.parset
new file mode 100644
index 0000000000000000000000000000000000000000..6ecd367c4be562bfbe8a8177a1a711ac1ccf93c6
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.parset
@@ -0,0 +1,137 @@
+Cobalt.realTime = false
+Observation.ObsID = 102030
+Observation.momID = 88
+Cobalt.commandStream = null:
+Observation.startTime = '2013-12-05 14:15:00'
+Observation.stopTime = '2013-12-05 14:15:04'
+Observation.sampleClock = 200
+Observation.nrBitsPerSample = 16
+Cobalt.correctBandPass = true
+Cobalt.correctClocks = true
+Cobalt.BeamFormer.coherentDedisperseChannels = false
+Cobalt.delayCompensation = true
+Observation.referencePhaseCenter = [3826577.066, 461022.948, 5064892.786]
+Observation.antennaArray = HBA
+Observation.antennaSet = HBA_ZERO
+Observation.bandFilter = HBA_110_190
+Observation.nrPolarisations = 2
+Observation.nrBeams = 2
+
+Observation.Beam[0].TiedArrayBeam[0].angle1 = 0.0
+Observation.Beam[0].TiedArrayBeam[0].angle2 = 0.0
+Observation.Beam[0].TiedArrayBeam[0].coherent = true
+Observation.Beam[0].TiedArrayBeam[0].directionType = J2000
+Observation.Beam[0].TiedArrayBeam[0].dispersionMeasure = 0
+Observation.Beam[0].TiedArrayBeam[0].specificationType = manual
+Observation.Beam[0].TiedArrayBeam[0].stationList = []
+Observation.Beam[0].TiedArrayBeam[1].angle1 = 0.9293449206762021
+Observation.Beam[0].TiedArrayBeam[1].angle2 = 0.9525764650544495
+Observation.Beam[0].TiedArrayBeam[1].coherent = false
+Observation.Beam[0].TiedArrayBeam[1].directionType = J2000
+Observation.Beam[0].TiedArrayBeam[1].dispersionMeasure = 0
+Observation.Beam[0].TiedArrayBeam[1].specificationType = manual
+Observation.Beam[0].TiedArrayBeam[1].stationList = []
+Observation.Beam[0].angle1 = 0.9293449206762021
+Observation.Beam[0].angle2 = 0.9525764650544495
+Observation.Beam[0].beamletList = []
+Observation.Beam[0].directionType = J2000
+Observation.Beam[0].duration = 900
+Observation.Beam[0].maximizeDuration = false
+Observation.Beam[0].momID = 88
+Observation.Beam[0].nrTabRings = 0
+Observation.Beam[0].nrTiedArrayBeams = 2
+Observation.Beam[0].startTime =
+Observation.Beam[0].subbandList = [100..101]
+Observation.Beam[0].tabRingSize = 0.0
+Observation.Beam[0].target = B0329+54
+
+Observation.Beam[1].TiedArrayBeam[0].angle1 = 0.0
+Observation.Beam[1].TiedArrayBeam[0].angle2 = 0.0
+Observation.Beam[1].TiedArrayBeam[0].coherent = true
+Observation.Beam[1].TiedArrayBeam[0].directionType = J2000
+Observation.Beam[1].TiedArrayBeam[0].dispersionMeasure = 0
+Observation.Beam[1].TiedArrayBeam[0].specificationType = manual
+Observation.Beam[1].TiedArrayBeam[0].stationList = []
+Observation.Beam[1].TiedArrayBeam[1].angle1 = 0.8293449206762021
+Observation.Beam[1].TiedArrayBeam[1].angle2 = 0.8525764650544495
+Observation.Beam[1].TiedArrayBeam[1].coherent = false
+Observation.Beam[1].TiedArrayBeam[1].directionType = J2000
+Observation.Beam[1].TiedArrayBeam[1].dispersionMeasure = 0
+Observation.Beam[1].TiedArrayBeam[1].specificationType = manual
+Observation.Beam[1].TiedArrayBeam[1].stationList = []
+Observation.Beam[1].angle1 = 0.8293449206762021
+Observation.Beam[1].angle2 = 0.8525764650544495
+Observation.Beam[1].beamletList = []
+Observation.Beam[1].directionType = J2000
+Observation.Beam[1].duration = 900
+Observation.Beam[1].maximizeDuration = false
+Observation.Beam[1].momID = 88
+Observation.Beam[1].nrTabRings = 0
+Observation.Beam[1].nrTiedArrayBeams = 2
+Observation.Beam[1].startTime =
+Observation.Beam[1].subbandList = [200..201]
+Observation.Beam[1].tabRingSize = 0.0
+Observation.Beam[1].target = "-0.1 test offset from Beam0 (B0329+54)"
+
+Observation.AnaBeam.angle1 = 0.9293449206762021
+Observation.AnaBeam.angle2 = 0.9525764650544495
+Observation.AnaBeam.directionType = J2000
+Observation.AnaBeam.duration = 900
+Observation.AnaBeam.maximizeDuration = false
+Observation.AnaBeam.rank = 1
+Observation.AnaBeam.startTime =
+Observation.AnaBeam.target = B0329+54
+
+Cobalt.blockSize=196608
+Observation.VirtualInstrument.stationList = [CS002, CS501]
+
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.delay.X  =   6.875965e-06
+PIC.Core.CS002HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   6.876319e-06
+PIC.Core.CS002HBA0.RSP.ports=[file:/localhome/lofar/test_sets/3sec/raw-b1919-hba-CS002HBA0-0.udp]
+PIC.Core.CS002HBA0.phaseCenter=[3826600.961, 460953.402, 5064881.136]
+
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.phase0.X =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.phase0.Y =   0.000000e+00
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.delay.X  =   1.649378e-05
+PIC.Core.CS501HBA0.HBA_ZERO.HBA_110_190.delay.Y  =   1.649378e-05
+PIC.Core.CS501HBA0.RSP.ports=[file:/localhome/lofar/test_sets/3sec/raw-b1919-hba-CS501HBA0-0.udp]
+PIC.Core.CS501HBA0.phaseCenter=[3825568.820, 460647.620, 5065683.028]
+
+Observation.Dataslots.CS002HBA0.DataslotList=[0..19]
+Observation.Dataslots.CS002HBA0.RSPBoardList=[20*0]
+Observation.Dataslots.CS501HBA0.DataslotList=[0..19]
+Observation.Dataslots.CS501HBA0.RSPBoardList=[20*0]
+
+Cobalt.Correlator.nrChannelsPerSubband = 64
+Cobalt.Correlator.nrBlocksPerIntegration = 1
+Cobalt.Correlator.nrIntegrationsPerBlock = 1
+
+Cobalt.BeamFormer.flysEye = false
+Cobalt.BeamFormer.nrDelayCompensationChannels = 256
+Cobalt.BeamFormer.nrHighResolutionChannels = 256
+
+Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband = 1
+Cobalt.BeamFormer.CoherentStokes.subbandsPerFile = 20
+Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor = 2
+Cobalt.BeamFormer.CoherentStokes.which = I
+Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband = 16
+Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile = 512
+Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor = 4
+Cobalt.BeamFormer.IncoherentStokes.which = IQUV
+
+Observation.DataProducts.Output_Correlated.enabled = false
+Observation.DataProducts.Output_CoherentStokes.enabled = false
+Observation.DataProducts.Output_IncoherentStokes.enabled = false
+
+Observation.DataProducts.Output_RSPRaw.enabled = true
+Observation.DataProducts.Output_RSPRaw.filenames = [L102030_CS002HBA0_0_rsp.raw, L102030_CS501HBA0_0_rsp.raw]
+Observation.DataProducts.Output_RSPRaw.locations = [2*localhost:.]  # NOTE: .run file from test program overrides this value
+
+Observation.Campaign.name="BLA_000"
+Observation.Campaign.title="BLA: the unsearch for Binary Large Asteroids"
+Observation.Campaign.PI="Maze, Dr. Twisted"
+Observation.Campaign.CO_I="Mace, Dr. Peninsula"
+Observation.Campaign.contact="Maze, Dr. Twisted"
+
diff --git a/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.run b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.run
new file mode 100755
index 0000000000000000000000000000000000000000..a7bd4043c0711ab3af7128d2f8a781484c4c5d5a
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.run
@@ -0,0 +1,8 @@
+#!/bin/bash
+TESTNAME=`basename "${0%%.run}"`
+
+# Replace output keys in parset (for now append; TODO: replace)
+echo "Observation.DataProducts.Output_RSPRaw.locations="\
+     "[2*localhost:${PWD}/${TESTNAME}.output]" >> ${TESTNAME}.parset
+
+../runtest.sh "$TESTNAME"
diff --git a/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.sh b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.sh
new file mode 100755
index 0000000000000000000000000000000000000000..77618c6ec665142df5f97632d1b7d2424b5a3070
--- /dev/null
+++ b/SubSystems/Online_Cobalt/test/RSPRaw/tRSPRaw.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+./runctest.sh $(basename "${0%%.sh}")
diff --git a/SubSystems/Online_Cobalt/test/runtest.sh.in b/SubSystems/Online_Cobalt/test/runtest.sh.in
index 04e5845e1ae4447d6dc566597ae5dedfda074c17..bd8240e750ac37b788afba28cc0fb3d6cd279570 100755
--- a/SubSystems/Online_Cobalt/test/runtest.sh.in
+++ b/SubSystems/Online_Cobalt/test/runtest.sh.in
@@ -60,6 +60,13 @@ echo "  in directory $(pwd)"
     done
   done
 
+  # Run custom output validation script if any
+  CUSTOM_CHECK_SCRIPT="${srcdir}/${TESTNAME}-check-output.sh"
+  if [ -x "$CUSTOM_CHECK_SCRIPT" ]; then
+    echo "running custom output validation script: $CUSTOM_CHECK_SCRIPT $PWD"
+    "$CUSTOM_CHECK_SCRIPT" "$PWD" || error "custom output validation script failed!"
+  fi
+
   if have_qpid; then
     # validate the contents of the queues
     mkdir "queues" || error "Failed to create temporary directory ${OUTDIR}/queues"