diff --git a/RTCP/Cobalt/GPUProc/src/BandPass.cc b/RTCP/Cobalt/GPUProc/src/BandPass.cc
index db79484649a4601b36aa49634c27c77d83265bfa..c42e4b749839c35d10607786ed4c3b099f102f1f 100644
--- a/RTCP/Cobalt/GPUProc/src/BandPass.cc
+++ b/RTCP/Cobalt/GPUProc/src/BandPass.cc
@@ -2130,7 +2130,7 @@ namespace LOFAR
       const std::complex<float> l = out[(i - 3 * nrChannels / 2) % fftSize];
       const std::complex<float> r = out[i + nrChannels / 2];
 
-      factors[i] = pow(2, 25) / sqrt(abs(m * m + l * l + r * r));
+      factors[i] = std::pow(2, 25) / std::sqrt(std::abs(m * m + l * l + r * r));
     }
   }
 
@@ -2140,11 +2140,12 @@ namespace LOFAR
 } // namespace LOFAR
 
 
-#if 0
+#ifdef TEST_COMPUTE_BANDPASS_CORRECTION_FACTORS
 int main()
 {
-  std::vector<float> factors(4096);
-  BandPass::computeCorrectionFactors(&factors[0], 4096);
+  unsigned nrChannelsPerSb = 4096;
+  std::vector<float> factors(nrChannelsPerSb);
+  BandPass::computeCorrectionFactors(&factors[0], nrChannelsPerSb);
   return 0;
 }
 #endif
diff --git a/RTCP/Cobalt/GPUProc/src/FilterBank.h b/RTCP/Cobalt/GPUProc/src/FilterBank.h
index 4e9b057b21914259771c0dfe08e6f06673bc9a7c..b4f186ff8632e041a5f829ce09f69febd40c5627 100644
--- a/RTCP/Cobalt/GPUProc/src/FilterBank.h
+++ b/RTCP/Cobalt/GPUProc/src/FilterBank.h
@@ -23,10 +23,6 @@
 
 #define USE_ORIGINAL_FILTER 0
 
-#if 0 || !defined HAVE_BGP
-#define FIR_C_IMPLEMENTATION
-#endif
-
 #include <boost/multi_array.hpp>
 
 namespace LOFAR
diff --git a/RTCP/Cobalt/GPUProc/src/Buffers.h b/RTCP/Cobalt/GPUProc/src/MultiDimArrayHostBuffer.h
similarity index 80%
rename from RTCP/Cobalt/GPUProc/src/Buffers.h
rename to RTCP/Cobalt/GPUProc/src/MultiDimArrayHostBuffer.h
index 315e490f93b87995d792252f46854bf4fa9b915e..dee99d41fa592fd1935f4e8bbe3cfb00db80ca51 100644
--- a/RTCP/Cobalt/GPUProc/src/Buffers.h
+++ b/RTCP/Cobalt/GPUProc/src/MultiDimArrayHostBuffer.h
@@ -1,4 +1,4 @@
-//# Buffers.h
+//# MultiDimArrayHostBuffer.h
 //#
 //# Copyright (C) 2013  ASTRON (Netherlands Institute for Radio Astronomy)
 //# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands
@@ -20,19 +20,19 @@
 //# $Id$
 
 // \file
-// Support for our GPU processing buffer types.
+// Support for our multi-dim array-ed GPU host buffer.
 
-#ifndef LOFAR_GPUPROC_BUFFERS_H
-#define LOFAR_GPUPROC_BUFFERS_H
+#ifndef LOFAR_GPUPROC_MULTI_DIM_ARRAY_HOST_BUFFER_H
+#define LOFAR_GPUPROC_MULTI_DIM_ARRAY_HOST_BUFFER_H
 
 #if defined (USE_CUDA) && defined (USE_OPENCL)
 # error "Either CUDA or OpenCL must be enabled, not both"
 #endif
 
 #if defined (USE_CUDA)
-# include "cuda/Buffers.h"
+# include "cuda/MultiDimArrayHostBuffer.h"
 #elif defined (USE_OPENCL)
