diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/GaussianSource.h b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/GaussianSource.h
index 50616ae51c04bbf82db3ec41fdf12e6b1965ffab..6d4c4fe3202a52da2a919ce7e596026dce86357f 100644
--- a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/GaussianSource.h
+++ b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/GaussianSource.h
@@ -46,7 +46,7 @@ public:
 
     GaussianSource(const string &name, const Expr &ra, const Expr &dec,
         const Expr &I, const Expr &Q, const Expr &U, const Expr &V,
-        const Expr &si, const Expr &major, const Expr &minor, const Expr &phi);
+        const Expr &major, const Expr &minor, const Expr &phi);
 
     const Expr &getI() const
     { return itsI; }
@@ -56,8 +56,6 @@ public:
     { return itsU; }
     const Expr &getV() const
     { return itsV; }
-    const Expr &getSpectralIndex() const
-    { return itsSpectralIndex; }
     const Expr &getMajor() const
     { return itsMajor; }
     const Expr &getMinor() const
@@ -73,7 +71,6 @@ private:
     Expr    itsMajor;
     Expr    itsMinor;
     Expr    itsPhi;
-    Expr    itsSpectralIndex;
 };
 
 // @}
diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/PointSource.h b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/PointSource.h
index 5135a9fd0a4a2ceb1582a1da36b88346b72db1e7..32d042ce8204accb1f78a3a05c64a6073fcc507c 100644
--- a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/PointSource.h
+++ b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/PointSource.h
@@ -43,9 +43,8 @@ public:
     typedef shared_ptr<PointSource>          Pointer;
     typedef shared_ptr<const PointSource>    ConstPointer;
 
-    PointSource(const string& name, const Expr &ra, const Expr &dec,
-        const Expr &I, const Expr &Q, const Expr &U, const Expr &V,
-        const Expr &si);
+    PointSource(const string &name, const Expr &ra, const Expr &dec,
+        const Expr &I, const Expr &Q, const Expr &U, const Expr &V);
 
     const Expr &getI() const
     { return itsI; }
@@ -55,15 +54,12 @@ public:
     { return itsU; }
     const Expr &getV() const
     { return itsV; }
-    const Expr &getSpectralIndex() const
-    { return itsSpectralIndex; }
 
 private:
     Expr    itsI;
     Expr    itsQ;
     Expr    itsU;
     Expr    itsV;
-    Expr    itsSpectralIndex;
 };
 
 // @}
diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/SpectralIndex.h b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/SpectralIndex.h
index 707d824aa3d8df6029934af905d84a8fdbebc922..c8ad90d5f30b1bf06654c5167a759bc02e59912c 100644
--- a/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/SpectralIndex.h
+++ b/CEP/Calibration/BBSKernel/include/BBSKernel/Expr/SpectralIndex.h
@@ -42,17 +42,19 @@ class SpectralIndex: public ExprRep
 {
 public:
     template <typename T_Iterator>
-    SpectralIndex(const Expr &refFreq, T_Iterator first, T_Iterator last);
+    SpectralIndex(const Expr &refFreq, const Expr &refStokes, T_Iterator first,
+        T_Iterator last);
 
     virtual Matrix getResultValue(const Request &request,
         const std::vector<const Matrix*> &args);
 };
 
 template <typename T_Iterator>
