diff --git a/ChangeLog b/ChangeLog
index 9cc1ffb057486674423103a32e6e409b95c2ff67..f1a90b63b9845b037cd1e1fddd100a8ed29184e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -34,6 +34,7 @@ version 0.9.9 -- UNRELEASED
 	rsync:
 	 . Fix long rotation.
 	 . Make units clearer (Closes Redmine bug #2737)
+	 . Do arithmetic using bash rather than bc (Closes: #603173)
     helper changes
 	dup:
 	 . Fix separate signing key usecase. Thanks to Ian Beckwith for
diff --git a/handlers/rsync.in b/handlers/rsync.in
index d35445e524999e08c9fef3c99787d1eff440cc8c..d93411a7cdd7255578529a96cf08aff629c2f435 100644
--- a/handlers/rsync.in
+++ b/handlers/rsync.in
@@ -253,7 +253,7 @@ function eval_config {
     if [ -z "$days" ]; then
       keep="4"
     else
-      keep="`echo $days - 1 | bc -l`"
+      keep=$[$days - 1]
     fi
   fi
 
@@ -302,9 +302,9 @@ function rotate_short {
     $nice $mv /$folder.$keep /$folder.tmp
   fi
 
-  for ((n=`echo "$keep - 1" | bc`; n >= 0; n--)); do
+  for ((n=$[$keep - 1]; n >= 0; n--)); do
     if [ -d $folder.$n ]; then
-      dest=`echo "$n + 1" | bc`
+      dest=$[$n + 1]
       $nice $mv /$folder.$n /$folder.$dest
       $touch /$folder.$dest
       mkdir -p $metadata/`basename $folder`.$dest
diff --git a/handlers/wget b/handlers/wget
index ebb391e92e8c54f08053bab84a45c03bbe0ca48b..67425fc209e56233e152ebce95d452b10a1a8370 100644
--- a/handlers/wget
+++ b/handlers/wget
@@ -88,9 +88,9 @@ function rotate {
       $nice $mv /$1.$2 /$1.tmp
    fi
 
-   for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do
+   for ((n=$[$2 - 1]; n >= 0; n--)); do
       if [ -d $1.$n ]; then
-         dest=`echo "$n + 1" | bc`
+         dest=$[$n + 1]
          $nice $mv /$1.$n /$1.$dest
          $touch /$1.$dest
       fi
@@ -128,7 +128,7 @@ fi
 if [ -z "$days" ]; then
    keep="4"
 else
-   keep="`echo $days - 1 | bc -l`"
+   keep=$[$days - 1]
 fi
 
 # lockfile setup