diff --git a/CEP/DP3/DPPP/src/SolTab.cc b/CEP/DP3/DPPP/src/SolTab.cc
index 54468913db0a69fedfdf9dc581066bc56603d9a7..625e2d7c580dbd0ca0fafaa23d97a44dfe308256 100644
--- a/CEP/DP3/DPPP/src/SolTab.cc
+++ b/CEP/DP3/DPPP/src/SolTab.cc
@@ -125,7 +125,12 @@ namespace LOFAR {
     }
 
     // Add weights
-    H5::DataSet weightset = createDataSet("weight", H5::PredType::IEEE_F64LE,
+    hid_t halffloat = H5Tcopy(H5T_IEEE_F32BE);
+    H5Tset_fields(halffloat, 15, 10, 5, 0, 10);
+    H5Tset_size(halffloat, 2);
+    H5Tset_ebias(halffloat, 15);
+    H5Tlock(halffloat);
+    H5::DataSet weightset = createDataSet("weight", H5::DataType(halffloat),
                                           dataspace);
 
     // If weights are empty, write ones everywhere
diff --git a/CEP/DP3/DPPP/test/tH5Parm.cc b/CEP/DP3/DPPP/test/tH5Parm.cc
index 4291800d1dbc595fa0d7ed8a33ef3d6c2d103440..ddec947dc907e57c759c0fb2b7eb1d7ce1586bdb 100644
--- a/CEP/DP3/DPPP/test/tH5Parm.cc
+++ b/CEP/DP3/DPPP/test/tH5Parm.cc
@@ -9,7 +9,7 @@
 using namespace std;
 using namespace LOFAR;
 
-void checkAxes(H5Parm::SolTab& soltab) {
+void checkAxes(H5Parm::SolTab& soltab, size_t ntimes) {
   ASSERT(soltab.nAxes()==3);
   ASSERT(soltab.hasAxis("ant"));
   ASSERT(soltab.hasAxis("time"));
@@ -18,12 +18,13 @@ void checkAxes(H5Parm::SolTab& soltab) {
   ASSERT(soltab.getAxis(1).name=="time");
   ASSERT(soltab.getAxis(2).name=="bla");
   ASSERT(soltab.getAxis(0).size==3);
-  ASSERT(soltab.getAxis(1).size==4);
+  ASSERT(soltab.getAxis(1).size==ntimes);
   ASSERT(soltab.getAxis(2).size==1);
 }
 
 int main(int, char**) {
   {
+    size_t ntimes=42;
     {
       // Create a new H5Parm
       cout<<"Create tH5Parm_tmp.h5"<<endl;
@@ -49,7 +50,7 @@ int main(int, char**) {
 
       vector<H5Parm::AxisInfo> axes;
       axes.push_back(H5Parm::AxisInfo("ant",3));
-      axes.push_back(H5Parm::AxisInfo("time",4));
+      axes.push_back(H5Parm::AxisInfo("time",ntimes));
       axes.push_back(H5Parm::AxisInfo("bla",1));
 
       cout<<"Create new SolTab"<<endl;
@@ -62,14 +63,19 @@ int main(int, char**) {
       // Check the axes
       H5Parm::SolTab soltab = h5parm.getSolTab("mysol");
       ASSERT(soltab.getType()=="mytype");
-      checkAxes(soltab);
+      checkAxes(soltab, ntimes);
 
       // Add some data
-      vector<double> vals(3*4);
-      for (size_t ant=0; ant<3; ++ant)
-        for (size_t time=0; time<4; ++time)
-          vals[ant*4+time]=10*ant+time;
-      soltab.setValues(vals, vector<double>(), "CREATE with DPPP");
+      vector<double> vals(3*ntimes);
+      vector<double> weights(3*ntimes);
+      for (size_t ant=0; ant<3; ++ant) {
+        for (size_t time=0; time<ntimes; ++time) {
+          vals[ant*ntimes+time]=10*ant+time;
+          weights[ant*ntimes+time]=0.4;
+        }
+      }
+
+      soltab.setValues(vals, weights, "CREATE with DPPP");
 
       // Add metadata for stations
       vector<string> someAntNames;
@@ -80,9 +86,9 @@ int main(int, char**) {
 
       // Add metadata for times
       vector<double> times;
-      times.push_back(57878.5);
-      times.push_back(57880.5);
-      times.push_back(57882.5);
+      for (size_t time=0; time<ntimes; ++time) {
+        times.push_back(57878.5+2.0*time);
+      }
       soltab.setTimes(times);
 
       // Add metadata for freqs;
@@ -117,13 +123,13 @@ int main(int, char**) {
       // Check the axes
       H5Parm::SolTab soltab = h5parm.getSolTab("mysol");
       ASSERT(soltab.getType()=="mytype");
-      checkAxes(soltab);
+      checkAxes(soltab, ntimes);
 
       cout<<"read some data"<<endl;
       double starttime = 57878.49999;
       hsize_t starttimeindex = soltab.getTimeIndex(starttime);
       cout<<"starttimeindex="<<starttimeindex<<endl;
-      vector<double> val = soltab.getValues("Antenna2", starttimeindex, 4);
+      vector<double> val = soltab.getValues("Antenna2", starttimeindex, ntimes);
       ASSERT(casa::near(val[0],10.));
       ASSERT(casa::near(val[1],11.));
       ASSERT(casa::near(val[2],12.));
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/Constraint.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/Constraint.h
index 7f215b28d98a0870fc15b470f1fff31e3dd2caa1..49ff5b891f408f12e6f58ca3bc764233c03d890e 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/Constraint.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/Constraint.h
@@ -21,6 +21,7 @@ public:
   {
   public:
     std::vector<double> vals;
+    std::vector<double> weights;
     std::string axes; // Comma-separated string with axis names, fastest varying last
     std::vector<size_t> dims;
     std::string name;
@@ -65,7 +66,30 @@ public:
     std::vector<std::vector<dcomplex> >& solutions,
     double time) = 0;
 
+  /**
+  * Initialize the dimensions for the constraint. Should be overridden when
+  * something more than assigning dimensions is needed (e.g. resizing vectors).
+  * Weights are initialized to 1. here.
+  */
+  virtual void InitializeDimensions(size_t nAntennas,
+                                    size_t nDirections,
+                                    size_t nChannelBlocks)
+  {
+    _nAntennas = nAntennas;
+    _nDirections = nDirections;
+    _nChannelBlocks = nChannelBlocks;
+  }
+
+  /**
+   * Set weights. The vector should contain an array of size nAntennas * nChannelBlocks,
+   * where the channel index varies fastest.
+   */
+  virtual void SetWeights(std::vector<double> &) {}
+
   virtual void showTimings (std::ostream&, double) const {}
+
+protected:
+  size_t _nAntennas, _nDirections, _nChannelBlocks;
 };
 
 /**
@@ -123,11 +147,8 @@ class CoreConstraint : public Constraint
 public:
   CoreConstraint() { }
 
-  void initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks, const std::set<size_t>& coreAntennas)
+  void initialize(const std::set<size_t>& coreAntennas)
   {
-    _nAntennas = nAntennas;
-    _nDirections = nDirections;
-    _nChannelBlocks = nChannelBlocks;
     _coreAntennas = coreAntennas;
   }
   
@@ -136,7 +157,6 @@ public:
                     double time);
   
 private:
-  size_t _nAntennas, _nDirections, _nChannelBlocks;
   std::set<size_t> _coreAntennas;
 };
 
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/DDECal.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/DDECal.h
index f4ec891d3eefb3ca5025d77aa4d599a3d6cdd16a..d74e77465bbed6567cc452721f3977e9e14a79dc 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/DDECal.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/DDECal.h
@@ -141,10 +141,13 @@ namespace LOFAR {
       uint             itsSolInt;
       uint             itsStepInSolInt;
       uint             itsNChan;
+      vector<size_t>   itsChanBlockStart;    // For each channel block, the index in the channels at which this channel block starts
       vector<double>   itsChanBlockFreqs;
       vector<vector<string> > itsDirections; // For each direction, a vector of patches
       vector<casacore::CountedPtr<Constraint> > itsConstraints;
 
+      vector<double>   itsWeights;
+
       UVWFlagger       itsUVWFlagStep;
       ResultStep::ShPtr itsDataResultStep; // Result step for data after UV-flagging
       vector<Predict>     itsPredictSteps;
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationAndDiagonalConstraint.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationAndDiagonalConstraint.h
index 996f95130c2860eded0717cdeb908fcceff87f1d..a7caac05a9d7b44b7a22c2448fd927a099bfe9fd 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationAndDiagonalConstraint.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationAndDiagonalConstraint.h
@@ -14,16 +14,19 @@ namespace LOFAR {
 class RotationAndDiagonalConstraint : public Constraint
 {
 public:
-  RotationAndDiagonalConstraint();
+  RotationAndDiagonalConstraint() {};
   
   virtual std::vector<Result> Apply(
                     std::vector<std::vector<dcomplex> >& solutions,
                     double time);
 
-  void initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks);
+  virtual void InitializeDimensions(size_t nAntennas,
+                                    size_t nDirections,
+                                    size_t nChannelBlocks);
+
+  virtual void SetWeights(std::vector<double>&);
 
 private:
-  size_t _nAntennas, _nDirections, _nChannelBlocks;
   std::vector<Constraint::Result> _resTemplate;
 };
 
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationConstraint.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationConstraint.h
index ddc25f71a59268d4c19c19654d5d3879d8cefaf3..034b9c7ba4a0aab3ae35c0455f34a0ee1377e959 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationConstraint.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/RotationConstraint.h
@@ -14,19 +14,22 @@ namespace LOFAR {
 class RotationConstraint : public Constraint
 {
 public:
-  RotationConstraint();
+  RotationConstraint() {};
   
   virtual std::vector<Result> Apply(
                     std::vector<std::vector<dcomplex> >& solutions,
                     double time);
 
-  void initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks);
+  virtual void InitializeDimensions(size_t nAntennas,
+                                    size_t nDirections,
+                                    size_t nChannelBlocks);
+
+  virtual void SetWeights(std::vector<double>&);
 
   /* Compute the rotation from a 2x2 full jones solution */
   static double get_rotation(std::complex<double>* data);
 
 private:
-  size_t _nAntennas, _nDirections, _nChannelBlocks;
   std::vector<Constraint::Result> _resTemplate;
 };
 
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/ScreenConstraint.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/ScreenConstraint.h
index d22abd5353344c902953764d754304f68586207d..1ac33109aa31a3a4eb0089bb4c9c2271453d5b37 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/ScreenConstraint.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/ScreenConstraint.h
@@ -21,7 +21,11 @@ class ScreenConstraint : public Constraint
 public:
   ScreenConstraint(const ParameterSet& parset,
                    const string& prefix);
-  void initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks, const double* frequencies);
+
+  /** Initialize metadata with frequencies, resize some members.
+   * Should be called after InitializeDimensions.
+   */
+  void initialize(const double* frequencies);
   virtual std::vector<Constraint::Result> Apply(std::vector<std::vector<MultiDirSolver::DComplex> >& solutions,double time);
   virtual void CalculatePiercepoints();
 
@@ -41,7 +45,6 @@ public:
   }
  void getPPValue(std::vector<std::vector<std::complex<double> > >&, size_t, size_t, double&,double&) const;
 private:
-  size_t _nAntennas, _nDirections, _nChannelBlocks;
   std::vector<std::vector<double> > itsAntennaPos;
   std::vector<std::vector<double> > itsSourcePos;
   std::vector<double>               itsFrequencies;
diff --git a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/TECConstraint.h b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/TECConstraint.h
index 647935622d96c3436e68d0bd1a14f6fdb469eb14..342ede6312fb738dcb2a456e59e063276a863cf3 100644
--- a/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/TECConstraint.h
+++ b/CEP/DP3/DPPP_DDECal/include/DPPP_DDECal/TECConstraint.h
@@ -1,6 +1,8 @@
 #ifndef TEC_CONSTRAINT_H
 #define TEC_CONSTRAINT_H
 
+#include <vector>
+
 #ifdef AOPROJECT
 #include "Constraint.h"
 #include "PhaseFitter.h"
@@ -25,16 +27,20 @@ public:
   
   TECConstraintBase(Mode mode);
 
-  void initialize(size_t nAntennas, size_t nDirections, 
-                  size_t nChannelBlocks, const double* frequencies);
+  /** Initialize metadata with frequencies, resize some members.
+   * Should be called after InitializeDimensions.
+   */
+  void initialize(const double* frequencies);
   
+  /** Propagate weights to the phase fitters */
+  virtual void SetWeights(std::vector<double>& weights);
+
 protected:
   virtual void initializeChild() { }
   
   void applyReferenceAntenna(std::vector<std::vector<dcomplex> >& solutions) const;
   
   Mode _mode;
-  size_t _nAntennas, _nDirections, _nChannelBlocks;
   std::vector<PhaseFitter> _phaseFitters;
 };
 
diff --git a/CEP/DP3/DPPP_DDECal/src/DDECal.cc b/CEP/DP3/DPPP_DDECal/src/DDECal.cc
index 6e19eb7325a2a0f922e10f868ee52420813bc342..c1329eb0bc13522639fc524c203270b031a19b0b 100644
--- a/CEP/DP3/DPPP_DDECal/src/DDECal.cc
+++ b/CEP/DP3/DPPP_DDECal/src/DDECal.cc
@@ -327,6 +327,7 @@ namespace LOFAR {
       itsConstraintSols.resize(nSolTimes);
 
       size_t nChannelBlocks = info().nchan()/itsNChan;
+      itsChanBlockStart.resize(nChannelBlocks+1);
       itsChanBlockFreqs.resize(nChannelBlocks);
       for(size_t chBlock=0; chBlock!=nChannelBlocks; ++chBlock) {
         const size_t
@@ -337,19 +338,29 @@ namespace LOFAR {
             info().chanFreqs().data()+channelIndexStart,
             info().chanFreqs().data()+channelIndexEnd,
             0.0) / curChannelBlockSize;
+        itsChanBlockStart[chBlock] = channelIndexStart;
         itsChanBlockFreqs[chBlock] = meanfreq;
       }
+      itsChanBlockStart[itsChanBlockStart.size()-1] = info().nchan();
+
+      itsWeights.resize(itsChanBlockFreqs.size()*info().nantenna());
 
       for (uint i=0; i<itsConstraints.size();++i) {
+        // Initialize the constraint with some common metadata
+        itsConstraints[i]->InitializeDimensions(info().antennaNames().size(),
+                                                itsDirections.size(),
+                                                nChannelBlocks);
+
         // Different constraints need different information. Determine if the constraint is
         // of a type that needs more information, and if so initialize the constraint.
         CoreConstraint* coreConstraint = dynamic_cast<CoreConstraint*>(itsConstraints[i].get());
         if(coreConstraint != 0)
         {
+          // Take antenna with index 0 as reference station
           double
-            refX = antennaPos[i][0],
-            refY = antennaPos[i][1],
-            refZ = antennaPos[i][2];
+            refX = antennaPos[0][0],
+            refY = antennaPos[0][1],
+            refZ = antennaPos[0][2];
           std::set<size_t> coreAntennaIndices;
           const double coreDistSq = itsCoreConstraint*itsCoreConstraint;
           for(size_t ant=0; ant!=antennaPos.size(); ++ant)
@@ -362,21 +373,13 @@ namespace LOFAR {
             if(distSq <= coreDistSq)
               coreAntennaIndices.insert(ant);
           }
-          coreConstraint->initialize(info().antennaNames().size(),
-            itsDirections.size(),
-            info().nchan(),
-            coreAntennaIndices);
+          coreConstraint->initialize(coreAntennaIndices);
         }
         
         ScreenConstraint* screenConstraint = dynamic_cast<ScreenConstraint*>(itsConstraints[i].get());
         if(screenConstraint != 0)
         {
-          screenConstraint->initialize(
-              info().antennaNames().size(),
-              itsDirections.size(),
-              nChannelBlocks,
-              &(itsChanBlockFreqs[0])
-          );
+          screenConstraint->initialize(&(itsChanBlockFreqs[0]));
           screenConstraint->setAntennaPositions(antennaPos);
           screenConstraint->setDirections(sourcePositions);
           screenConstraint->initPiercePoints();
@@ -406,21 +409,7 @@ namespace LOFAR {
         TECConstraintBase* tecConstraint = dynamic_cast<TECConstraintBase*>(itsConstraints[i].get());
         if(tecConstraint != 0)
         {
-          tecConstraint->initialize(info().antennaNames().size(),
-              itsDirections.size(),
-              nChannelBlocks,
-              &(itsChanBlockFreqs[0]));
-        }
-
-        RotationAndDiagonalConstraint* rotationAndDiagonalConstraint = dynamic_cast<RotationAndDiagonalConstraint*>(itsConstraints[i].get());
-        if(rotationAndDiagonalConstraint != 0)
-        {
-          rotationAndDiagonalConstraint->initialize(info().antennaNames().size(), itsDirections.size(), nChannelBlocks);
-        }
-        RotationConstraint* rotationConstraint = dynamic_cast<RotationConstraint*>(itsConstraints[i].get());
-        if(rotationConstraint != 0)
-        {
-          rotationConstraint->initialize(info().antennaNames().size(), itsDirections.size(), nChannelBlocks);
+          tecConstraint->initialize(&(itsChanBlockFreqs[0]));
         }
       }
 
@@ -600,7 +589,15 @@ namespace LOFAR {
       const size_t nCh = info().nchan();
       const size_t nCr = 4;
       
+      size_t nchanblocks = itsChanBlockFreqs.size();
+      size_t chanblock = 0;
+
+      double weightFactor = 1./(nCh*(info().nantenna()-1)*nCr*itsSolInt);
+
       for (size_t ch=0; ch<nCh; ++ch) {
+        if (ch == itsChanBlockStart[chanblock+1]) {
+          chanblock++;
+        }
         for (size_t bl=0; bl<nBl; ++bl) {
           for (size_t cr=0; cr<nCr; ++cr) {
             if (itsBufs[itsStepInSolInt].getFlags().data()[bl*nCr*nCh+ch*nCr+cr]) {
@@ -611,26 +608,39 @@ namespace LOFAR {
               }
             } else {
               // Premultiply non-flagged data with sqrt(weight)
-              double weight = sqrt(itsBufs[itsStepInSolInt].getWeights().data()[bl*nCr*nCh+ch*nCr+cr]);
-              itsDataPtrs[itsStepInSolInt][bl*nCr*nCh+ch*nCr+cr] *= weight;
+              double weight = itsBufs[itsStepInSolInt].getWeights().data()[bl*nCr*nCh+ch*nCr+cr];
+              itsDataPtrs[itsStepInSolInt][bl*nCr*nCh+ch*nCr+cr] *= sqrt(weight);
+              itsWeights[info().getAnt1()[bl]*nchanblocks + chanblock] += weight;
+              itsWeights[info().getAnt2()[bl]*nchanblocks + chanblock] += weight;
               for (size_t dir=0; dir<itsPredictSteps.size(); ++dir) {
-                itsModelDataPtrs[itsStepInSolInt][dir][bl*nCr*nCh+ch*nCr+cr] *= weight;
+                itsModelDataPtrs[itsStepInSolInt][dir][bl*nCr*nCh+ch*nCr+cr] *= sqrt(weight);
               }
             }
           }
         }
       }
 
+      for (auto& weight: itsWeights) {
+        weight *= weightFactor;
+      }
+
       itsTimerPredict.stop();
 
       itsAvgTime += itsAvgTime + bufin.getTime();
 
       if (itsStepInSolInt==itsSolInt-1) {
+        for (uint constraint_num = 0; constraint_num < itsConstraints.size(); ++constraint_num) {
+          itsConstraints[constraint_num]->SetWeights(itsWeights);
+        }
+
         doSolve();
-            itsStepInSolInt=0;
+
+        // Clean up, prepare for next iteration
+        itsStepInSolInt=0;
         itsAvgTime=0;
         for (size_t dir=0; dir<itsResultSteps.size(); ++dir) {
           itsResultSteps[dir]->clear();
+          itsWeights.assign(itsWeights.size(), 0.);
         }
       } else {
         itsStepInSolInt++;
@@ -822,9 +832,22 @@ namespace LOFAR {
                 nextpos);
             }
 
+            // Put solution weights in a contiguous piece of memory
+            vector<double> weights;
+            if (!itsConstraintSols[0][constraintNum][solNameNum].weights.empty()) {
+              weights.resize(numSols);
+              vector<double>::iterator nextpos = weights.begin();
+              for (uint time=0; time<itsSols.size(); ++time) {
+                nextpos = std::copy(
+                  itsConstraintSols[time][constraintNum][solNameNum].weights.begin(),
+                  itsConstraintSols[time][constraintNum][solNameNum].weights.end(),
+                  nextpos);
+              }
+            }
+
             string solTabName = firstResult.name+"000";
             H5Parm::SolTab soltab = itsH5Parm.createSolTab(solTabName, firstResult.name, axes);
-            soltab.setValues(sols, vector<double>(),
+            soltab.setValues(sols, weights,
                              "CREATE by DPPP\n" +
                              Version::getInfo<DPPPVersion>("DPPP", "top") + "\n" +
                              "step " + itsName + " in parset: \n" +
diff --git a/CEP/DP3/DPPP_DDECal/src/RotationAndDiagonalConstraint.cc b/CEP/DP3/DPPP_DDECal/src/RotationAndDiagonalConstraint.cc
index b42267e6ae7725d506f116fcaf942a27efdd1095..ef9966bf6f2283bcafdd312c5212f174f0a5db90 100644
--- a/CEP/DP3/DPPP_DDECal/src/RotationAndDiagonalConstraint.cc
+++ b/CEP/DP3/DPPP_DDECal/src/RotationAndDiagonalConstraint.cc
@@ -10,19 +10,16 @@ using namespace std;
 
 namespace LOFAR {
 
-RotationAndDiagonalConstraint::RotationAndDiagonalConstraint():
-    _nAntennas(0), _nDirections(0)
-{
-}
+void RotationAndDiagonalConstraint::InitializeDimensions(size_t nAntennas,
+                                                         size_t nDirections,
+                                                         size_t nChannelBlocks) {
+  Constraint::InitializeDimensions(nAntennas, nDirections, nChannelBlocks);
 
-void RotationAndDiagonalConstraint::initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks) {
-  _nAntennas = nAntennas;
-  _nDirections = nDirections;
-  assert(nDirections == 1);
-  _nChannelBlocks = nChannelBlocks;
+  assert(_nDirections == 1);
 
   _resTemplate.resize(3);
   _resTemplate[0].vals.resize(_nAntennas*_nChannelBlocks);
+  _resTemplate[0].weights.resize(_nAntennas*_nChannelBlocks);
   _resTemplate[0].axes="ant,freq";
   _resTemplate[0].dims.resize(2);
   _resTemplate[0].dims[0]=_nAntennas;
@@ -30,6 +27,7 @@ void RotationAndDiagonalConstraint::initialize(size_t nAntennas, size_t nDirecti
   _resTemplate[0].name="rotation";
 
   _resTemplate[1].vals.resize(_nAntennas*_nChannelBlocks*2);
+  _resTemplate[1].weights.resize(_nAntennas*_nChannelBlocks*2);
   _resTemplate[1].axes="ant,freq,pol";
   _resTemplate[1].dims.resize(3);
   _resTemplate[1].dims[0]=_nAntennas;
@@ -41,6 +39,20 @@ void RotationAndDiagonalConstraint::initialize(size_t nAntennas, size_t nDirecti
   _resTemplate[2].name="phase";
 }
 
+void RotationAndDiagonalConstraint::SetWeights(vector<double>& weights) {
+  _resTemplate[0].weights.assign(weights.begin(), weights.end());
+
+  // Duplicate weights for two polarizations
+  _resTemplate[1].weights.resize(_nAntennas*_nChannelBlocks*2);
+  size_t indexInWeights = 0;
+  for (auto weight: weights) {
+    _resTemplate[1].weights[indexInWeights++] = weight;
+    _resTemplate[1].weights[indexInWeights++] = weight;
+  }
+
+  _resTemplate[2].weights = _resTemplate[1].weights;
+}
+
 vector<Constraint::Result> RotationAndDiagonalConstraint::Apply(
     vector<vector<dcomplex> >& solutions, double) {
   // Convert to circular
@@ -55,7 +67,7 @@ vector<Constraint::Result> RotationAndDiagonalConstraint::Apply(
 
       double angle = RotationConstraint::get_rotation(data);
       // Restrict angle between -pi/2 and pi/2
-  // Add 2pi to make sure that fmod doesn't see negative numbers
+      // Add 2pi to make sure that fmod doesn't see negative numbers
       angle = fmod(angle + 3.5*M_PI, M_PI) - 0.5*M_PI;
       _resTemplate[0].vals[ant*_nChannelBlocks + ch] = angle;
  
diff --git a/CEP/DP3/DPPP_DDECal/src/RotationConstraint.cc b/CEP/DP3/DPPP_DDECal/src/RotationConstraint.cc
index 2b14c6578e4d05fe80efa9e8a9fb4b24ae51ef35..913a206182591d909417ef0ea840e516c66de48a 100644
--- a/CEP/DP3/DPPP_DDECal/src/RotationConstraint.cc
+++ b/CEP/DP3/DPPP_DDECal/src/RotationConstraint.cc
@@ -9,16 +9,12 @@ using namespace std;
 
 namespace LOFAR {
 
-RotationConstraint::RotationConstraint():
-    _nAntennas(0), _nDirections(0)
-{
-}
+  void RotationConstraint::InitializeDimensions(size_t nAntennas,
+                                                size_t nDirections,
+                                                size_t nChannelBlocks) {
+  Constraint::InitializeDimensions(nAntennas, nDirections, nChannelBlocks);
 
-void RotationConstraint::initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks) {
-  _nAntennas = nAntennas;
-  _nDirections = nDirections;
-  assert(nDirections == 1);
-  _nChannelBlocks = nChannelBlocks;
+  assert(_nDirections == 1);
 
   _resTemplate.resize(1);
   _resTemplate[0].vals.resize(_nAntennas*_nChannelBlocks);
@@ -29,6 +25,10 @@ void RotationConstraint::initialize(size_t nAntennas, size_t nDirections, size_t
   _resTemplate[0].name="rotation";
 }
 
+void RotationConstraint::SetWeights(vector<double>& weights) {
+  _resTemplate[0].weights.assign(weights.begin(), weights.end());
+}
+
 double RotationConstraint::get_rotation(std::complex<double>* data) {
   // Convert to circular
   complex<double> ll, rr;
diff --git a/CEP/DP3/DPPP_DDECal/src/ScreenConstraint.cc b/CEP/DP3/DPPP_DDECal/src/ScreenConstraint.cc
index 5e60d3bcbbce289ddd376ed598549996b972f579..24a78330a65344d0f072c44d5ff2609f88e20213 100644
--- a/CEP/DP3/DPPP_DDECal/src/ScreenConstraint.cc
+++ b/CEP/DP3/DPPP_DDECal/src/ScreenConstraint.cc
@@ -10,10 +10,8 @@ const  size_t ScreenConstraint::maxIter=30;
 ScreenConstraint::ScreenConstraint(const ParameterSet& parset,
                       const string& prefix)
  :
-  _nAntennas(0),
-  _nDirections(0),
-  _nChannelBlocks(0),
-  itsCurrentTime(0)
+  itsCurrentTime(0),
+  itsIter(0)
 {
   cout<<"=========="<<(prefix + "order")<<"========\n";
   itsBeta=parset.getDouble (prefix + "beta", 5./3.);
@@ -25,10 +23,7 @@ ScreenConstraint::ScreenConstraint(const ParameterSet& parset,
   itsDebugMode=parset.getInt(prefix + "debug", 0);
 }
 
-void ScreenConstraint::initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks, const double* frequencies) {
-  _nAntennas = nAntennas;
-  _nDirections = nDirections;
-  _nChannelBlocks = nChannelBlocks;
+void ScreenConstraint::initialize(const double* frequencies) {
   itsFrequencies.resize(_nChannelBlocks);
   itsprevsol.assign(_nDirections*_nAntennas,-999.);
   std::memcpy( itsFrequencies.data(),frequencies, sizeof(double) * _nChannelBlocks);
diff --git a/CEP/DP3/DPPP_DDECal/src/TECConstraint.cc b/CEP/DP3/DPPP_DDECal/src/TECConstraint.cc
index a7b588667f255be54a2411faa15dff5a32597dc3..fbaf7d5936c10192b06b811f1ffa05240e39e87a 100644
--- a/CEP/DP3/DPPP_DDECal/src/TECConstraint.cc
+++ b/CEP/DP3/DPPP_DDECal/src/TECConstraint.cc
@@ -6,19 +6,15 @@
 #include <Common/OpenMP.h>
 #endif
 
+#include <assert.h>
+
 TECConstraintBase::TECConstraintBase(Mode mode) :
   _mode(mode),
-  _nAntennas(0),
-  _nDirections(0),
-  _nChannelBlocks(0),
   _phaseFitters()
 {
 }
 
-void TECConstraintBase::initialize(size_t nAntennas, size_t nDirections, size_t nChannelBlocks, const double* frequencies) {
-  _nAntennas = nAntennas;
-  _nDirections = nDirections;
-  _nChannelBlocks = nChannelBlocks;
+void TECConstraintBase::initialize(const double* frequencies) {
   _phaseFitters.resize(
 #ifdef AOPROJECT
       omp_get_max_threads()
@@ -30,13 +26,31 @@ void TECConstraintBase::initialize(size_t nAntennas, size_t nDirections, size_t
   for(size_t i=0; i!=_phaseFitters.size(); ++i)
   {
     _phaseFitters[i].SetChannelCount(_nChannelBlocks);
-    std::memcpy(_phaseFitters[i].FrequencyData(), frequencies, sizeof(double) * _nChannelBlocks);
-    
-    // TODO this should set the weights of the phase fitter!
+    std::memcpy(_phaseFitters[i].FrequencyData(), frequencies,
+                sizeof(double) * _nChannelBlocks);
   }
   initializeChild();
 }
 
+void TECConstraintBase::SetWeights(std::vector<double> &weights) {
+  std::vector<double> chanBlockWeights(_nChannelBlocks, 0.);
+#ifndef NDEBUG
+  assert(weights.size() == _nAntennas*_nChannelBlocks);
+#endif
+
+  size_t weightspos = 0;
+  for (size_t ant=0; ant < _nAntennas; ++ant) {
+    for (size_t chanBlock=0; chanBlock < _nChannelBlocks; ++chanBlock) {
+      chanBlockWeights[chanBlock] += weights[weightspos++];
+    }
+  }
+
+  for(size_t thread=0; thread!=_phaseFitters.size(); ++thread) {
+    std::copy(chanBlockWeights.begin(), chanBlockWeights.end(),
+              _phaseFitters[thread].WeightData());
+  }
+}
+
 void ApproximateTECConstraint::initializeChild()
 {
   _pwFitters.resize(
diff --git a/CEP/DP3/DPPP_DDECal/test/tRotationConstraint.cc b/CEP/DP3/DPPP_DDECal/test/tRotationConstraint.cc
index a9fb2e35d20563f2c8764416743af8c3136386de..b24ce1b26d8afda49176d4e50bafc08b2f0e5b8f 100644
--- a/CEP/DP3/DPPP_DDECal/test/tRotationConstraint.cc
+++ b/CEP/DP3/DPPP_DDECal/test/tRotationConstraint.cc
@@ -15,7 +15,7 @@ using namespace LOFAR;
 
 void test_rotation() {
   RotationConstraint constraint;
-  constraint.initialize(1, 1, 1);
+  constraint.InitializeDimensions(1, 1, 1);
 
   vector<vector<complex<double> > > onesolution(1);
   onesolution[0].resize(4);
@@ -46,7 +46,7 @@ void test_rotation() {
 
 void test_rotation_and_diagonal() {
   RotationAndDiagonalConstraint constraint;
-  constraint.initialize(1, 1, 1);
+  constraint.InitializeDimensions(1, 1, 1);
 
   vector<vector<complex<double> > > onesolution(1);
   onesolution[0].resize(4);