diff --git a/src/dualplot.cpp b/src/dualplot.cpp
index 9cd5ad16701867fa4afc59203db07ec41f21f496..eebe5dc10eadb28e8e5f5d62d70a5e0e4197159c 100644
--- a/src/dualplot.cpp
+++ b/src/dualplot.cpp
@@ -31,37 +31,45 @@
 
 CRange::CRange(void)
 {
-    // initialize as infinite
-    flag = 1;
-    inf = 0;
-    sup = 0;
-    valid = 1;
+    inf = -INFINITY;
+    sup = +INFINITY;
 }
 	
 CRange::CRange( double infin, double supin )
 {
-    flag = 0;
+    if( infin > supin )
+        raise string( "invalid plot range" );
+    if( infin == supin )
+        raise string( "empty plot range" );
     inf = infin;
     sup = supin;
-    test();
 }	
 
-CRange::CRange(int flagin)
-{
-    flag = flagin;
-    inf = 0;
-    sup = 0;
-    valid = 1;
-}
-	
-
-char RangeDecode( const string& resp, CRange *rval );
-
 CRange::CRange( const string& text )
 {
     CRange rval;
     char ok;
+    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';
+
     ok = RangeDecode( text, &rval );
+
     if (ok!='v') {
         flag = 1;
         inf = 0;
@@ -121,25 +129,22 @@ bool CRange::empty() const
 
 bool CRange::finite() const
 {
-    return (!this->infinite() && !this->empty());
+    return inf!=-INFINITY && sup!=+INFINITY;
 }
 
 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)));
+    return inf <= val && val <= sup;
 }
 
 double CRange::relval(int logflag, double v) const
 {
-    if (flag&1 || flag&2) return 0;
+    if ( !finite() )
+        raise string( "undefined range" );
     if (logflag) {
-        if(inf<0 || v<0) return 0;
+        if(inf<0 || v<0)
+            // return 0;
+            raise string( "negative value in log range" );
         return (double) 
             (log(v/(double)inf) / log((double)sup/(double)inf));
     } else {
@@ -147,58 +152,17 @@ double CRange::relval(int logflag, double v) const
     }
 }
 
-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 )
+string CRange::str(void) const
 {
-    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';
-}
+    ret = "";
+    if( inf==-INFINITY )
+        ret += "*";
+    else
+        ret += strg(inf);
 
-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()) 
@@ -211,33 +175,19 @@ string CRange::str(void) const
         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 << "-";
-}
-
 
 //**************************************************************************//
 //*  CAxis                                                                 *//
 //**************************************************************************//
 
-void CAxis::Ask(const string& quest)
+void CAxis::Ask( const string& quest )
 {
     string def, in, in1, in2;
     CRange newR;
     while(1) {
         def = (log ? "log " : "") + R.str();
         // out = quest + " [" + def + "] ?"; so gehts leider(?) nicht 
-        in = sask(quest, def);
+        in = sask( quest, def );
 
         if        (in==def)
             return;
@@ -256,8 +206,6 @@ void CAxis::Ask(const string& quest)
 
         if (in!="") {
             newR = CRange(in);
-            if (!newR.valid)
-                continue;
             if (log && newR.inf<=0) {
                 printf("! log scale requires range above 0\n");
                 continue;
diff --git a/src/dualplot.h b/src/dualplot.h
index 8d87090835ffa3bf476280d030e4141da87c2a9a..ad5b0b5add30343da5f330acff1134fe4eda0cb3 100644
--- a/src/dualplot.h
+++ b/src/dualplot.h
@@ -21,18 +21,9 @@ class CRange {
 
     void Round(int logflag, double relmargin, double digits);
 
-    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;
-    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: