diff --git a/v1/cmfits/fit_h2o.c b/v1/cmfits/fit_h2o.c
index 51b02ba97d74dc827d8346938a3f55de05d19522..4aad3c287512ac2ec5864e969c829b283a481e99 100644
--- a/v1/cmfits/fit_h2o.c
+++ b/v1/cmfits/fit_h2o.c
@@ -98,6 +98,8 @@ static char *info[] = {
   "     Weighted residual curves are written in DFT format.",
   " -svg=<Filename>",
   "     Fitted and measured TACs are plotted in specified SVG file.",
+  " -k2",
+  "     Save k2 in result file.",
   " -stdoptions", // List standard options like --help, -v, etc
   " ",
   "Example:",
@@ -135,6 +137,7 @@ int main(int argc, char **argv)
   int        doBootstrap=0, doSD=0, doCL=0; // 0=no, 1=yes
   int        per_dl=1; // 0 or 1
   int        flow_per_tissue=0; // 0: f=(1-Va)K1 ; 1: f=K1
+  int        save_k2=0;
   double     fitdur=-1.0;
   int        fittedparNr=0;
 
@@ -202,6 +205,8 @@ int main(int argc, char **argv)
       per_dl=0; continue;
     } else if(strcasecmp(cptr, "FPT")==0) {
       flow_per_tissue=1; continue;
+    } else if(strcasecmp(cptr, "K2")==0) {
+      save_k2=1; continue;
     } if(strncasecmp(cptr, "INPUT=", 6)==0) {
       strlcpy(inputfile, cptr+6, FILENAME_MAX); 
       if(strlen(inputfile)>0) continue;
@@ -242,22 +247,15 @@ int main(int argc, char **argv)
   if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
 
   /* Process other arguments, starting from the first non-option */
-  for(; ai<argc; ai++) {
-    if(!btacfile[0]) {
-      strlcpy(btacfile, argv[ai], FILENAME_MAX); continue;
-    } else if(!ttacfile[0]) {
-      strlcpy(ttacfile, argv[ai], FILENAME_MAX); continue;
-    } else if(fitdur<0) {
-      if(!atof_with_check(argv[ai], &fitdur) && fitdur>=0.0) continue;
-      fprintf(stderr, "Error: invalid fit time '%s'.\n", argv[ai]);
-      return(1);
-    } else if(!resfile[0]) {
-      strlcpy(resfile, argv[ai], FILENAME_MAX); continue;
-    }
-    /* we should never get this far */
-    fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]);
-    return(1);
+  if(ai<argc) {strlcpy(btacfile, argv[ai++], FILENAME_MAX);}
+  if(ai<argc) {strlcpy(ttacfile, argv[ai++], FILENAME_MAX);}
+  if(ai<argc) {
+    if(atof_with_check(argv[ai], &fitdur) || fitdur<0.0) {
+      fprintf(stderr, "Error: invalid fit time '%s'.\n", argv[ai]); return(1);}
+    ai++;
   }
+  if(ai<argc) {strlcpy(resfile, argv[ai++], FILENAME_MAX);}
+  if(ai<argc) {fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]); return(1);}
   if(doSD || doCL) doBootstrap=1; else doBootstrap=0;
 
   /* In verbose mode print arguments and options */
@@ -279,6 +277,7 @@ int main(int argc, char **argv)
     if(fVa>=0.0) printf("required_fVa := %g\n", fVa);
     if(fK1k2>=0.0) printf("required_fK1k2 := %g\n", fK1k2);
     if(!isnan(fDelay)) printf("required_fDelay := %g\n", fDelay);
+    printf("save_k2 := %d\n", save_k2);
     printf("lambda := %g [1/s]\n", lambda);
     fflush(stdout);
   }
@@ -493,7 +492,8 @@ int main(int argc, char **argv)
   res.time=time(NULL);
   /* Set parameter number, including also the extra "parameters"
      and the parameter names and units */
-  res.parNr=parNr+1;
+  res.parNr=parNr+1; // WSS
+  if(save_k2) res.parNr++;
   {
     int pi;
     pi=0; strcpy(res.parname[pi], "Flow"); 
@@ -504,6 +504,7 @@ int main(int argc, char **argv)
     if(per_dl==0) strcpy(res.parunit[pi], "ml/ml");
     else strcpy(res.parunit[pi], "%");
     pi++; strcpy(res.parname[pi], "delayT"); strcpy(res.parunit[pi], "sec");
+    if(save_k2) {pi++; strcpy(res.parname[pi], "k2"); strcpy(res.parunit[pi], "1/min");}
     pi++; strcpy(res.parname[pi], "WSS"); strcpy(res.parunit[pi], "");
   }
 