-# include "opencl/Buffers.h"
+# include "opencl/MultiDimArrayHostBuffer.h"
 #else
 # error "Either CUDA or OpenCL must be enabled, not neither"
 #endif
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/MultiDimArrayHostBuffer.h b/RTCP/Cobalt/GPUProc/src/cuda/MultiDimArrayHostBuffer.h
new file mode 100644
index 0000000000000000000000000000000000000000..c2fa3409c352bad1072131e58926c2ade9d5db92
--- /dev/null
+++ b/RTCP/Cobalt/GPUProc/src/cuda/MultiDimArrayHostBuffer.h
@@ -0,0 +1,62 @@
+//# MultiDimArrayHostBuffer.h
+//# Copyright (C) 2012-2013  ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+
+#ifndef LOFAR_GPUPROC_CUDA_MULTI_DIM_ARRAY_HOST_BUFFER_H
+#define LOFAR_GPUPROC_CUDA_MULTI_DIM_ARRAY_HOST_BUFFER_H
+
+#include <CoInterface/MultiDimArray.h>
+
+#include "gpu_wrapper.h"
+
+namespace LOFAR
+{
+  namespace Cobalt
+  {
+
+    // A MultiDimArray allocated as a HostBuffer
+    // Note: Elements are not constructed/destructed.
+    template <typename T, unsigned DIM>
+    class MultiDimArrayHostBuffer : public gpu::HostMemory,
+                                    public MultiDimArray<T, DIM>
+    {
+    public:
+      template <typename ExtentList>
+      MultiDimArrayHostBuffer(const ExtentList &extents, gpu::Context &context,
+                              unsigned int flags)
+      :
+        HostMemory(context, size(), flags),
+        MultiDimArray<T, DIM>(extents, gpu::HostMemory::get<T>(), false)
+      {
+      }
+
+      using HostMemory::size;
+
+    private:
+      MultiDimArrayHostBuffer(); // don't use
+      MultiDimArrayHostBuffer(const MultiDimArrayHostBuffer<T, DIM> &rhs); // don't use
+      MultiDimArrayHostBuffer<T, DIM> &operator=(const MultiDimArrayHostBuffer<T, DIM> &rhs); // don't use
+      using MultiDimArray<T, DIM>::resize; // don't use
+    };
+
+  } // namespace Cobalt
+} // namespace LOFAR
+
+#endif
+
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/Pipelines/Pipeline.cc b/RTCP/Cobalt/GPUProc/src/cuda/Pipelines/Pipeline.cc
index 0a6d1bfe490c962762f62695fc7e7c41833f69cf..5065e76f42115df0479ec59ddc9caa8f7132e3d7 100644
--- a/RTCP/Cobalt/GPUProc/src/cuda/Pipelines/Pipeline.cc
+++ b/RTCP/Cobalt/GPUProc/src/cuda/Pipelines/Pipeline.cc
@@ -25,7 +25,6 @@
 #include <Common/LofarLogger.h>
 #include <Common/lofar_iomanip.h>
 
-#include <GPUProc/Buffers.h>
 #include <GPUProc/gpu_utils.h>
 
 namespace LOFAR
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/BeamFormerWorkQueue.h b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/BeamFormerWorkQueue.h
index cc8d02bc4b0ee491d188f9102d90fc494b2a0544..8f117daac2bf1762b9de0df582b98b855b904bb7 100644
--- a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/BeamFormerWorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/BeamFormerWorkQueue.h
@@ -26,7 +26,7 @@
 #include <Common/LofarLogger.h>
 #include <CoInterface/Parset.h>
 
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/BandPass.h>
 #include <GPUProc/Pipelines/BeamFormerPipeline.h>
 
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.cc b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.cc
index 9aee86578bbfed8a3e849c7be6719e84254350f2..4f217501aa56bb2634f1e70af0b87f32b998a753 100644
--- a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.cc
+++ b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.cc
@@ -55,65 +55,40 @@ namespace LOFAR
       WorkQueue( parset, context ),
       prevBlock(-1),
       prevSAP(-1),
