diff --git a/pvmfit.cc b/pvmfit.cc
index a8e6157fc30f2381bbfd62a5d5c1485052c142b2..93d707daa1dde2bf30cf8d8ee0b5b33455ffb09f 100644
--- a/pvmfit.cc
+++ b/pvmfit.cc
@@ -116,15 +116,29 @@ int main(int argc, char** argv)
 	  S(t+1)=data(i,j,k,t);
 
 	if(opts.modelnum.value()==1){
-	  PVM_single pvm(S,bvecs,bvals,opts.nfibres.value());
-	  pvm.fit();
+	  if (opts.cnonlinear.value()){
+	    PVM_single_c pvm(S,bvecs,bvals,opts.nfibres.value());
+	    pvm.fit();
 	  
-	  S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
-	  dvol(i-minx,j-miny,k-minz) = pvm.get_d();
-	  for(int f=0;f<opts.nfibres.value();f++){
-	    fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
-	    thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
-	    phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
+	    dvol(i-minx,j-miny,k-minz) = pvm.get_d();
+	    for(int f=0;f<opts.nfibres.value();f++){
+	      fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
+	      thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
+	      phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    }
+	  }
+	  else{
+	    PVM_single pvm(S,bvecs,bvals,opts.nfibres.value());
+	    pvm.fit();
+	  
+	    S0(i-minx,j-miny,k-minz)   = pvm.get_s0();
+	    dvol(i-minx,j-miny,k-minz) = pvm.get_d();
+	    for(int f=0;f<opts.nfibres.value();f++){
+	      fvol[f](i-minx,j-miny,k-minz)  = pvm.get_f(f+1);
+	      thvol[f](i-minx,j-miny,k-minz) = pvm.get_th(f+1);
+	      phvol[f](i-minx,j-miny,k-minz) = pvm.get_ph(f+1);
+	    }
 	  }
 	}
 	else{
diff --git a/pvmfitOptions.h b/pvmfitOptions.h
index bf7c7b2f82267dfeb1a374c5bfef2b384058a5e9..24deea979f61d8b939efed13b7938a4b39cb8e27 100644
--- a/pvmfitOptions.h
+++ b/pvmfitOptions.h
@@ -36,6 +36,8 @@ class pvmfitOptions {
   Option<string> bvalsfile;
   Option<int>    nfibres;
   Option<int>    modelnum;
+  Option<bool>   cnonlinear;
+
   bool parse_command_line(int argc, char** argv);
   
  private:
@@ -84,6 +86,9 @@ class pvmfitOptions {
    modelnum(string("--model"), 1,
 	     string("1:monoexponential;2:non mono-exponential"),
 	     false, requires_argument), 
+   cnonlinear(string("--cnonlinear"),false, 
+	      string("Apply constrained nonlinear optimization on the diffusivity, volume fractions and their sum"),
+	      false,no_argument),
    options("pvmfit", "pvmfit -k <datafile> -m <maskfile> -r <bvecsfile> -b <bvalsfile> [-n 2]\n")
    {
      
@@ -98,6 +103,7 @@ class pvmfitOptions {
        options.add(bvalsfile);
        options.add(nfibres);
        options.add(modelnum);
+       options.add(cnonlinear);
      }
      catch(X_OptionError& e) {
        options.usage();