-SpectralIndex::SpectralIndex(const Expr &refFreq, T_Iterator first,
-    T_Iterator last)
+SpectralIndex::SpectralIndex(const Expr &refFreq, const Expr &refStokes,
+    T_Iterator first, T_Iterator last)
 {
     addChild(refFreq);
+    addChild(refStokes);
     while(first != last)
     {
         addChild(*first++);
diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/Model.h b/CEP/Calibration/BBSKernel/include/BBSKernel/Model.h
index 7f76c7aa2115058d7558a691ef6d917b1bfd2836..8b846468e945b8aa27f1897fdd8b66580269a313 100644
--- a/CEP/Calibration/BBSKernel/include/BBSKernel/Model.h
+++ b/CEP/Calibration/BBSKernel/include/BBSKernel/Model.h
@@ -103,7 +103,7 @@ private:
 
     Source::Pointer makeSource(const SourceInfo &source);
 
-    Expr makeSpectralIndex(const SourceInfo &source);
+    Expr makeSpectralIndex(const SourceInfo &source, const string &stokesParm);
 
     void makeStationUvw();
 
diff --git a/CEP/Calibration/BBSKernel/src/Expr/GaussianCoherence.cc b/CEP/Calibration/BBSKernel/src/Expr/GaussianCoherence.cc
index 16eea22a0608f59c5a4519b65443f5c5f6e7db99..2ce6acf1be0a6c08da5c008d9966a8afae7139ed 100644
--- a/CEP/Calibration/BBSKernel/src/Expr/GaussianCoherence.cc
+++ b/CEP/Calibration/BBSKernel/src/Expr/GaussianCoherence.cc
@@ -53,7 +53,6 @@ GaussianCoherence::GaussianCoherence(const GaussianSource::ConstPointer &source,
 	addChild(source->getQ());
 	addChild(source->getU());
 	addChild(source->getV());
-    addChild(source->getSpectralIndex());
 	addChild(source->getMajor());
 	addChild(source->getMinor());
 	addChild(source->getPhi());
@@ -63,7 +62,7 @@ JonesResult GaussianCoherence::getJResult(const Request &request)
 {
     enum ChildExprIndex
     {
-        IN_I, IN_Q, IN_U, IN_V, IN_SI, IN_MAJOR, IN_MINOR, IN_PHI
+        IN_I, IN_Q, IN_U, IN_V, IN_MAJOR, IN_MINOR, IN_PHI
     };
 
     // Evaluate source parameters.
@@ -74,7 +73,6 @@ JonesResult GaussianCoherence::getJResult(const Request &request)
     const Result &qk = getChild(IN_Q).getResultSynced(request, qkBuf);
     const Result &uk = getChild(IN_U).getResultSynced(request, ukBuf);
     const Result &vk = getChild(IN_V).getResultSynced(request, vkBuf);
-    const Result &si = getChild(IN_SI).getResultSynced(request, siBuf);
     const Result &major = getChild(IN_MAJOR).getResultSynced(request, majorBuf);
     const Result &minor = getChild(IN_MINOR).getResultSynced(request, minorBuf);
     const Result &phi = getChild(IN_PHI).getResultSynced(request, phiBuf);
@@ -118,68 +116,61 @@ JonesResult GaussianCoherence::getJResult(const Request &request)
     Matrix vBaseline = vStation2.getValue() - vStation1.getValue();
 
     // Compute spatial coherence for a gaussian source.
-    Matrix coherence = computeCoherence(request, uBaseline, vBaseline,
-        major.getValue(), minor.getValue(), phi.getValue());
+    Matrix coherence_2 = computeCoherence(request, uBaseline, vBaseline,
+        major.getValue(), minor.getValue(), phi.getValue()) * 0.5;
 
     // Compute main result.
-    Matrix uv_2 = tocomplex(uk.getValue(), vk.getValue()) * 0.5;
+    Matrix uv = tocomplex(uk.getValue(), vk.getValue());
 
-    resXX.setValue(si.getValue() * coherence * (ik.getValue() + qk.getValue())
-        * 0.5);
-    resXY.setValue(uv_2 * coherence);
-    resYX.setValue(conj(uv_2) * coherence);
-    resYY.setValue(si.getValue() * coherence * (ik.getValue() - qk.getValue())
-        * 0.5);
+    resXX.setValue(coherence_2 * (ik.getValue() + qk.getValue()));
+    resXY.setValue(coherence_2 * uv);
+    resYX.setValue(coherence_2 * conj(uv));
+    resYY.setValue(coherence_2 * (ik.getValue() - qk.getValue()));
 
     // Compute the perturbed values.
     enum PValues
     {
-        PV_I, PV_Q, PV_U, PV_V, PV_SI, PV_MAJOR, PV_MINOR, PV_PHI, N_PValues
+        PV_I, PV_Q, PV_U, PV_V, PV_MAJOR, PV_MINOR, PV_PHI, N_PValues
     };
 
-    const Result *pvSet[N_PValues] = {&ik, &qk, &uk, &vk, &si, &major, &minor,
-        &phi};
+    const Result *pvSet[N_PValues] = {&ik, &qk, &uk, &vk, &major, &minor, &phi};
     PValueSetIterator<N_PValues> pvIter(pvSet);
 
     while(!pvIter.atEnd())
     {
-        bool evalIQ = pvIter.hasPValue(PV_I) || pvIter.hasPValue(PV_Q)
-            || pvIter.hasPValue(PV_SI);
+        bool evalIQ = pvIter.hasPValue(PV_I) || pvIter.hasPValue(PV_Q);
         bool evalUV = pvIter.hasPValue(PV_U) || pvIter.hasPValue(PV_V);
         bool evalCoh = pvIter.hasPValue(PV_MAJOR) || pvIter.hasPValue(PV_MINOR)
             || pvIter.hasPValue(PV_PHI);
 
-        Matrix pvUV_2(uv_2);
-        Matrix pvCoh(coherence);
+        Matrix pvUV(uv);
+        Matrix pvCoh_2(coherence_2);
 
         if(evalUV)
         {
-            pvUV_2 = tocomplex(pvIter.value(PV_U), pvIter.value(PV_V)) * 0.5;
+            pvUV = tocomplex(pvIter.value(PV_U), pvIter.value(PV_V));
         }
 
         if(evalCoh)
         {
-            pvCoh = computeCoherence(request, uBaseline, vBaseline,
+            pvCoh_2 = computeCoherence(request, uBaseline, vBaseline,
                 pvIter.value(PV_MAJOR), pvIter.value(PV_MINOR),
-                pvIter.value(PV_PHI));
+                pvIter.value(PV_PHI)) * 0.5;
         }
 
         if(evalIQ || evalCoh)
         {
             const Matrix &pvI = pvIter.value(PV_I);
             const Matrix &pvQ = pvIter.value(PV_Q);
-            const Matrix &pvSI = pvIter.value(PV_SI);
 
-            resXX.setPerturbedValue(pvIter.key(), pvSI * pvCoh * (pvI + pvQ)
-                * 0.5);
-            resYY.setPerturbedValue(pvIter.key(), pvSI * pvCoh * (pvI - pvQ)
-                * 0.5);
+            resXX.setPerturbedValue(pvIter.key(), pvCoh_2 * (pvI + pvQ));
+            resYY.setPerturbedValue(pvIter.key(), pvCoh_2 * (pvI - pvQ));
         }
 
         if(evalUV || evalCoh)
         {
-            resXY.setPerturbedValue(pvIter.key(), pvUV_2 * pvCoh);
-            resYX.setPerturbedValue(pvIter.key(), conj(pvUV_2) * pvCoh);
+            resXY.setPerturbedValue(pvIter.key(), pvCoh_2 * pvUV);
+            resYX.setPerturbedValue(pvIter.key(), pvCoh_2 * conj(pvUV));
         }
 
         pvIter.next();
diff --git a/CEP/Calibration/BBSKernel/src/Expr/GaussianSource.cc b/CEP/Calibration/BBSKernel/src/Expr/GaussianSource.cc
index 9fc290ccae39e79fe077a5b338ba280dd40a5a8f..291b85d93961adc16db432276c421bdf878243bf 100644
--- a/CEP/Calibration/BBSKernel/src/Expr/GaussianSource.cc
+++ b/CEP/Calibration/BBSKernel/src/Expr/GaussianSource.cc
@@ -30,14 +30,13 @@ namespace BBS
 
 GaussianSource::GaussianSource(const string &name,
     const Expr &ra, const Expr &dec,
-    const Expr &I, const Expr &Q, const Expr &U, const Expr &V, const Expr &si,
+    const Expr &I, const Expr &Q, const Expr &U, const Expr &V,
     const Expr &major, const Expr &minor, const Expr &phi)
     :   Source(name, ra, dec),
         itsI(I),
         itsQ(Q),
         itsU(U),
         itsV(V),
-        itsSpectralIndex(si),
         itsMajor(major),
         itsMinor(minor),
         itsPhi(phi)
diff --git a/CEP/Calibration/BBSKernel/src/Expr/PointCoherence.cc b/CEP/Calibration/BBSKernel/src/Expr/PointCoherence.cc
index 322d5f0a0c82018764dc00652c3549b0e410128d..634649348c80b4061bb4c428829acca8cc14e16b 100644
--- a/CEP/Calibration/BBSKernel/src/Expr/PointCoherence.cc
+++ b/CEP/Calibration/BBSKernel/src/Expr/PointCoherence.cc
@@ -40,7 +40,6 @@ PointCoherence::PointCoherence(const PointSource::ConstPointer &source)
     addChild(source->getQ());
     addChild(source->getU());
     addChild(source->getV());
-    addChild(source->getSpectralIndex());
 }
 
 
@@ -61,39 +60,36 @@ JonesResult PointCoherence::getJResult(const Request &request)
     const Result& qk = getChild(1).getResultSynced(request, qkBuf);
     const Result& uk = getChild(2).getResultSynced(request, ukBuf);
     const Result& vk = getChild(3).getResultSynced(request, vkBuf);
-    const Result& si = getChild(4).getResultSynced(request, siBuf);
 
     // Compute main value.
-    Matrix uvk_2 = tocomplex(uk.getValue(), vk.getValue()) * 0.5;
-    resXX.setValue(si.getValue() * (ik.getValue() + qk.getValue()) * 0.5);
+    Matrix uvk_2 = 0.5 * tocomplex(uk.getValue(), vk.getValue());
+    resXX.setValue(0.5 * (ik.getValue() + qk.getValue()));
     resXY.setValue(uvk_2);
     resYX.setValue(conj(uvk_2));
-    resYY.setValue(si.getValue() * (ik.getValue() - qk.getValue()) * 0.5);
+    resYY.setValue(0.5 * (ik.getValue() - qk.getValue()));
 
     // Compute perturbed values.
     enum PValues
-    { PV_I, PV_Q, PV_U, PV_V, PV_SI, N_PValues };
+    { PV_I, PV_Q, PV_U, PV_V, N_PValues };
 
-    const Result *pvSet[N_PValues] = {&ik, &qk, &uk, &vk, &si};
+    const Result *pvSet[N_PValues] = {&ik, &qk, &uk, &vk};
     PValueSetIterator<N_PValues> pvIter(pvSet);
 
     while(!pvIter.atEnd())
     {
-        if(pvIter.hasPValue(PV_I) || pvIter.hasPValue(PV_Q)
-            || pvIter.hasPValue(PV_SI))
+        if(pvIter.hasPValue(PV_I) || pvIter.hasPValue(PV_Q))
         {
           const Matrix &pvI = pvIter.value(PV_I);
           const Matrix &pvQ = pvIter.value(PV_Q);
-          const Matrix &pvSI = pvIter.value(PV_SI);
-          resXX.setPerturbedValue(pvIter.key(), pvSI * (pvI + pvQ) * 0.5);
-          resYY.setPerturbedValue(pvIter.key(), pvSI * (pvI - pvQ) * 0.5);
+          resXX.setPerturbedValue(pvIter.key(), 0.5 * (pvI + pvQ));
+          resYY.setPerturbedValue(pvIter.key(), 0.5 * (pvI - pvQ));
         }
 
         if(pvIter.hasPValue(PV_U) || pvIter.hasPValue(PV_V))
         {
             const Matrix &pvU = pvIter.value(PV_U);
             const Matrix &pvV = pvIter.value(PV_V);
-            Matrix uvkp_2 = tocomplex(pvU, pvV) * 0.5;
+            Matrix uvkp_2 = 0.5 * tocomplex(pvU, pvV);
             resXY.setPerturbedValue(pvIter.key(), uvkp_2);
             resYX.setPerturbedValue(pvIter.key(), conj(uvkp_2));
         }
diff --git a/CEP/Calibration/BBSKernel/src/Expr/PointSource.cc b/CEP/Calibration/BBSKernel/src/Expr/PointSource.cc
index 47047dfe39502c1d58025bee4ed83065df46ee83..f16f4eae11f507cbf7a4455c1cc918066e135a7d 100644
--- a/CEP/Calibration/BBSKernel/src/Expr/PointSource.cc
+++ b/CEP/Calibration/BBSKernel/src/Expr/PointSource.cc
@@ -28,14 +28,13 @@ namespace LOFAR
 namespace BBS
 {
 
-PointSource::PointSource(const string& name, const Expr &ra, const Expr &dec,
-    const Expr &I, const Expr &Q, const Expr &U, const Expr &V, const Expr &si)
+PointSource::PointSource(const string &name, const Expr &ra, const Expr &dec,
+    const Expr &I, const Expr &Q, const Expr &U, const Expr &V)
     :   Source(name, ra, dec),
         itsI(I),
         itsQ(Q),
         itsU(U),
-        itsV(V),
-        itsSpectralIndex(si)
+        itsV(V)
 {
 }
 
diff --git a/CEP/Calibration/BBSKernel/src/Expr/SpectralIndex.cc b/CEP/Calibration/BBSKernel/src/Expr/SpectralIndex.cc
index 66597f9dd2b521173ba84226923f9b9699ac59e9..e33f7324f958824c339c7b2253ae16c845e537f9 100644
--- a/CEP/Calibration/BBSKernel/src/Expr/SpectralIndex.cc
+++ b/CEP/Calibration/BBSKernel/src/Expr/SpectralIndex.cc
@@ -36,11 +36,12 @@ Matrix SpectralIndex::getResultValue(const Request &request,
     ASSERT(args.size() == getChildCount());
 
     // Special case: No coefficients or a single real coefficient with value
-    // zero.
-    if(args.size() == 1 || (args.size() == 2 && !args.back()->isArray()
+    // zero. Return the Stokes parameter at the reference frequency in this
+    // case.
+    if(args.size() == 2 || (args.size() == 3 && !args.back()->isArray()
         && !args.back()->isComplex() && args.back()->getDouble() == 0.0))
     {
-        return Matrix(1.0);
+        return *args[1];
     }
 
     // Create a 2-D Matrix that contains the frequency for each sample. (We
@@ -59,8 +60,8 @@ Matrix SpectralIndex::getResultValue(const Request &request,
         }
     }
 
-    // Compute flux scale factor as:
-    // (v / v0) ^ (-1.0 * [c0 + c1 * log(v / v0) + c2 * log(v / v0)^2 + ...])
+    // Compute scale factor as:
+    // (v / v0) ^ (c0 + c1 * log(v / v0) + c2 * log(v / v0)^2 + ...)
     // Where v is the frequency and v0 is the reference frequency.
 
     // Compute log(v / v0).
@@ -69,13 +70,14 @@ Matrix SpectralIndex::getResultValue(const Request &request,
     // Compute c0 + log(v / v0) * c1 + log(v / v0)^2 * c2 + ... using Horner's
     // rule.
     Matrix exponent = *args.back();
-    for(unsigned int i = args.size() - 2; i >= 1; --i)
+    for(unsigned int i = args.size() - 2; i >= 2; --i)
     {
         exponent = exponent * base + *args[i];
     }
 
-    // Compute (v / v0) ^ -exponent.
-    return exp(base * (-exponent));
+    // Compute I0 * (v / v0) ^ exponent, where I0 is the value of the Stokes
+    // parameter at the reference frequency.
+    return *args[1] * exp(base * exponent);
 }
 
 } //# namespace BBS
diff --git a/CEP/Calibration/BBSKernel/src/Model.cc b/CEP/Calibration/BBSKernel/src/Model.cc
index fbe5a68c84699bafc76acc5df8310473d465eacf..2e0b8c9c1d4b34acc865c96f6f43fd24bfba3145 100644
--- a/CEP/Calibration/BBSKernel/src/Model.cc
+++ b/CEP/Calibration/BBSKernel/src/Model.cc
@@ -726,14 +726,13 @@ Source::Pointer Model::makeSource(const SourceInfo &source)
         {
             Expr ra = makeExprParm(SKY, "Ra:" + source.getName());
             Expr dec = makeExprParm(SKY, "Dec:" + source.getName());
-            Expr i = makeExprParm(SKY, "I:" + source.getName());
+            Expr i = makeSpectralIndex(source, "I");
             Expr q = makeExprParm(SKY, "Q:" + source.getName());
             Expr u = makeExprParm(SKY, "U:" + source.getName());
             Expr v = makeExprParm(SKY, "V:" + source.getName());
-            Expr spectral = makeSpectralIndex(source);
 
             return PointSource::Pointer(new PointSource(source.getName(),
-                ra, dec, i, q, u, v, spectral));
+                ra, dec, i, q, u, v));
         }
         break;
 
@@ -741,17 +740,16 @@ Source::Pointer Model::makeSource(const SourceInfo &source)
         {
             Expr ra = makeExprParm(SKY, "Ra:" + source.getName());
             Expr dec = makeExprParm(SKY, "Dec:" + source.getName());
-            Expr i = makeExprParm(SKY, "I:" + source.getName());
+            Expr i = makeSpectralIndex(source, "I");
             Expr q = makeExprParm(SKY, "Q:" + source.getName());
             Expr u = makeExprParm(SKY, "U:" + source.getName());
             Expr v = makeExprParm(SKY, "V:" + source.getName());
             Expr maj = makeExprParm(SKY, "Major:" + source.getName());
             Expr min = makeExprParm(SKY, "Minor:" + source.getName());
             Expr phi = makeExprParm(SKY, "Phi:" + source.getName());
-            Expr spectral = makeSpectralIndex(source);
 
             return GaussianSource::Pointer(new GaussianSource(source.getName(),
-                ra, dec, i, q, u, v, spectral, maj, min, phi));
+                ra, dec, i, q, u, v, maj, min, phi));
         }
         break;
 
@@ -763,14 +761,17 @@ Source::Pointer Model::makeSource(const SourceInfo &source)
     return Source::Pointer();
 }
 
-Expr Model::makeSpectralIndex(const SourceInfo &source)
+Expr Model::makeSpectralIndex(const SourceInfo &source,
+    const string &stokesParm)
 {
     unsigned int degree =
         static_cast<unsigned int>(ParmManager::instance().getDefaultValue(SKY,
             "SpectralIndexDegree:" + source.getName()));
 
-    Expr reference = makeExprParm(SKY, "ReferenceFrequency:"
-        + source.getName());
+    // Reference frequency.
+    Expr refFreq = makeExprParm(SKY, "ReferenceFrequency:" + source.getName());
+    // Stokes parameter value at the reference frequency.
+    Expr refStokes = makeExprParm(SKY, stokesParm + ":" + source.getName());
 
     vector<Expr> coefficients;
     coefficients.reserve(degree + 1);
@@ -781,7 +782,7 @@ Expr Model::makeSpectralIndex(const SourceInfo &source)
         coefficients.push_back(makeExprParm(SKY, name.str()));
     }
 
-    return Expr(new SpectralIndex(reference, coefficients.begin(),
+    return Expr(new SpectralIndex(refFreq, refStokes, coefficients.begin(),
         coefficients.end()));
 }