-      devInput(ps.nrBeams(),
-                ps.nrStations(),
-                NR_POLARIZATIONS,
-                ps.nrHistorySamples() + ps.nrSamplesPerSubband(),
-                ps.nrBytesPerComplexSample(),
-                queue,
-
-                // reserve enough space in inputSamples for the output of
-                // the delayAndBandPassKernel.
-                ps.nrStations() * NR_POLARIZATIONS * ps.nrSamplesPerSubband() * sizeof(std::complex<float>)),
-      devFilteredData(queue,
-                      CL_MEM_READ_WRITE,
-
-                      // reserve enough space for the output of the
-                      // firFilterKernel,
-                      std::max(ps.nrStations() * NR_POLARIZATIONS * ps.nrSamplesPerSubband() * sizeof(std::complex<float>),
-                      // and the correlatorKernel.
-                      ps.nrBaselines() * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>))),
-      devFIRweights(queue,
-                    CL_MEM_READ_ONLY,
-                    ps.nrChannelsPerSubband() * NR_TAPS * sizeof(float)),
-      firFilterKernel(ps,
-                      queue,
-                      programs.firFilterProgram,
-                      devFilteredData,
-                      devInput.inputSamples,
-                      devFIRweights),
-      fftKernel(ps,
-                context,
-                devFilteredData),
-      bandPassCorrectionWeights(boost::extents[ps.nrChannelsPerSubband()],
-                                queue,
-                                CL_MEM_WRITE_ONLY,
-                                CL_MEM_READ_ONLY),
-      delayAndBandPassKernel(ps,
-                             programs.delayAndBandPassProgram,
+      // TODO: have the Kernel classes be able to provide input and output buffer sizes to use below
+      devInput(ps.nrBeams(), ps.nrStations(), NR_POLARIZATIONS,
+               ps.nrHistorySamples() + ps.nrSamplesPerSubband(),
+               ps.nrBytesPerComplexSample(), context,
+
+               // reserve enough space in inputSamples for the output of the delayAndBandPassKernel.
+               ps.nrStations() * NR_POLARIZATIONS * ps.nrSamplesPerSubband() * sizeof(std::complex<float>)),
+      // reserve enough space for the output of the firFilterKernel,
+      devFilteredData(context, std::max(
+                        ps.nrStations() * NR_POLARIZATIONS * ps.nrSamplesPerSubband() * sizeof(std::complex<float>),
+                        // and the correlatorKernel.
+                        ps.nrBaselines() * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>)
+                      )),
+      devFIRweights(context, ps.nrChannelsPerSubband() * NR_TAPS * sizeof(float)),
+      devBandPassCorrectionWeights(context, ps.nrChannelsPerSubband() * sizeof(float)),
+
+      firFilterKernel(ps, queue, programs.firFilterProgram,
+                      devFilteredData, devInput.inputSamples, devFIRweights),
+      fftKernel(ps, context, devFilteredData),
+      delayAndBandPassKernel(ps, programs.delayAndBandPassProgram,
                              devInput.inputSamples,
                              devFilteredData,
                              devInput.delaysAtBegin,
                              devInput.delaysAfterEnd,
                              devInput.phaseOffsets,
-                             bandPassCorrectionWeights),
+                             devBandPassCorrectionWeights),
 #if defined USE_NEW_CORRELATOR
-      correlateTriangleKernel(ps,
-                              queue,
-                              programs.correlatorProgram,
-                              devFilteredData,
-                              devInput.inputSamples),
-      correlateRectangleKernel(ps,
-                              queue,
-                              programs.correlatorProgram, 
-                              devFilteredData, 
-                              devInput.inputSamples)
+      correlateTriangleKernel(ps, queue, programs.correlatorProgram,
+                              devFilteredData, devInput.inputSamples),
+      correlateRectangleKernel(ps, queue, programs.correlatorProgram, 
+                              devFilteredData, devInput.inputSamples)
 #else
