diff --git a/psrdada_cpp/effelsberg/edd/detail/GatedSpectrometer.cu b/psrdada_cpp/effelsberg/edd/detail/GatedSpectrometer.cu
index 5e7ca6725e9be10ec49b242d9c9ceb15a70e8d2b..1540b1af76d01c62e7197f11be9603f357a876c2 100644
--- a/psrdada_cpp/effelsberg/edd/detail/GatedSpectrometer.cu
+++ b/psrdada_cpp/effelsberg/edd/detail/GatedSpectrometer.cu
@@ -371,16 +371,16 @@ void GatedSpectrometer<HandlerType, InputType, OutputType>::process(SinglePolari
             thrust::raw_pointer_cast(inputDataStream->_channelised_voltage_G0.data()),
             thrust::raw_pointer_cast(outputDataStream->G0.data.a().data()),
             _nchans,
-            inputDataStream->_channelised_voltage_G0.size() / _nchans,
-            _naccumulate / _nBlocks,
+            inputDataStream->_channelised_voltage_G0.size(),
+            _naccumulate,
             1, 0., 1, 0);
 
   kernels::detect_and_accumulate<IntegratedPowerType> <<<1024, 1024, 0, _proc_stream>>>(
             thrust::raw_pointer_cast(inputDataStream->_channelised_voltage_G1.data()),
             thrust::raw_pointer_cast(outputDataStream->G1.data.a().data()),
             _nchans,
-            inputDataStream->_channelised_voltage_G1.size() / _nchans,
-            _naccumulate / _nBlocks,
+            inputDataStream->_channelised_voltage_G1.size(),
+            _naccumulate,
             1, 0., 1, 0);
 
     // count saturated samples
