diff --git a/src/coord.cpp b/src/coord.cpp
index 4d6aa91201e768552af2c44d036a21eb6cd11399..fad1cf89b3626cf550d01e7250288a320e70c539 100644
--- a/src/coord.cpp
+++ b/src/coord.cpp
@@ -12,7 +12,6 @@ using namespace std;
 
 #include "mystd.h"
 #include "coord.h"
-#include "range.h"
 #include "gar.h"
 
 CCoord::CCoord(void)
diff --git a/src/dualplot.cpp b/src/dualplot.cpp
index 9a10befdc6ff382131ac9783f84a295506b28531..b192a5ee710dc33dc9dcfc8ff5954e5520771d5d 100644
--- a/src/dualplot.cpp
+++ b/src/dualplot.cpp
@@ -17,13 +17,242 @@
 #include "mystd.h"
 #include "plotaux.h"
 #include "coord.h"
-#include "readln.h"
+//#include "readln.h"
 #include "asi.h"
+#include "gar.h"
 #include "dualplot.h"
 
 #define PSMAX 10
 #define LINSIZ 80
 
+CRange::CRange(void)
+{
+	// initialize as infinite
+	flag = 1;
+	inf = 0;
+	sup = 0;
+	valid = 1;
+}
+	
+CRange::CRange( double infin, double supin )
+{
+	flag = 0;
+	inf = infin;
+	sup = supin;
+	test();
+}	
+
+CRange::CRange(int flagin)
+{
+	flag = flagin;
+	inf = 0;
+	sup = 0;
+	valid = 1;
+}
+	
+CRange::CRange(int flagin, double infin, double supin)
+{
+	flag = flagin;
+	inf = infin;
+	sup = supin;
+	test();
+}	
+
+char RangeDecode( const string& resp, CRange *rval );
+
+CRange::CRange( const string& text )
+{
+	CRange rval;
+	char ok;
+	ok = RangeDecode( text, &rval );
+	if (ok!='v') {
+		flag = 1;
+		inf = 0;
+		sup = 0;
+		valid = 0;
+	} else {
+		*this = rval;
+	}
+}
+
+CRange::~CRange(void)
+{
+}
+
+void CRange::Round(int logflag, double relmargin, double digits)
+{
+	if (!test())	
+		throw "Range::Round: illegal params: " + str();
+
+	if        (inf==sup) {
+		*this = CRange(inf-1., sup+1.);
+	} else if (finite()) {
+		double margin = relmargin * (sup - inf);
+		double mydigits = digits;
+		double inf2, sup2;
+		do {
+			if (mydigits>=8.5) return; // do not round
+			sup2 = mystd::round_decimal( sup+margin, mydigits );
+			inf2 = mystd::round_decimal( inf-margin, mydigits );
+			if(sup<0 && sup2>0) sup2 = 0;
+			if(inf2<0 && inf>0) inf2 = 0;
+			mydigits += 0.5;
+		} while (!((inf2<inf) && (sup<sup2)));
+		*this = CRange(inf2, sup2);
+	}
+}	
+
+bool CRange::infinite() const
+{
+	return (flag&1);
+}
+
+bool CRange::empty() const
+{
+	return (flag&2 || inf>sup || ((flag&4 || flag&8) && inf==sup));
+}
+
+bool CRange::finite() const
+{
+	return (!this->infinite() && !this->empty());
+}
+
+bool CRange::contained(double val)  const
+{
+	if (this->infinite())
+		return 1;
+	else if (this->empty())
+		return 0;
+	else
+		return ((inf<val || (!(flag&4) && inf==val)) &&
+			(sup>val || (!(flag&8) && sup==val)));
+}
+
+bool CRange::overlap(const CRange& T2) const
+{
+	if      (empty() || T2.empty())
+		return 0;
+	else if (infinite() || T2.infinite())
+		return 1;
+	else
+		return (contained(T2.inf) || contained(T2.sup) ||
+			T2.contained(inf) || T2.contained(sup));
+}
+
+double CRange::relval(int logflag, double v) const
+{
+	if (flag&1 || flag&2) return 0;
+	if (logflag) {
+		if(inf<0 || v<0) return 0;
+		return (double) 
+		    (log(v/(double)inf) / log((double)sup/(double)inf));
+	} else {
+		return (v-inf) / (sup-inf);
+	}
+}
+
+CRange CRange::operator*(const CRange& R)
+{
+	CRange Z;
+	if        (infinite() || R.infinite()) {
+		Z.flag = 1;
+	} else if (R.empty()) {
+		Z = *this;
+	} else if (empty()) {
+		Z = R;
+	} else {
+		// cout << " input: " << *this << " * " << R;
+		Z = CRange(min(inf, R.inf), max(sup, R.sup));
+		// Z.flag4 = ..
+		// Z.flag8 = ..
+		// cout << " output : " << Z << endl;
+	}
+	return Z;
+}
+
+CRange CRange::operator*=(const CRange& R)
+{
+	CRange Z = *this * R;
+	return *this = Z;
+}
+
+bool CRange::test(void) 
+{
+	return valid = (inf<=sup || flag&1 || flag&2);
+}
+
+const char * CRange::helptext =
+        "a floating-point range:\n"
+        "   -> <x> <y> for a closed interval (x y)\n"
+	"   -> -       for an empty range\n"
+	"   -> *       for an infinite range\n";
+
+char RangeDecode( const string& resp, CRange *rval )
+{
+	double r1, r2;
+	if        ( resp=="" ) {
+		return 'd';
+	} else if ( resp=="*" ) {
+		*rval = CRange(1);
+		return 'v';
+	} else if ( resp=="-" ) {
+		*rval = CRange(2);
+		return 'v';
+	}
+	string s1, s2;
+        mystd::string_extract_word(string(resp), &s1, &s2);
+	if (!mystd::any2dbl(s1,&r1) && !mystd::any2dbl(s2,&r2)) {
+		*rval = CRange(r1, r2);
+		if (!rval->test()) return 'h';
+		return 'v';
+	}
+	return 'h';
+}
+
+CRange CRange::Ask( const string& quest )
+{
+	return Ask(quest, 0, CRange());
+}
+
+CRange CRange::Ask( const string& quest, const CRange& Def )
+{
+	return Ask(quest, 1, Def);
+}
+
+CRange CRange::Ask( const string& quest, const bool defflag,
+	const CRange& Def)
+{
+	*this = myask( quest, defflag, Def, helptext, RangeDecode );
+	return *this;
+}
+
+string CRange::str(void) const
+{
+	if      (!valid)
+		return "<invalid range>";
+	else if (finite()) 
+		return ((flag&4) ? ")" : "(")
+			+ strg(inf) + " " + strg(sup)
+			+ ((flag&8) ? "(" : ")");
+	else if (infinite())
+		return "*";
+	else
+		return "-";
+}
+
+ostream& operator<< (ostream &s, const CRange& R)
+{
+	if      (!R.valid)
+		return s << "<invalid range>";
+	else if (R.finite()) 
+		return s << ((R.flag&4) ? ")" : "(")
+			 << R.inf << " " << R.sup 
+			 << ((R.flag&8) ? "(" : ")");
+	else if (R.infinite())
+		return s << "*";
+	else
+		return s << "-";
+}
 
 namespace NPlot {
     CAxis X, Y;
diff --git a/src/dualplot.h b/src/dualplot.h
index 7c8422630c6e8024b51ff76ac60ff369d034f2bc..88d242f7d07272c360ddb0e30a5c1d637c6b49ec 100644
--- a/src/dualplot.h
+++ b/src/dualplot.h
@@ -1,4 +1,46 @@
-#include "range.h"
+class CRange {
+ public:
+	int flag; // 1: infinite, 2: empty, 4: exclude_inf, 8: exclude_sup
+	double inf, sup;
+	bool valid;
+
+	CRange(void);
+	CRange(int flagin);
+	CRange(double infin, double supin);
+	CRange(int flagin, double infin, double supin);
+	CRange(const string& text);
+	~CRange(void);
+
+	bool test(void);
+
+	bool infinite() const;
+	bool empty() const;
+	bool finite() const;
+
+	bool contained(double val) const;
+	bool overlap(const CRange& T2) const;
+	double relval(int logflag, double v) const;
+	double inf_pos(void);
+
+	void Round(int logflag, double relmargin, double digits);
+
+	CRange operator*(const CRange& R); // Vereinigungsmenge
+	CRange operator*=(const CRange& R);
+
+	CRange Ask( const string& quest);
+	CRange Ask( const string& quest, const CRange& Def);
+	CRange Ask( const string& quest, bool defflag, const CRange& Def);
+	string str(void) const;
+	inline const char* c_str(void) const
+		{ return str().c_str(); };
+	friend ostream& operator<< (ostream &s, const CRange& R);
+
+ private:
+	static const char* helptext;
+};
+
+inline string strg(const CRange& R) { return R.str(); };
+
 
 class CAxis {
  public:
diff --git a/src/range.cpp b/src/range.cpp
deleted file mode 100644
index 1d13784250e14ecb37325012cb24a2851f1d1eea..0000000000000000000000000000000000000000
--- a/src/range.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-// This is range.cpp.
-//
-// uses preprocessor templates to define CRange and CLimits:
-
-#include <math.h>
-#include <string.h>
-#include <iostream>
-#include <algorithm>
-
-#include "mystd.h"
-#include "range.h"
-#include "gar.h"
-
-using namespace std;
-
-#define _CRANGE
-#define T_CLASS CRange
-#define T_TYPE  double
-#define ANY2TYP  any2dbl
-#define O_CLASS CLimits
-#define T_FORM "%lg"
-#define T_INFO "a floating-point range"
-#include "range.cpp.tpl"
-#undef  _CRANGE
-#undef T_CLASS 
-#undef T_TYPE  
-#undef ANY2TYP
-#undef O_CLASS 
-#undef T_FORM
-#undef T_INFO
diff --git a/src/range.cpp.tpl b/src/range.cpp.tpl
deleted file mode 100644
index a53baab04787fe46ac8047865bc4ce5c9ef07eaf..0000000000000000000000000000000000000000
--- a/src/range.cpp.tpl
+++ /dev/null
@@ -1,277 +0,0 @@
-//**************************************************************************//
-//* FRIDA: fast reliable interactive data analysis                         *//
-//* range.cpp.tpl, to be included by range.cpp                             *//
-//* (C) Joachim Wuttke 1990-, v2(C++) 2001-                                *//
-//* http://frida.sourceforge.net                                           *//
-//**************************************************************************//
-
-
-T_CLASS::T_CLASS(void)
-{
-	// initialize as infinite
-	flag = 1;
-	inf = 0;
-	sup = 0;
-	valid = 1;
-}
-	
-T_CLASS::T_CLASS(T_TYPE infin, T_TYPE supin)
-{
-	flag = 0;
-	inf = infin;
-	sup = supin;
-	test();
-}	
-
-T_CLASS::T_CLASS(int flagin)
-{
-	flag = flagin;
-	inf = 0;
-	sup = 0;
-	valid = 1;
-}
-	
-T_CLASS::T_CLASS(int flagin, T_TYPE infin, T_TYPE supin)
-{
-	flag = flagin;
-	inf = infin;
-	sup = supin;
-	test();
-}	
-
-char RangeDecode( const string& resp, T_CLASS *rval );
-
-T_CLASS::T_CLASS( const string& text )
-{
-	T_CLASS rval;
-	char ok;
-	ok = RangeDecode( text, &rval );
-	if (ok!='v') {
-		flag = 1;
-		inf = 0;
-		sup = 0;
-		valid = 0;
-	} else {
-		*this = rval;
-	}
-}
-
-T_CLASS::~T_CLASS(void)
-{
-}
-
-#ifdef _CRANGE
-void T_CLASS::Round(int logflag, double relmargin, double digits)
-{
-	if (!test())	
-		throw "Range::Round: illegal params: " + str();
-
-	if        (inf==sup) {
-		*this = T_CLASS(inf-1., sup+1.);
-	} else if (finite()) {
-		double margin = relmargin * (sup - inf);
-		double mydigits = digits;
-		T_TYPE inf2, sup2;
-		do {
-			if (mydigits>=8.5) return; // do not round
-			sup2 = mystd::round_decimal( sup+margin, mydigits );
-			inf2 = mystd::round_decimal( inf-margin, mydigits );
-			if(sup<0 && sup2>0) sup2 = 0;
-			if(inf2<0 && inf>0) inf2 = 0;
-			mydigits += 0.5;
-		} while (!((inf2<inf) && (sup<sup2)));
-		*this = T_CLASS(inf2, sup2);
-	}
-}	
-#endif
-
-bool T_CLASS::infinite() const
-{
-	return (flag&1);
-}
-
-bool T_CLASS::empty() const
-{
-	return (flag&2 || inf>sup || ((flag&4 || flag&8) && inf==sup));
-}
-
-bool T_CLASS::finite() const
-{
-	return (!this->infinite() && !this->empty());
-}
-
-bool T_CLASS::contained(double val)  const
-{
-	if (this->infinite())
-		return 1;
-	else if (this->empty())
-		return 0;
-	else
-		return ((inf<val || (!(flag&4) && inf==val)) &&
-			(sup>val || (!(flag&8) && sup==val)));
-}
-
-#ifdef _CLIMITS
-bool T_CLASS::contained(int val) const
-{
-	if (this->infinite())
-		return 1;
-	else if (this->empty())
-		return 0;
-	else
-		return ((inf<val || (!(flag&4) && inf==val)) &&
-			(sup>val || (!(flag&8) && sup==val)));
-}
-#endif
-
-bool T_CLASS::overlap(const T_CLASS& T2) const
-{
-	if      (empty() || T2.empty())
-		return 0;
-	else if (infinite() || T2.infinite())
-		return 1;
-	else
-		return (contained(T2.inf) || contained(T2.sup) ||
-			T2.contained(inf) || T2.contained(sup));
-}
-
-double T_CLASS::relval(int logflag, double v) const
-{
-	if (flag&1 || flag&2) return 0;
-	if (logflag) {
-		if(inf<0 || v<0) return 0;
-		return (T_TYPE) 
-		    (log(v/(double)inf) / log((double)sup/(double)inf));
-	} else {
-		return (v-inf) / (sup-inf);
-	}
-}
-
-T_CLASS T_CLASS::operator*(const T_CLASS& R)
-{
-	T_CLASS Z;
-	if        (infinite() || R.infinite()) {
-		Z.flag = 1;
-	} else if (R.empty()) {
-		Z = *this;
-	} else if (empty()) {
-		Z = R;
-	} else {
-		// cout << " input: " << *this << " * " << R;
-		Z = T_CLASS(min(inf, R.inf), max(sup, R.sup));
-		// Z.flag4 = ..
-		// Z.flag8 = ..
-		// cout << " output : " << Z << endl;
-	}
-	return Z;
-}
-
-T_CLASS T_CLASS::operator*=(const T_CLASS& R)
-{
-	T_CLASS Z = *this * R;
-	return *this = Z;
-}
-	
-T_CLASS T_CLASS::operator+=(const T_TYPE shift)
-{
-	if (finite()) {
-		inf += shift;
-		sup += shift;
-	}
-	return *this;
-}
-	
-T_CLASS T_CLASS::operator-=(const T_TYPE shift)
-{
-	return (*this += -shift);
-}
-
-T_CLASS T_CLASS::operator+(const T_TYPE shift)
-{
-	T_CLASS Z = *this;;
-	return (Z += shift);
-}
-
-T_CLASS T_CLASS::operator-(const T_TYPE shift)
-{
-	T_CLASS Z = *this;
-	return (Z -= shift);
-}
-
-bool T_CLASS::test(void) 
-{
-	return valid = (inf<=sup || flag&1 || flag&2);
-}
-
-const char * T_CLASS::helptext =
-        T_INFO ":\n"
-        "   -> <x> <y> for a closed interval (x y)\n"
-	"   -> -       for an empty range\n"
-	"   -> *       for an infinite range\n";
-
-char RangeDecode( const string& resp, T_CLASS *rval )
-{
-	T_TYPE r1, r2;
-	if        ( resp=="" ) {
-		return 'd';
-	} else if ( resp=="*" ) {
-		*rval = T_CLASS(1);
-		return 'v';
-	} else if ( resp=="-" ) {
-		*rval = T_CLASS(2);
-		return 'v';
-	}
-	string s1, s2;
-        mystd::string_extract_word(string(resp), &s1, &s2);
-	if (!mystd::ANY2TYP(s1,&r1) && !mystd::ANY2TYP(s2,&r2)) {
-		*rval = T_CLASS(r1, r2);
-		if (!rval->test()) return 'h';
-		return 'v';
-	}
-	return 'h';
-}
-
-T_CLASS T_CLASS::Ask( const string& quest )
-{
-	return Ask(quest, 0, T_CLASS());
-}
-
-T_CLASS T_CLASS::Ask( const string& quest, const T_CLASS& Def )
-{
-	return Ask(quest, 1, Def);
-}
-
-T_CLASS T_CLASS::Ask( const string& quest, const bool defflag,
-	const T_CLASS& Def)
-{
-	*this = myask( quest, defflag, Def, helptext, RangeDecode );
-	return *this;
-}
-
-string T_CLASS::str(void) const
-{
-	if      (!valid)
-		return "<invalid range>";
-	else if (finite()) 
-		return ((flag&4) ? ")" : "(")
-			+ strg(inf) + " " + strg(sup)
-			+ ((flag&8) ? "(" : ")");
-	else if (infinite())
-		return "*";
-	else
-		return "-";
-}
-
-ostream& operator<< (ostream &s, const T_CLASS& R)
-{
-	if      (!R.valid)
-		return s << "<invalid range>";
-	else if (R.finite()) 
-		return s << ((R.flag&4) ? ")" : "(")
-			 << R.inf << " " << R.sup 
-			 << ((R.flag&8) ? "(" : ")");
-	else if (R.infinite())
-		return s << "*";
-	else
-		return s << "-";
-}
diff --git a/src/range.h b/src/range.h
deleted file mode 100644
index 3ab226c67668ff8323b914d7338cc7334b6f70cf..0000000000000000000000000000000000000000
--- a/src/range.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef H_RANGE
-
-#define H_RANGE
-
-#define _CRANGE
-#define T_CLASS CRange
-#define T_TYPE  double
-#define O_CLASS CLimits
-#include "range.h.tpl"
-#undef  _CRANGE
-#undef T_CLASS 
-#undef T_TYPE  
-#undef O_CLASS 
-
-#endif // H_RANGE
diff --git a/src/range.h.tpl b/src/range.h.tpl
deleted file mode 100644
index 5d9023ea15c6d3ad17e7f94270eeba1c971c43ea..0000000000000000000000000000000000000000
--- a/src/range.h.tpl
+++ /dev/null
@@ -1,58 +0,0 @@
-// This is range.tpl.h, #include'd by range.h
-
-class T_CLASS {
- public:
-	int flag; // 1: infinite, 2: empty, 4: exclude_inf, 8: exclude_sup
-	T_TYPE inf, sup;
-	bool valid;
-
-	T_CLASS(void);
-	T_CLASS(int flagin);
-	T_CLASS(T_TYPE infin, T_TYPE supin);
-	T_CLASS(int flagin, T_TYPE infin, T_TYPE supin);
-	T_CLASS(const string& text);
-	~T_CLASS(void);
-
-	bool test(void);
-
-	bool infinite() const;
-	bool empty() const;
-	bool finite() const;
-
-	bool contained(double val) const;
-#ifdef _CLIMITS
-	bool contained(int val) const;
-#endif
-	bool overlap(const T_CLASS& T2) const;
-	double relval(int logflag, double v) const;
-	T_TYPE inf_pos(void);
-
-#ifdef _CRANGE
-	void Round(int logflag, double relmargin, double digits);
-#endif
-
-	T_CLASS operator*(const T_CLASS& R); // Vereinigungsmenge
-	T_CLASS operator*=(const T_CLASS& R);
-	T_CLASS operator+(const T_TYPE); // shift
-	T_CLASS operator+=(const T_TYPE); 
-	T_CLASS operator-(const T_TYPE); 
-	T_CLASS operator-=(const T_TYPE);
-
-	T_CLASS Ask( const string& quest);
-	T_CLASS Ask( const string& quest, const T_CLASS& Def);
-	T_CLASS Ask( const string& quest, bool defflag, const T_CLASS& Def);
-	string str(void) const;
-	inline const char* c_str(void) const
-		{ return str().c_str(); };
-	friend ostream& operator<< (ostream &s, const T_CLASS& R);
-
- private:
-	static const char* helptext;
-};
-
-inline string strg(const T_CLASS& R) { return R.str(); };
-
-
-
-
-
diff --git a/src/scan.cpp b/src/scan.cpp
index ee105e9129c1592ce7a2984086cf46346958c678..6dad2b0db1fd100d92fbeb5b6e066e559612e3b1 100644
--- a/src/scan.cpp
+++ b/src/scan.cpp
@@ -12,7 +12,6 @@
 #include <iostream>
 
 #include "mystd.h"
-#include "range.h"
 #include "scan.h"