-      correlatorKernel(ps,
-                       queue, 
-                       programs.correlatorProgram, 
-                       devFilteredData, 
-                       devInput.inputSamples)
+      correlatorKernel(ps, queue, programs.correlatorProgram, 
+                              devFilteredData, devInput.inputSamples)
 #endif
     {
       // put enough objects in the inputPool to operate
@@ -141,7 +116,6 @@ namespace LOFAR
                 ps.nrStations(),
                 ps.nrChannelsPerSubband(),
                 ps.integrationSteps(),
-                devFilteredData,
                 *this));
       }
 
@@ -172,16 +146,21 @@ namespace LOFAR
       addTimer("GPU - compute");
       addTimer("GPU - wait");
 
-      // Copy the FIR filter weights to the device in two steps (TODO: make FilterBank supply the right buffer, or do like BandPassCorrectionWeights below)
-      size_t fbBytes = filterBank.getWeights().num_elements() * sizeof(float);
-      gpu::HostMemory fbBuffer(context, fbBytes);
-      std::memcpy(fbBuffer.get<void>(), filterBank.getWeights().origin(), fbBytes);
-      queue.writeBuffer(devFIRweights, fbBuffer, true);
+      // Copy the FIR filter and bandpass weights to the device.
+      // Note that these constant weights are now (unnecessarily) stored on the
+      // device for every workqueue. A single copy per device could be used, but
+      // first verify that the device platform still allows workqueue overlap.
+      size_t firWeightsSize = filterBank.getWeights().num_elements() * sizeof(float);
+      gpu::HostMemory firWeights(context, firWeightsSize);
+      std::memcpy(firWeights.get<void>(), filterBank.getWeights().origin(), fbBytes);
+      queue.writeBuffer(devFIRweights, firWeights, true);
 
       if (ps.correctBandPass())
       {
-        BandPass::computeCorrectionFactors(bandPassCorrectionWeights.origin(), ps.nrChannelsPerSubband());
-        bandPassCorrectionWeights.hostToDevice(true);
+        gpu::HostMemory bpWeights(context, ps.nrChannelsPerSubband() * sizeof(float));
+        BandPass::computeCorrectionFactors(bpWeights.origin(),
+                                           ps.nrChannelsPerSubband());
+        queue.writeBuffer(devBandPassCorrectionWeights, bpWeights, true);
       }
     }
 
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.h b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.h
index b7c9b54b1917804b8519219227f8488019986180..af86ee52a3916239135529d5ae6dae36cb59d241 100644
--- a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/CorrelatorWorkQueue.h
@@ -33,7 +33,7 @@
 #include <CoInterface/SubbandMetaData.h>
 
 #include <GPUProc/global_defines.h>
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/FilterBank.h>
 #include <GPUProc/Pipelines/CorrelatorPipelinePrograms.h>
 #include <GPUProc/Kernels/FIR_FilterKernel.h>
@@ -99,24 +99,29 @@ namespace LOFAR
     };
 
     // A CorrelatedData object tied to a HostBuffer and WorkQueue. Such links