diff --git a/psrdada_cpp/effelsberg/edd/src/GatedSpectrometer.cu b/psrdada_cpp/effelsberg/edd/src/GatedSpectrometer.cu
index 663654d28f438ebd7e6c5970a2e96a9b3e3ba8eb..ffe99b65845121d02567a25629fb18a0d53c2feb 100644
--- a/psrdada_cpp/effelsberg/edd/src/GatedSpectrometer.cu
+++ b/psrdada_cpp/effelsberg/edd/src/GatedSpectrometer.cu
@@ -380,7 +380,13 @@ void GatedPowerSpectrumOutput::swap(cudaStream_t &_proc_stream)
 void GatedPowerSpectrumOutput::data2Host(cudaStream_t &_d2h_stream)
 {
     BOOST_LOG_TRIVIAL(debug) << "Copying data2Host for " << G0._noOfBitSets.size() << " blocks.";
-  //CUDA_ERROR_CHECK(cudaStreamSynchronize(_d2h_stream));
+
+    // memory layout of output block
+    // --------------------------------------------------------------------------------------------
+    // | spectrum ND0 | spectrum ND1 | Nsamples ND0 | Noverflow ND0 |Nsamples ND1 | Noverflow ND1 |
+    // | spectrum ND0 | spectrum ND1 | Nsamples ND0 | Noverflow ND0 |Nsamples ND1 | Noverflow ND1 |
+    // | ...                                                                                      |
+    // --------------------------------------------------------------------------------------------
 
   for (size_t i = 0; i < G0._noOfBitSets.size(); i++)
   {
diff --git a/psrdada_cpp/effelsberg/edd/test/src/GatedSpectrometerTest.cu b/psrdada_cpp/effelsberg/edd/test/src/GatedSpectrometerTest.cu
index db68c4ece82b084c51dc55c16f1cba7ab18268e9..26f658574e582614eff39effd76049b3a853d469 100644
--- a/psrdada_cpp/effelsberg/edd/test/src/GatedSpectrometerTest.cu
+++ b/psrdada_cpp/effelsberg/edd/test/src/GatedSpectrometerTest.cu
@@ -496,10 +496,72 @@ TEST_P(ExecutionTests, SinglePolOutput)
     // Test buffer consistency with input parameters
     EXPECT_EQ(bufferLayout.getNHeaps(), params.nHeaps);
 
-    psrdada_cpp::NullSink sink;
+    struct output_pointer
+    {
+        float* spectrum;
+        size_t* nbitsset;
+        size_t* nsaturated;
+        output_pointer(psrdada_cpp::RawBytes& block, size_t _nchans, size_t ND, size_t offset)
+        {
+            size_t specsize = _nchans * sizeof(float);
+            size_t memoffset = 2 * offset * (specsize + 2 * sizeof(size_t));
+
+            spectrum = (float*)static_cast<void *>(block.ptr() + ND * specsize + memoffset);
+            nbitsset = (size_t*)static_cast<void *>(block.ptr() + memoffset + 2 * specsize + ND * 2 * sizeof(size_t));
+            nsaturated =(size_t*)static_cast<void *>(block.ptr() + memoffset + 2 * specsize + ND * 2 * sizeof(size_t) + sizeof(size_t));
+        }
+    };
+
+    class TestSink
+    {
+        size_t _counter;
+        size_t _nchans;
+    public:
+        TestSink(size_t nchans) : _nchans(nchans), _counter(0){};
+        ~TestSink(){};
+        void init(psrdada_cpp::RawBytes&){};
+        bool operator()(psrdada_cpp::RawBytes& block){
+            _counter++;
+            output_pointer ND0(block, _nchans, 0, 0);
+            output_pointer ND1(block, _nchans, 1, 0);
+
+            if (_counter == 1)
+            { // First sepctrum all zeros in ND on and ND off
+                for (size_t i=1; i < _nchans; i++)
+                {
+                    EXPECT_NEAR(ND0.spectrum[i], 0, 1E-10) <<  ", i = " << i;
+                    EXPECT_NEAR(ND1.spectrum[i], 0, 1E-10) <<  ", i = " << i;
+                }
+            }
+            else if (_counter == 2)
+            { // Second spectrum all data in ND1 (and flat)
+
+                for (size_t i=1; i < _nchans; i++)
+                {
+                    EXPECT_GT(ND0.spectrum[i], 1) << i;
+                    EXPECT_NEAR(ND0.spectrum[i], ND0.spectrum[_nchans / 2], 1E-1) << ", i = " << i;
+                    EXPECT_NEAR(ND1.spectrum[i], 0, 1E-10) << i;
+                }
+            }
+            else if (_counter == 3)
+            { // Third spectrum all zeros in ND0
+                for (size_t i=1; i < _nchans; i++)
+                {
+                    EXPECT_NEAR(ND0.spectrum[i], 0, 1E-10) << i;
+                    EXPECT_GT(ND1.spectrum[i], 1) << i;
+                    EXPECT_NEAR(ND1.spectrum[i], ND1.spectrum[_nchans / 2], 1E-1) <<  ", i = " << i;
+                }
+
+            }
+
+            return false;
+        };
+    };
+    TestSink sink(params.fft_length / 2 + 1);
+
 
     psrdada_cpp::effelsberg::edd::GatedSpectrometer<
-        psrdada_cpp::NullSink,
+        TestSink,
         psrdada_cpp::effelsberg::edd::SinglePolarizationInput,
         psrdada_cpp::effelsberg::edd::GatedPowerSpectrumOutput>
             spectrometer(bufferLayout,
@@ -509,15 +571,28 @@ TEST_P(ExecutionTests, SinglePolOutput)
                     sink);
 
     char  *raw_buffer = new char[inputBufferSize];
-    memset(raw_buffer, 0, inputBufferSize);
 
     psrdada_cpp::RawBytes buff(raw_buffer, inputBufferSize, inputBufferSize);
-
     EXPECT_NO_THROW(spectrometer.init(buff)) << params.msg;
-    for (int i = 0; i < 5; i++)
-    {
-        EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
-    }
+    // 1 Block, all zeros
+    memset(raw_buffer, 0, inputBufferSize);
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
+
+    // 2 Block, set value
+    raw_buffer[122] =  int8_t(13);
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
+
+    // 3 Block, set value and SCI
+    raw_buffer[122] =  int8_t(13);
+    uint64_t* sc_items = reinterpret_cast<uint64_t*>(raw_buffer + params.nHeaps * heapSize);
+    for (int i = 0; i < params.nHeaps; i++)
+        SET_BIT(sc_items[i], 0);
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
+
+    // Additional three executions to get blocks out
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
+    EXPECT_NO_THROW(spectrometer(buff)) << params.msg;
 
     delete [] raw_buffer;
 }