diff --git a/ginac/inifcns_nstdsums.cpp b/ginac/inifcns_nstdsums.cpp
index 5f5949b..e1f4800 100644
--- a/ginac/inifcns_nstdsums.cpp
+++ b/ginac/inifcns_nstdsums.cpp
@@ -346,7 +346,11 @@ cln::cl_N Li_projection(int n, const cln::cl_N& x, const cln::float_format_t& pr
 		} else {
 			// choose the faster algorithm
 			if (cln::abs(cln::realpart(x)) > 0.75) {
-				return -Li2_do_sum(1-x) - cln::log(x) * cln::log(1-x) + cln::zeta(2);
+			        if ( x == 1 ) {
+				               return cln::zeta(2);
+				} else {
+				               return -Li2_do_sum(1-x) - cln::log(x) * cln::log(1-x) + cln::zeta(2);
+				}
 			} else {
 				return -Li2_do_sum_Xn(1-x) - cln::log(x) * cln::log(1-x) + cln::zeta(2);
 			}
@@ -368,7 +372,8 @@ cln::cl_N Li_projection(int n, const cln::cl_N& x, const cln::float_format_t& pr
 				return Lin_do_sum_Xn(n, x);
 			}
 		} else {
-			cln::cl_N result = -cln::expt(cln::log(x), n-1) * cln::log(1-x) / cln::factorial(n-1);
+		        cln::cl_N result = 0;
+			if ( x != 1 ) result = -cln::expt(cln::log(x), n-1) * cln::log(1-x) / cln::factorial(n-1);
 			for (int j=0; j<n-1; j++) {
 				result = result + (S_num(n-j-1, 1, 1) - S_num(1, n-j-1, 1-x))
 				                  * cln::expt(cln::log(x), j) / cln::factorial(j);
@@ -1196,9 +1201,14 @@ ex mLi_numeric(const lst& m, const lst& x)
 			s.push_back(1);
 		}
 		const cln::cl_N xi = ex_to<numeric>(*itx).to_cl_N();
-		newx.push_back(factor/xi);
 		factor = factor/xi;
-		s.push_back(1);
+		newx.push_back(factor);
+		if ( !instanceof(factor, cln::cl_R_ring) && imagpart(factor) < 0 ) {
+			s.push_back(-1);
+		}
+		else {
+			s.push_back(1);
+		}
 	}
 	return numeric(cln::cl_N(1 & m.nops() ? - 1 : 1)*G_numeric(newx, s, cln::cl_N(1)));
 }
@@ -1350,11 +1360,15 @@ static ex G3_evalf(const ex& x_, const ex& s_, const ex& y)
 			all_zero = false;
 		}
 		if ( ex_to<numeric>(*itx).is_real() ) {
-			if ( *its >= 0 ) {
-				sn.push_back(1);
-			}
-			else {
-				sn.push_back(-1);
+		        if ( ex_to<numeric>(*itx).is_positive() ) {
+			        if ( *its >= 0 ) {
+			                sn.push_back(1);
+				}
+				else {
+				        sn.push_back(-1);
+				}
+			} else {
+			          sn.push_back(1);
 			}
 		}
 		else {
@@ -1414,11 +1428,15 @@ static ex G3_eval(const ex& x_, const ex& s_, const ex& y)
 			all_zero = false;
 		}
 		if ( ex_to<numeric>(*itx).is_real() ) {
-			if ( *its >= 0 ) {
-				sn.push_back(1);
-			}
-			else {
-				sn.push_back(-1);
+		        if ( ex_to<numeric>(*itx).is_positive() ) {
+			        if ( *its >= 0 ) {
+			                sn.push_back(1);
+				}
+				else {
+				        sn.push_back(-1);
+				}
+			} else {
+			          sn.push_back(1);
 			}
 		}
 		else {
@@ -2026,7 +2044,9 @@ const cln::cl_N S_num(int n, int p, const cln::cl_N& x)
 		prec = cln::float_format(cln::the<cln::cl_F>(cln::imagpart(value)));
 
 	// [Kol] (5.3)
-	if ((cln::realpart(value) < -0.5) || (n == 0) || ((cln::abs(value) <= 1) && (cln::abs(value) > 0.95))) {
+	// the condition abs(1-value)>1 avoids an infinite recursion in the region abs(value)<=1 && abs(value)>0.95 && abs(1-value)<=1 && abs(1-value)>0.95
+	// we don't care here about abs(value)<1 && real(value)>0.5, this will be taken care of in S_projection
+	if ((cln::realpart(value) < -0.5) || (n == 0) || ((cln::abs(value) <= 1) && (cln::abs(value) > 0.95) && (cln::abs(1-value) > 1) )) {
 
 		cln::cl_N result = cln::expt(cln::cl_I(-1),p) * cln::expt(cln::log(value),n)
 		                   * cln::expt(cln::log(1-value),p) / cln::factorial(n) / cln::factorial(p);
@@ -2067,6 +2087,16 @@ const cln::cl_N S_num(int n, int p, const cln::cl_N& x)
 
 		return result;
 	}
+
+	if ((cln::abs(value) > 0.95) && (cln::abs(value-9.53) < 9.47)) {
+	  lst m;
+	  m.append(n+1);
+	  for (int s=0; s<p-1; s++) m.append(1);
+
+	  ex res = H(m,numeric(value)).evalf();
+
+	  return ex_to<numeric>(res).to_cl_N();
+	}
 	else {
 		return S_projection(n, p, value, prec);
 	}
@@ -3212,7 +3242,7 @@ static ex H_evalf(const ex& x1, const ex& x2)
 		// x -> 1/x
 		if (cln::abs(x) >= 2.0) {
 			map_trafo_H_1overx trafo;
-			res *= trafo(H(m, xtemp));
+			res *= trafo(H(m, xtemp).hold());
 			if (cln::imagpart(x) <= 0) {
 				res = res.subs(H_polesign == -I*Pi);
 			} else {
@@ -3227,7 +3257,7 @@ static ex H_evalf(const ex& x1, const ex& x2)
 		if (cln::abs(x-9.53) <= 9.47) {
 			// x -> (1-x)/(1+x)
 			map_trafo_H_1mxt1px trafo;
-			res *= trafo(H(m, xtemp));
+			res *= trafo(H(m, xtemp).hold());
 		} else {
 			// x -> 1-x
 			if (has_minus_one) {
@@ -3235,7 +3265,7 @@ static ex H_evalf(const ex& x1, const ex& x2)
 				return filter(H(m, numeric(x)).hold()).evalf();
 			}
 			map_trafo_H_1mx trafo;
-			res *= trafo(H(m, xtemp));
+			res *= trafo(H(m, xtemp).hold());
 		}
 
 		return res.subs(xtemp == numeric(x)).evalf();