-    // are needed for performance -- the visibilities are stored in a buffer
-    // directly linked to the GPU output buffer.
-    class CorrelatedDataHostBuffer: public MultiArrayHostBuffer<fcomplex, 4>, public CorrelatedData
+    // After the visibilities have been written to storage, we need remember
+    // the queue to recycle the buffer.
+    class CorrelatedDataHostBuffer: public CorrelatedData,
+                                    public MultiDimArrayHostBuffer<fcomplex, 4>
     {
     public:
-      CorrelatedDataHostBuffer(unsigned nrStations, unsigned nrChannels, unsigned maxNrValidSamples, DeviceBuffer &deviceBuffer, CorrelatorWorkQueue &queue) 
+      CorrelatedDataHostBuffer(unsigned nrStations, unsigned nrChannels,
+                               unsigned maxNrValidSamples, CorrelatorWorkQueue &workQueue)
       :
-        MultiArrayHostBuffer<fcomplex, 4>(boost::extents[nrStations * (nrStations + 1) / 2][nrChannels][NR_POLARIZATIONS][NR_POLARIZATIONS], CL_MEM_WRITE_ONLY, deviceBuffer),
-        CorrelatedData(nrStations, nrChannels, maxNrValidSamples, this->origin(), this->num_elements(), heapAllocator, 1),
-        queue(queue)
+        CorrelatedData(nrStations, nrChannels, maxNrValidSamples, this->origin(),
+                       this->num_elements(), heapAllocator, 1),
+        MultiDimArrayHostBuffer<fcomplex, 4>(boost::extents[nrStations * (nrStations + 1) / 2]
+                                                           [nrChannels][NR_POLARIZATIONS]
+                                                           [NR_POLARIZATIONS], 0),
+        workQueue(workQueue)
       {
       }
 
-      // Annotation required, as we'll loose track of the exact order
+      // Annotation required, as we'll lose track of the exact order
       size_t block;
       unsigned subband;
 
-      CorrelatorWorkQueue &queue;
+      CorrelatorWorkQueue &workQueue;
 
     private:
       CorrelatedDataHostBuffer();
@@ -134,24 +139,26 @@ namespace LOFAR
     {
     public:
 
-      // The set of GPU buffers to link our HostBuffers to.
+      // The set of GPU buffers to link our host buffers to.
+      // Device buffers may be reused between different pairs of kernels,
+      // since device memory size is a concern. Use inputSamplesMinSize
+      // to specify a minimum derived from other uses apart from input.
       struct DeviceBuffers
       {
-        DeviceBuffer delaysAtBegin;
-        DeviceBuffer delaysAfterEnd;
-        DeviceBuffer phaseOffsets;
-        DeviceBuffer inputSamples;
+        gpu::DeviceMemory delaysAtBegin;
+        gpu::DeviceMemory delaysAfterEnd;
+        gpu::DeviceMemory phaseOffsets;
+        gpu::DeviceMemory inputSamples;
 
         DeviceBuffers(size_t n_beams, size_t n_stations, size_t n_polarizations,
-                         size_t n_samples, size_t bytes_per_complex_sample,
-                         gpu::Stream &queue,
-                         size_t inputSamplesMinSize = 0,
-                         cl_mem_flags deviceBufferFlags = CL_MEM_READ_ONLY)
+                      size_t n_samples, size_t bytes_per_complex_sample,
+                      gpu::Context &context, size_t inputSamplesMinSize = 0)
         :
-          delaysAtBegin(queue, deviceBufferFlags, n_beams * n_stations * n_polarizations * sizeof(float)),
-          delaysAfterEnd(queue, deviceBufferFlags, n_beams * n_stations * n_polarizations * sizeof(float)),
-          phaseOffsets(queue, deviceBufferFlags, n_stations * n_polarizations * sizeof(float)),
-          inputSamples(queue, CL_MEM_READ_WRITE, std::max(inputSamplesMinSize, n_stations * n_samples * n_polarizations * bytes_per_complex_sample))
+          delaysAtBegin (context, n_beams * n_stations * n_polarizations * sizeof(float)),
+          delaysAfterEnd(context, n_beams * n_stations * n_polarizations * sizeof(float)),
+          phaseOffsets  (context,           n_stations * n_polarizations * sizeof(float)),
+          inputSamples  (context, std::max(inputSamplesMinSize,
+                                n_samples * n_stations * n_polarizations * bytes_per_complex_sample))
         {
         }
       };
@@ -162,26 +169,30 @@ namespace LOFAR
       // Relevant subband
       unsigned subband;
 
-      MultiArrayHostBuffer<float, 3> delaysAtBegin; //!< Whole sample delays at the start of the workitem      
-      MultiArrayHostBuffer<float, 3> delaysAfterEnd;//!< Whole sample delays at the end of the workitem      
-      MultiArrayHostBuffer<float, 2> phaseOffsets;  //!< Remainder of delays
+      //!< Whole sample delays at the start of the workitem      
+      MultiDimArrayHostBuffer<float, 3> delaysAtBegin;
+
+      //!< Whole sample delays at the end of the workitem      
+      MultiDimArrayHostBuffer<float, 3> delaysAfterEnd;
+
+      //!< Remainder of delays
+      MultiDimArrayHostBuffer<float, 2> phaseOffsets;
 
       // inputdata with flagged data set to zero
-      MultiArrayHostBuffer<char, 4> inputSamples;
+      MultiDimArrayHostBuffer<char, 4> inputSamples;
 
       // The input flags
-      MultiDimArray<SparseSet<unsigned>,1> inputFlags;
+      MultiDimArray<SparseSet<unsigned>, 1> inputFlags;
 
       // Create the inputData object we need shared host/device memory on the supplied devicequeue
       WorkQueueInputData(size_t n_beams, size_t n_stations, size_t n_polarizations,
                          size_t n_samples, size_t bytes_per_complex_sample,
-                         DeviceBuffers &deviceBuffers,
-                         cl_mem_flags hostBufferFlags = CL_MEM_WRITE_ONLY)
+                         unsigned int hostBufferFlags = 0)
         :
