diff --git a/changelog.md b/changelog.md
index a34512d3a2dcba49f7992b61e3ebb8c1662df9f5..a879230411bcabe29138915f93a300440dffea74 100644
--- a/changelog.md
+++ b/changelog.md
@@ -4,7 +4,7 @@ Changes in tpcclib
 This is a concise list of changes; commit messages can be found in the
 [Git repository](https://gitlab.utu.fi/vesoik/tpcclib.git).
 
-## version 0.8.0 (2023-03-25, in development)
+## version 0.8.0 (2023-03-29, in development)
 
 - Removed all support for 32-bit platforms and compilers as unnecessary.
 - Removed all support for macOS due to lack of testing platform.
@@ -15,7 +15,7 @@ This is a concise list of changes; commit messages can be found in the
 - Application fit_ppf has new function GCDF.
 - Application htmlgall uses whole window width.
 - Added applications simelli, fit_suri, fitmtrap, imgmtrap, b2ptrap, taccbvp, imgcbvp, imgdelay,
-  imgflowm, and niinan.
+  imgflowm, niinan, and hist2svg.
 - Bug fix in applications dcmframe and tac2nii.
 
 ## version 0.7.9 (2022-12-22)
diff --git a/v2/tacutils/CMakeLists.txt b/v2/tacutils/CMakeLists.txt
index 81ac6c616a309bbf978b7f3baa6d6e8c5bc63bc3..53d46c8c085271586290cc15b46b952bac1c0a68 100644
--- a/v2/tacutils/CMakeLists.txt
+++ b/v2/tacutils/CMakeLists.txt
@@ -7,6 +7,7 @@ include_directories (${CMAKE_SOURCE_DIR}/v2/libtpcstatist)
 include_directories (${CMAKE_SOURCE_DIR}/v2/libtpccsv) 
 include_directories (${CMAKE_SOURCE_DIR}/v2/libtpcisotope) 
 include_directories (${CMAKE_SOURCE_DIR}/v2/libtpctac) 
+include_directories (${CMAKE_SOURCE_DIR}/v2/libtpctacmod) 
 
 # Make sure the linker can find the libraries once they are built. 
 link_directories (${CMAKE_BINARY_DIR}/v2/libtpcextensions) 
@@ -17,10 +18,12 @@ link_directories (${CMAKE_BINARY_DIR}/v2/libtpcstatist)
 link_directories (${CMAKE_BINARY_DIR}/v2/libtpccsv) 
 link_directories (${CMAKE_BINARY_DIR}/v2/libtpcisotope) 
 link_directories (${CMAKE_BINARY_DIR}/v2/libtpctac) 
+link_directories (${CMAKE_BINARY_DIR}/v2/libtpctacmod) 
 
 # Add executable that is built from the source file(s) 
 # The extensions are automatically found. 
 add_executable (avgttac avgttac.c) 
+add_executable (hist2svg hist2svg.c) 
 add_executable (interpol interpol.c) 
 add_executable (tac2xml tac2xml.c) 
 add_executable (tac4frpl tac4frpl.c) 
@@ -59,6 +62,7 @@ add_executable (tocr tocr.c)
 
 # Link the executable to the libraries. 
 target_link_libraries (avgttac tpcstatist tpcift tpccsv tpctac tpcextensions m)
+target_link_libraries (hist2svg tpctacmod tpcift tpctac tpcextensions m)
 target_link_libraries (interpol tpcstatist tpcli tpcift tpctac tpcextensions m)
 target_link_libraries (tac2xml tpcift tpctac tpcextensions m)
 target_link_libraries (tac4frpl tpcift tpctac tpcextensions m)
@@ -99,6 +103,7 @@ target_link_libraries (tocr tpctac tpcisotope tpcextensions m)
 install (
   PROGRAMS
   ${CMAKE_CURRENT_BINARY_DIR}/avgttac${CMAKE_EXECUTABLE_SUFFIX}
+  ${CMAKE_CURRENT_BINARY_DIR}/hist2svg${CMAKE_EXECUTABLE_SUFFIX}
   ${CMAKE_CURRENT_BINARY_DIR}/interpol${CMAKE_EXECUTABLE_SUFFIX}
   ${CMAKE_CURRENT_BINARY_DIR}/tac2xml${CMAKE_EXECUTABLE_SUFFIX}
   ${CMAKE_CURRENT_BINARY_DIR}/tac4frpl${CMAKE_EXECUTABLE_SUFFIX}
@@ -152,6 +157,7 @@ set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BIN
 #
 # Does the usage message work
 add_test(avgttacUsage avgttac "--help")
+add_test(hist2svgUsage hist2svg "--help")
 add_test(interpolUsage interpol "--help")
 add_test(tac2xmlUsage tac2xml "--help")
 add_test(tac4frplUsage tac4frpl "--help")
@@ -188,11 +194,12 @@ add_test(tactimeUsage tactime "--help")
 add_test(tacunitUsage tacunit "--help")
 add_test(tocrUsage tocr "--help")
 set_tests_properties(
-  avgttacUsage interpolUsage tac2xmlUsage tac4frplUsage tacaddUsage tacadd0Usage tacblendUsage
-  taccalcUsage taccatUsage taccrossUsage taccutUsage taccutyUsage tacdelUsage tacdelnaUsage
-  tacformatUsage tacframeUsage tacinvUsage tacjoinUsage taclistUsage taclnUsage
-  tacmatchUsage tacmidyUsage tacmsampUsage tacmultxUsage tacnamesUsage
-  tacp2fUsage tacrangeUsage tacrenUsage tacsetxUsage tacsetyUsage tacsortUsage tacsplitUsage
+  avgttacUsage hist2svgUsage interpolUsage tac2xmlUsage tac4frplUsage tacaddUsage
+  tacadd0Usage tacblendUsage taccalcUsage taccatUsage taccrossUsage taccutUsage
+  taccutyUsage tacdelUsage tacdelnaUsage tacformatUsage tacframeUsage 
+  tacinvUsage tacjoinUsage taclistUsage taclnUsage tacmatchUsage tacmidyUsage
+  tacmsampUsage tacmultxUsage tacnamesUsage tacp2fUsage tacrangeUsage
+  tacrenUsage tacsetxUsage tacsetyUsage tacsortUsage tacsplitUsage
   tacstudyUsage tactimeUsage tacunitUsage tocrUsage
   PROPERTIES PASS_REGULAR_EXPRESSION "Usage: *"
 )
@@ -205,6 +212,11 @@ add_test (
   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test/avgttac
   COMMAND bash "./test_avgttac.sh"
 )
+add_test (
+  NAME hist2svgTests
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test/hist2svg
+  COMMAND bash "./test_hist2svg.sh"
+)
 add_test (
   NAME interpolTests
   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test/interpol
diff --git a/v2/tacutils/hist2svg.c b/v2/tacutils/hist2svg.c
new file mode 100644
index 0000000000000000000000000000000000000000..72e9fbfc7a67a9ba8d50ce831ab024453a498eda
--- /dev/null
+++ b/v2/tacutils/hist2svg.c
@@ -0,0 +1,204 @@
+/** @file hist2svg.c
+ *  @brief Plot histogram from data given in TAC format.
+ *  @copyright (c) Turku PET Centre
+ *  @author Vesa Oikonen
+ */
+/// @cond
+/*****************************************************************************/
+#include "tpcclibConfig.h"
+/*****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+/*****************************************************************************/
+#include "tpcextensions.h"
+#include "tpcift.h"
+#include "tpctac.h"
+/*****************************************************************************/
+
+/*****************************************************************************/
+static char *info[] = {
+  "Plot histogram from data given in TAC format.",
+  " ",
+  "Usage: @P [options] datafile svgfile",
+  " ",
+  "Options:",
+  " -c=<Number>",
+  "     The dataset in file to use, in case there are several; by default 1.",
+  " -x1=<start of x axis>",
+  " -x2=<end of x axis>",
+  " -y1=<start of y axis>",
+  " -y2=<end of y axis>",
+  " -mt=\"<main title>\"",
+  "     User-specified string to set as main title.",
+  " -stdoptions", // List standard options like --help, -v, etc
+  " ",
+  "See also: tac2svg, imghist",
+  " ",
+  "Keywords: TAC, tool",
+  0};
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* Turn on the globbing of the command line, since it is disabled by default in
+   mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
+   In Unix&Linux wildcard command line processing is enabled by default. */
+/*
+#undef _CRT_glob
+#define _CRT_glob -1
+*/
+int _dowildcard = -1;
+/*****************************************************************************/
+
+/*****************************************************************************/
+/**
+ *  Main
+ */
+int main(int argc, char **argv)
+{
+  int ai, help=0, version=0, verbose=1;
+  char tacfile[FILENAME_MAX], svgfile[FILENAME_MAX];
+  char main_title[64];
+  double preset_xmin, preset_xmax, preset_ymin, preset_ymax;
+  int ci=0;
+
+  
+  /*
+   *  Get arguments
+   */
+  if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
+  tacfile[0]=svgfile[0]=(char)0;
+  main_title[0]=(char)0;
+  preset_xmin=preset_xmax=preset_ymin=preset_ymax=nan("");
+  /* Options */
+  for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
+    if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
+    char *cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
+    if(strncasecmp(cptr, "MT=", 3)==0) {
+      if(strncpyClean(main_title, cptr+3, 64)) continue;
+    } else if(strncasecmp(cptr, "X1=", 3)==0) {
+      if(atofCheck(cptr+3, &preset_xmin)==0) continue;
+    } else if(strncasecmp(cptr, "X2=", 3)==0) {
+      if(atofCheck(cptr+3, &preset_xmax)==0) continue;
+    } else if(strncasecmp(cptr, "Y1=", 3)==0) {
+      if(atofCheck(cptr+3, &preset_ymin)==0) continue;
+    } else if(strncasecmp(cptr, "Y2=", 3)==0) {
+      if(atofCheck(cptr+3, &preset_ymax)==0) continue;
+    } else if(strncasecmp(cptr, "C=", 2)==0) {
+      if(atoiCheck(cptr+2, &ci)==0 && ci>0) {ci--; continue;}
+    }
+    fprintf(stderr, "Error: invalid option '%s'\n", argv[ai]);
+    return(1);
+  } else break; // tac name argument may start with '-'
+
+  TPCSTATUS status; statusInit(&status);
+  statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
+  status.verbose=verbose-3;
+  
+  /* Print help or version? */
+  if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
+  if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
+  if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
+
+  /* The first argument (non-option) is the filename */
+  if(ai<argc) {strlcpy(tacfile, argv[ai], FILENAME_MAX); ai++;}
+  if(ai<argc) {strlcpy(svgfile, argv[ai], FILENAME_MAX); ai++;}
+  else {fprintf(stderr, "Error: missing filename.\n"); return(1);}
+  if(ai<argc) {fprintf(stderr, "Error: extra command-line argument.\n"); return(1);}
+  
+  if(preset_xmin>=preset_xmax || preset_ymin>=preset_ymax) {
+    fprintf(stderr, "Error: invalid axis range settings.\n"); return(1);}
+
+  /* In verbose mode print arguments and options */
+  if(verbose>1) {
+    printf("tacfile := %s\n", tacfile);
+    printf("svgfile := %s\n", svgfile);
+    if(main_title[0]) printf("main_title := %s\n", main_title);
+    if(isfinite(preset_xmin)) printf("preset_xmin := %g\n", preset_xmin);
+    if(isfinite(preset_xmax)) printf("preset_xmax := %g\n", preset_xmax);
+    if(isfinite(preset_ymin)) printf("preset_ymin := %g\n", preset_ymin);
+    if(isfinite(preset_ymax)) printf("preset_ymax := %g\n", preset_ymax);
+  }
+
+  /* Read the file */
+  if(verbose>1) printf("reading %s\n", tacfile);
+  TAC tac; tacInit(&tac);
+  tacRead(&tac, tacfile, &status);
+  if(status.error!=TPCERROR_OK) {
+    fprintf(stderr, "Error: %s\n", errorMsg(status.error));
+    tacFree(&tac); return(2);
+  }
+  if(verbose>2) {
+    printf("fileformat := %s\n", tacFormattxt(tac.format));
+    printf("tacNr := %d\n", tac.tacNr);
+    printf("sampleNr := %d\n", tac.sampleNr);
+    printf("frames := %d\n", tac.isframe);
+    if(tac.tacNr>1) printf("tac := %s\n", tac.c[ci].name);
+  }
+  if(tac.isframe) tacSetX(&tac, NULL);
+  if(ci>=tac.tacNr) {
+    fprintf(stderr, "Error: data file does not contain data set %d.\n", 1+ci);
+    tacFree(&tac); return(2);
+  }
+  /* Delete other datasets than the selected one */
+  if(tac.tacNr>1) {
+    for(int i=0; i<tac.tacNr; i++) if(i==ci) tac.c[i].sw=0; else tac.c[i].sw=1;
+    int i=tac.tacNr-1;
+    while(i>=0) {
+      if(tac.c[i].sw && tacDeleteTACC(&tac, i)!=TPCERROR_OK) {
+        fprintf(stderr, "Error: invalid data file.\n");
+        tacFree(&tac); return(2);
+      }
+      i--;
+    }
+  }
+
+  /* Determine the plot min and max values */
+  double xmin=nan(""), xmax=nan(""), ymin=nan(""), ymax=nan("");
+  if(tacXRange(&tac, &xmin, &xmax)) {
+    fprintf(stderr, "Error: invalid data x range.\n");
+    tacFree(&tac); return(2);
+  }
+  if(verbose>3) printf("data_xrange := %g %g\n", xmin, xmax);
+  if((isfinite(preset_xmin) && preset_xmin>=xmax) || (isfinite(preset_xmax) && preset_xmax<=xmin)) {
+    fprintf(stderr, "Error: invalid x axis range settings.\n");
+    tacFree(&tac); return(1);
+  }
+  if(isfinite(preset_xmin)) xmin=preset_xmin;
+  if(isfinite(preset_xmax)) xmax=preset_xmax;
+  /* Determine the plot min and max y values inside the x range */
+  if(tacYRangeInXRange(&tac, 0, xmin, xmax, &ymin, &ymax, NULL, NULL, NULL, NULL)) {
+    fprintf(stderr, "Error: invalid data y range.\n");
+    tacFree(&tac); return(2);
+  }
+  if(verbose>3) printf("data_yrange := %g %g\n", ymin, ymax);
+  if((isfinite(preset_ymin) && preset_ymin>=ymax) || (isfinite(preset_ymax) && preset_ymax<=ymin)) {
+    fprintf(stderr, "Error: invalid y axis range settings.\n");
+    tacFree(&tac); return(1);
+  }
+  if(ymin>0.0) ymin=0.0;
+  else if(ymax<0.0) ymax=0.0;
+  if(isfinite(preset_ymin)) ymin=preset_ymin;
+  if(isfinite(preset_ymax)) ymax=preset_ymax;
+  if(verbose>3) {
+    printf("plotted_xrange := %g %g\n", xmin, xmax);
+    printf("plotted_yrange := %g %g\n", ymin, ymax);
+  }
+
+
+  /* Plot */
+  tacPlotHistogramSVG(&tac, main_title, xmin, xmax, ymin, ymax, svgfile, &status);
+  if(status.error!=TPCERROR_OK) {
+    fprintf(stderr, "Error: %s\n", errorMsg(status.error));
+    tacFree(&tac); return(10);
+  }
+
+
+  tacFree(&tac);
+  return(0);
+}
+/*****************************************************************************/
+
+/*****************************************************************************/
+/// @endcond
diff --git a/v2/tacutils/test/hist2svg/test_hist2svg.sh b/v2/tacutils/test/hist2svg/test_hist2svg.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0d636028cb6a73f92b9a62071fe228077c0a07da
--- /dev/null
+++ b/v2/tacutils/test/hist2svg/test_hist2svg.sh
@@ -0,0 +1,306 @@
+#!/bin/bash
+#: Title      : test_hist2svg
+#: Date       : 2023-03-29
+#: Author     : "Vesa Oikonen" <vesa.oikonen@utu.fi>
+#: Options    : None
+
+# Set the name of executable to test
+if [ -n "${OS+1}" ] && [ "$OS" = "Windows_NT" ]; then
+EXT=.exe;
+else
+EXT=;
+fi
+PROGRAM=../../hist2svg$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 Making data for testing \n"
+
+
+if [ ! -f test.tac ] || [ ! -f test2.tac ] || [ ! -f test.dat ]; then
+  printf "start\tend\tH1\n" > test.tac
+  printf "0\t10\t20\n"     >> test.tac
+  printf "10\t20\t80\n"    >> test.tac
+  printf "20\t30\t40\n"    >> test.tac
+
+  printf "start\tend\tH1\tH2\n" > test2.tac
+  printf "0\t10\t20\t100\n"    >> test2.tac
+  printf "10\t20\t80\t0\n"     >> test2.tac
+  printf "20\t30\t40\t50\n"    >> test2.tac
+
+  printf "1\t0\n" > test.dat
+  printf "2\t0\n" >> test.dat
+  printf "3\t0\n" >> test.dat
+  printf "4\t0\n" >> test.dat
+  printf "5\t0\n" >> test.dat
+  printf "6\t5\n" >> test.dat
+  printf "7\t8\n" >> test.dat
+  printf "8\t0\n" >> test.dat
+  printf "9\t0\n" >> test.dat
+  printf "10\t0\n" >> test.dat
+  printf "11\t0\n" >> test.dat
+  printf "12\t0\n" >> test.dat
+  printf "13\t0\n" >> test.dat
+  printf "14\t0\n" >> test.dat
+  printf "15\t0\n" >> test.dat
+  printf "16\t0\n" >> test.dat
+  printf "17\t0\n" >> test.dat
+  printf "18\t0\n" >> test.dat
+  printf "19\t0\n" >> test.dat
+  printf "20\t0\n" >> test.dat
+  printf "21\t4\n" >> test.dat
+  printf "22\t10\n" >> test.dat
+  printf "23\t2\n" >> test.dat
+  printf "24\t0\n" >> test.dat
+  printf "25\t5\n" >> test.dat
+  printf "26\t0\n" >> test.dat
+  printf "27\t0\n" >> test.dat
+  printf "28\t0\n" >> test.dat
+  printf "29\t0\n" >> test.dat
+  printf "30\t0\n" >> test.dat
+  printf "31\t0\n" >> test.dat
+  printf "32\t0\n" >> test.dat
+  printf "33\t0\n" >> test.dat
+  printf "34\t0\n" >> test.dat
+  printf "35\t0\n" >> test.dat
+  printf "36\t0\n" >> test.dat
+  printf "37\t0\n" >> test.dat
+  printf "38\t0\n" >> test.dat
+  printf "39\t0\n" >> test.dat
+  printf "40\t0\n" >> test.dat
+fi
+
+
+
+
+printf "\n\n"
+printf "=====================================================================\n"
+printf "testing %s\n" $PROGRAM
+printf "=====================================================================\n"
+
+
+printf "\n 1.0.0 \n"
+printf " Test case: Simple data, no options. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h100.svg
+$PROGRAM test.dat h100.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h100.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.0.1 \n"
+printf " Test case: Optional title, increased ymax, reduced xmax. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h101.svg
+$PROGRAM -mt="Test 1.0.1" -y2=12 -x2=30 test.dat h101.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h101.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.0.2 \n"
+printf " Test case: Set x and y axis to start from negative. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h102.svg
+$PROGRAM -mt="Test 1.0.2" -x1=-5 -y1=-10 test.dat h102.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h102.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.0.3 \n"
+printf " Test case: Set x axis to start from positive. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h103.svg
+$PROGRAM -mt="Test 1.0.3" -x1=10 test.dat h103.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h103.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.0.4 \n"
+printf " Test case: Set y axis to start from positive. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h104.svg
+$PROGRAM -mt="Test 1.0.4" -y1=3 test.dat h104.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h104.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.0.5 \n"
+printf " Test case: Set y axis max to hide part of data. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h105.svg
+$PROGRAM -mt="Test 1.0.5" -y2=6 test.dat h105.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h105.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.1.0 \n"
+printf " Test case: Data is negative. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc test.dat x -1 temp.dat
+printf "\n ok \n"
+
+rm -f h110.svg
+$PROGRAM -c=1 temp.dat h110.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h110.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.2.0 \n"
+printf " Test case: Every data point is larger than zero. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc test.dat + 100 temp.dat
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+
+rm -f h120.svg
+$PROGRAM -mt="Test 1.2.0" temp.dat h120.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h120.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 1.2.1 \n"
+printf " Test case: Same but when data is negative. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc temp.dat x -1 temp2.dat
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+
+rm -f h121.svg
+$PROGRAM -mt="Test 1.2.1" temp2.dat h121.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h121.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+
+printf "\n 1.3.0 \n"
+printf " Test case: Data contains negative and positive values. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc test.dat - 3 temp.dat
+printf "\n ok \n"
+
+rm -f h130.svg
+$PROGRAM -c=1 temp.dat h130.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h130.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+
+printf "=====================================================================\n"
+
+printf "\n 2.0.0 \n"
+printf " Test case: PMOD formatted data with x1 and x2, no options. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h200.svg
+$PROGRAM test.tac h200.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h200.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 2.0.1 \n"
+printf " Test case: Set y axis max to hide part of data. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h201.svg
+$PROGRAM -mt="Test 2.0.1" -y2=60 test.tac h201.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h201.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 2.0.2 \n"
+printf " Test case: Set x axis to hide part rectagles from both sides. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h202.svg
+$PROGRAM -mt="Test 2.0.2" -x1=8 -x2=25 test.tac h202.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h202.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 2.1.0 \n"
+printf " Test case: File contains two datasets; the second one is selected. \n"
+printf " Expected result: Plot file created. \n\n"
+
+rm -f h210.svg
+$PROGRAM -c=2 test2.tac h210.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h210.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "\n 2.2.0 \n"
+printf " Test case: Data is negative. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc test2.tac x -1 temp.tac
+printf "\n ok \n"
+
+rm -f h220.svg
+$PROGRAM -c=2 temp.tac h220.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h220.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+
+printf "\n 2.2.1 \n"
+printf " Test case: Both negative and positive data. \n"
+printf " Expected result: Plot file created. \n\n"
+
+taccalc test2.tac - 30 temp.tac
+printf "\n ok \n"
+
+rm -f h221.svg
+$PROGRAM -c=1 temp.tac h221.svg
+if [ $? -ne 0 ] ; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n ok \n"
+if [ ! -f h221.svg ]; then printf "\nFailed!\n" ; exit 1 ; fi
+printf "\n passed. \n\n"
+
+
+printf "=====================================================================\n"
+printf "  All passed!\n"
+printf "=====================================================================\n"
+exit 0