@@ -588,7 +589,7 @@ int main(int argc, char **argv)
       for(pi=0; pi<MAX_PARAMS; pi++) printf(" %g", res.voi[ri].parameter[pi]);
       printf(" -> WSS=%g\n", wss); fflush(stdout);
     }
-    res.voi[ri].parameter[parNr]=wss;
+    res.voi[ri].parameter[res.parNr-1]=wss;
 
     /* Bootstrap */
     if(doBootstrap) {
@@ -623,8 +624,11 @@ int main(int argc, char **argv)
 
     /* Set fitted parameters to understandable units */
     {
-      /* flow */
       double F, pWater, Va, delayT, f=60.; 
+      /* k2, if requested */
+      if(save_k2)
+        res.voi[ri].parameter[4]=60.0*res.voi[ri].parameter[0]/res.voi[ri].parameter[1];
+      /* flow */
       if(flow_per_tissue==0) f*=(1.0-res.voi[ri].parameter[2]);
       res.voi[ri].parameter[0]*=f;
       if(!isnan(res.voi[ri].cl1[0])) res.voi[ri].cl1[0]*=f;
diff --git a/v1/cmfits/test/fit_h2o/test_fit_h2o.sh b/v1/cmfits/test/fit_h2o/test_fit_h2o.sh
index 4f01a10459b93581872f4b3c5eae01ff61dca0b2..2cd9b1219b56fbe230abe0e1c6a0ba972c32c004 100644
--- a/v1/cmfits/test/fit_h2o/test_fit_h2o.sh
+++ b/v1/cmfits/test/fit_h2o/test_fit_h2o.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #: Title      : test_fit_h2o
-#: Date       : 2017-04-05
+#: Date       : 2018-02-18
 #: Author     : "Vesa Oikonen" <vesa.oikonen@utu.fi>
 #: Options    : None
 
@@ -13,17 +13,17 @@ fi
 
 PROGRAM=../../fit_h2o$EXT;
 
+if [ ! -f $PROGRAM ]; then
+  printf "Failed: executable does not exist.\n"
+  exit 1
+fi
+
 printf "=====================================================================\n"
 printf "creating test data for %s\n" $PROGRAM
 printf "=====================================================================\n"
 
 printf "\n verifying that required data exists \n"
 
-if [ ! -f $PROGRAM ]; then
-  printf "Failed: executable does not exist.\n"
-  exit 1
-fi
-
 if [ ! -f blood.dat ]; then
   printf "Failed: required data does not exist.\n"
   exit 1
@@ -208,6 +208,9 @@ printf "testing %s\n" $PROGRAM
 printf "=====================================================================\n"
 
 
+
+
+
 printf "\n 1.0.0 \n"
 printf " Test case: Fit simulated TACs with realistic range of parameters. \n"
 printf " Expected result: Result file is created, and results are close to correct. \n"
@@ -1112,6 +1115,53 @@ if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
 printf "\n passed. \n\n"
 
 
+
+
+
+
+printf "\n 7.1.0 \n"
+printf " Test case: Option -k2 with -fpt.\n"
+printf " Expected result: Correct k2 values are saved in results. \n\n"
+
+rm -f output.res
+$PROGRAM -k2 -fpt -delay=0 blood.bld quick.tac 0 output.res
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+parformat -f=ift output.res output.ift
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+iftisval -abs=0.001 output.ift k2 0.2083
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+iftisval -abs=0.01 output.ift Flow 20.833
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+printf "\n 7.1.1 \n"
+printf " Test case: Option -k2 without -fpt.\n"
+printf " Expected result: Correct k2 values are saved in results. \n\n"
+
+rm -f output.res
+$PROGRAM -k2 -delay=0 blood.bld quick.tac 0 output.res
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+parformat -f=ift output.res output.ift
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+iftisval -abs=0.001 output.ift k2 0.2083
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+iftisval -abs=0.01 output.ift Flow 20.417
+if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+
+
+
+
+
+
 printf "\n===================================================================\n"
 printf "   All passed! \n"
 printf "===================================================================\n"