-        delaysAtBegin(boost::extents[n_beams][n_stations][n_polarizations], hostBufferFlags, deviceBuffers.delaysAtBegin),
-        delaysAfterEnd(boost::extents[n_beams][n_stations][n_polarizations], hostBufferFlags, deviceBuffers.delaysAfterEnd),
-        phaseOffsets(boost::extents[n_stations][n_polarizations], hostBufferFlags, deviceBuffers.phaseOffsets),
-        inputSamples(boost::extents[n_stations][n_samples][n_polarizations][bytes_per_complex_sample], hostBufferFlags, deviceBuffers.inputSamples), // TODO: The size of the buffer is NOT validated
+        delaysAtBegin(boost::extents[n_beams][n_stations][n_polarizations], hostBufferFlags),
+        delaysAfterEnd(boost::extents[n_beams][n_stations][n_polarizations], hostBufferFlags),
+        phaseOffsets(boost::extents[n_stations][n_polarizations], hostBufferFlags),
+        inputSamples(boost::extents[n_stations][n_samples][n_polarizations][bytes_per_complex_sample], hostBufferFlags), // TODO: The size of the buffer is NOT validated
         inputFlags(boost::extents[n_stations])
       {
       }
@@ -251,7 +262,7 @@ namespace LOFAR
       // in the InputData class
       WorkQueueInputData::DeviceBuffers devInput;
 
-      DeviceBuffer devFilteredData;
+      gpu::DeviceMemory devFilteredData;
 
     public:
       // A pool of input data, to allow items to be filled and
@@ -263,11 +274,13 @@ namespace LOFAR
       Pool<CorrelatedDataHostBuffer> outputPool;
 
     private:
+      // Constant input buffers for the kernels
+      gpu::DeviceMemory devFIRweights;
+      gpu::DeviceMemory devBandPassCorrectionWeights;
+
       // Compiled kernels
-      DeviceBuffer devFIRweights;
       FIR_FilterKernel firFilterKernel;
       Filter_FFT_Kernel fftKernel;
-      MultiArraySharedBuffer<float, 1> bandPassCorrectionWeights;
       DelayAndBandPassKernel delayAndBandPassKernel;
 #if defined USE_NEW_CORRELATOR
       CorrelateTriangleKernel correlateTriangleKernel;
diff --git a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/UHEP_WorkQueue.h b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/UHEP_WorkQueue.h
index ec9e95809d20b4dec24c5284685108d585716708..2abeb81523d9d4cb3e3cd8cbe657f8c804cfe59c 100644
--- a/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/UHEP_WorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/cuda/WorkQueues/UHEP_WorkQueue.h
@@ -27,7 +27,7 @@
 #include <CoInterface/Parset.h>
 
 #include <GPUProc/global_defines.h>
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/Pipelines/UHEP_Pipeline.h>
 #include <GPUProc/Kernels/UHEP_TriggerKernel.h>
 #include "WorkQueue.h"
