Index: trunk/BNC/combination/bnccomb.cpp
===================================================================
--- trunk/BNC/combination/bnccomb.cpp	(revision 3081)
+++ trunk/BNC/combination/bnccomb.cpp	(revision 3134)
@@ -31,4 +31,6 @@
 using namespace std;
 
+const int MAXPRN_GPS = 32;
+
 // Constructor
 ////////////////////////////////////////////////////////////////////////////
@@ -137,15 +139,13 @@
     it.next();
     cmbAC* AC = it.value();
-    if (AC->name != _masterAC) {
-      _params.push_back(new cmbParam(cmbParam::AC_offset, ++nextPar, 
-                                     AC->name, "", sigAC_0, sigAC_P));
-      for (int iGps = 1; iGps <= 32; iGps++) {
-        QString prn = QString("G%1").arg(iGps, 2, 10, QChar('0'));
-        _params.push_back(new cmbParam(cmbParam::Sat_offset, ++nextPar, 
-                                       AC->name, prn, sigSat_0, sigSat_P));
-      }
-    }
-  }
-  for (int iGps = 1; iGps <= 32; iGps++) {
+    _params.push_back(new cmbParam(cmbParam::AC_offset, ++nextPar, 
+                                   AC->name, "", sigAC_0, sigAC_P));
+    for (int iGps = 1; iGps <= MAXPRN_GPS; iGps++) {
+      QString prn = QString("G%1").arg(iGps, 2, 10, QChar('0'));
+      _params.push_back(new cmbParam(cmbParam::Sat_offset, ++nextPar, 
+                                     AC->name, prn, sigSat_0, sigSat_P));
+    }
+  }
+  for (int iGps = 1; iGps <= MAXPRN_GPS; iGps++) {
     QString prn = QString("G%1").arg(iGps, 2, 10, QChar('0'));
     _params.push_back(new cmbParam(cmbParam::clk, ++nextPar, "", prn,
@@ -598,7 +598,8 @@
 
   if (nObs > 0) {
-    Matrix         AA(nObs, nPar);
-    ColumnVector   ll(nObs);
-    DiagonalMatrix PP(nObs); PP = 1.0;
+    const int nCon = 2 + MAXPRN_GPS;
+    Matrix         AA(nObs+nCon, nPar);  AA = 0.0;
+    ColumnVector   ll(nObs+nCon);        ll = 0.0;
+    DiagonalMatrix PP(nObs+nCon);        PP = 1.0;
 
     int iObs = 0;
@@ -628,4 +629,37 @@
     }
 
+    // Regularization
+    // --------------
+    const double Ph = 1.e6;
+    int iCond = 1;
+    PP(nObs+iCond) = Ph;
+    for (int iPar = 1; iPar <= _params.size(); iPar++) {
+      cmbParam* pp = _params[iPar-1];
+      if      (pp->type == cmbParam::AC_offset) {
+        AA(nObs+iCond, iPar) = 1.0;
+      }
+    }
+
+    ++iCond;
+    PP(nObs+iCond) = Ph;
+    for (int iPar = 1; iPar <= _params.size(); iPar++) {
+      cmbParam* pp = _params[iPar-1];
+      if      (pp->type == cmbParam::clk) {
+        AA(nObs+iCond, iPar) = 1.0;
+      }
+    }
+
+    for (int iGps = 1; iGps <= MAXPRN_GPS; iGps++) {
+      ++iCond;
+      QString prn = QString("G%1").arg(iGps, 2, 10, QChar('0'));
+      PP(nObs+1+iGps) = Ph;
+      for (int iPar = 1; iPar <= _params.size(); iPar++) {
+        cmbParam* pp = _params[iPar-1];
+        if (pp->type == cmbParam::Sat_offset && pp->prn == prn) {
+          AA(nObs+iCond, iPar) = 1.0;
+        }
+      }
+    }
+
     const double MAXRES = 999.10;  // TODO: make it an option
 
