diff --git a/gridder_cxx.h b/gridder_cxx.h
index 8ee77b3f8881f79384501d00d9233e5b62630449..9737f41d4b72e28c5086e8a0cee1aac1458a75e8 100644
--- a/gridder_cxx.h
+++ b/gridder_cxx.h
@@ -965,8 +965,8 @@ template<typename T> void get_correlations
   }
 
 
-template<typename T> void apply_wcorr(const GridderConfig<T> &gconf,
-  mav<complex<T>,2> &dirty, const EC_Kernel_with_correction<T> &kernel, double dw)
+template<typename T, typename T2> void apply_wcorr(const GridderConfig<T> &gconf,
+  mav<T2,2> &dirty, const EC_Kernel_with_correction<T> &kernel, double dw)
   {
   auto nx_dirty=gconf.Nxdirty();
   auto ny_dirty=gconf.Nydirty();
@@ -1001,7 +1001,7 @@ template<typename T> void apply_wcorr(const GridderConfig<T> &gconf,
 
 template<typename T> void vis2dirty_wstack(const Baselines<T> &baselines,
   const GridderConfig<T> &gconf, const const_mav<uint32_t,1> &idx,
-  const const_mav<complex<T>,1> &vis, mav<complex<T>,2> &dirty)
+  const const_mav<complex<T>,1> &vis, mav<T,2> &dirty)
   {
   auto nx_dirty=gconf.Nxdirty();
   auto ny_dirty=gconf.Nydirty();
@@ -1086,7 +1086,7 @@ cout << "blip3" << endl;
 cout << "blip4" << endl;
     for (size_t i=0; i<nx_dirty; ++i)
       for (size_t j=0; j<ny_dirty; ++j)
-        dirty(i,j) += tdirty(i,j);
+        dirty(i,j) += tdirty(i,j).real();
     }
   }
   // correct for w gridding
@@ -1097,7 +1097,7 @@ cout << "applying correction for gridding in w direction" << endl;
 
 template<typename T> void dirty2vis_wstack(const Baselines<T> &baselines,
   const GridderConfig<T> &gconf, const const_mav<uint32_t,1> &idx,
-  const const_mav<complex<T>,2> &dirty, mav<complex<T>,1> &vis)
+  const const_mav<T,2> &dirty, mav<complex<T>,1> &vis)
   {
   auto nx_dirty=gconf.Nxdirty();
   auto ny_dirty=gconf.Nydirty();
diff --git a/nifty_gridder.cc b/nifty_gridder.cc
index 38be25ff746e7081cea486ddb29f6a22341b2ab8..295dee8e9d6343120417005701204d74b952f4a3 100644
--- a/nifty_gridder.cc
+++ b/nifty_gridder.cc
@@ -681,7 +681,7 @@ template<typename T> pyarr<uint32_t> getIndices(const PyBaselines<T> &baselines,
   return res;
   }
 
-template<typename T> pyarr<complex<T>> Pyvis2dirty_wstack(const PyBaselines<T> &baselines,
+template<typename T> pyarr<T> Pyvis2dirty_wstack(const PyBaselines<T> &baselines,
   const PyGridderConfig<T> &gconf, const pyarr<uint32_t> &idx_,
   const pyarr<complex<T>> &vis_)
   {
@@ -689,7 +689,7 @@ template<typename T> pyarr<complex<T>> Pyvis2dirty_wstack(const PyBaselines<T> &
   auto ny_dirty=gconf.Nydirty();
   auto idx2=make_const_mav<1>(idx_);
   auto vis2=make_const_mav<1>(vis_);
-  auto dirty = makeArray<complex<T>>({nx_dirty, ny_dirty});
+  auto dirty = makeArray<T>({nx_dirty, ny_dirty});
   auto dirty2=make_mav<2>(dirty);
   {
   py::gil_scoped_release release;
@@ -700,7 +700,7 @@ template<typename T> pyarr<complex<T>> Pyvis2dirty_wstack(const PyBaselines<T> &
 
 template<typename T> pyarr<complex<T>> Pydirty2vis_wstack(const PyBaselines<T> &baselines,
   const PyGridderConfig<T> &gconf, const pyarr<uint32_t> &idx_,
-  const pyarr<complex<T>> &dirty_)
+  const pyarr<T> &dirty_)
   {
   auto idx2=make_const_mav<1>(idx_);
   auto nvis = idx2.shape(0);