diff --git a/RTCP/Cobalt/GPUProc/src/opencl/Buffers.h b/RTCP/Cobalt/GPUProc/src/opencl/MultiDimArrayHostBuffer.h
similarity index 97%
rename from RTCP/Cobalt/GPUProc/src/opencl/Buffers.h
rename to RTCP/Cobalt/GPUProc/src/opencl/MultiDimArrayHostBuffer.h
index 191340906aca1703a2da81d66b71c99fc362a7b7..41d48185c8c925545bc37f86a8588ebb1e39a2a7 100644
--- a/RTCP/Cobalt/GPUProc/src/opencl/Buffers.h
+++ b/RTCP/Cobalt/GPUProc/src/opencl/MultiDimArrayHostBuffer.h
@@ -1,4 +1,4 @@
-//# Buffers.h
+//# MultiDimArrayHostBuffer.h
 //# Copyright (C) 2012-2013  ASTRON (Netherlands Institute for Radio Astronomy)
 //# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands
 //#
@@ -18,8 +18,8 @@
 //#
 //# $Id$
 
-#ifndef LOFAR_GPUPROC_OPENCL_BUFFERS_H
-#define LOFAR_GPUPROC_OPENCL_BUFFERS_H
+#ifndef LOFAR_GPUPROC_OPENCL_MULTI_DIM_ARRAY_HOST_BUFFER_H
+#define LOFAR_GPUPROC_OPENCL_MULTI_DIM_ARRAY_HOST_BUFFER_H
 
 #include <CoInterface/Allocator.h>
 #include <CoInterface/MultiDimArray.h>
diff --git a/RTCP/Cobalt/GPUProc/src/opencl/Pipelines/Pipeline.cc b/RTCP/Cobalt/GPUProc/src/opencl/Pipelines/Pipeline.cc
index 376287aed298182e133e36dac843f08d8accbcda..dadb9d7483d773eeb14b737f2929fed4986f100b 100644
--- a/RTCP/Cobalt/GPUProc/src/opencl/Pipelines/Pipeline.cc
+++ b/RTCP/Cobalt/GPUProc/src/opencl/Pipelines/Pipeline.cc
@@ -27,11 +27,6 @@
 
 #include <GPUProc/gpu_utils.h>
 
-#if 0
-#include <boost/format.hpp>
-using boost::format;
-#endif
-
 namespace LOFAR
 {
   namespace Cobalt
diff --git a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/BeamFormerWorkQueue.h b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/BeamFormerWorkQueue.h
index 6c07062aea962d90e9a0daff5922d2a57c23c9a1..aa0dbe0a5aea43288b74105e090c8274dc85c5e4 100644
--- a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/BeamFormerWorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/BeamFormerWorkQueue.h
@@ -26,7 +26,7 @@
 #include <Common/LofarLogger.h>
 #include <CoInterface/Parset.h>
 
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/BandPass.h>
 #include <GPUProc/Pipelines/BeamFormerPipeline.h>
 
diff --git a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/CorrelatorWorkQueue.h b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/CorrelatorWorkQueue.h
index d034bf4ebf96615eb7aefa67c2097b5ff43e64ff..3c507d4ec5c2c4491b79f1dbf05d28f46a922a4f 100644
--- a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/CorrelatorWorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/CorrelatorWorkQueue.h
@@ -33,7 +33,7 @@
 #include <CoInterface/SubbandMetaData.h>
 
 #include <GPUProc/global_defines.h>
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/FilterBank.h>
 #include <GPUProc/Pipelines/CorrelatorPipelinePrograms.h>
 #include <GPUProc/Kernels/FIR_FilterKernel.h>
diff --git a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/UHEP_WorkQueue.h b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/UHEP_WorkQueue.h
index 11298670e2ca8fa9412ad213371b8fe56759d5be..46c00cde1c39654972112b9f212b2d8ee45492df 100644
--- a/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/UHEP_WorkQueue.h
+++ b/RTCP/Cobalt/GPUProc/src/opencl/WorkQueues/UHEP_WorkQueue.h
@@ -27,7 +27,7 @@
 #include <CoInterface/Parset.h>
 
 #include <GPUProc/global_defines.h>
-#include <GPUProc/Buffers.h>
+#include <GPUProc/MultiDimArrayHostBuffer.h>
 #include <GPUProc/Pipelines/UHEP_Pipeline.h>
 #include <GPUProc/Kernels/UHEP_TriggerKernel.h>
 #include "WorkQueue.h"