--- a/src/op-mp.cc
+++ b/src/op-mp.cc
@@ -28,31 +28,21 @@
 #include "ov-mp.h"
 #include "op-mp.h"
 
-// DEFBINOP_OP (add, mp, mp, +)
-
-octave_value octave_mp::oct_binop_add (const octave_base_value& a1, const octave_base_value& a2) { 
-  const octave_mp& v1 = dynamic_cast<const octave_mp&> (a1); 
-  const octave_mp& v2 = dynamic_cast<const octave_mp&> (a2); 
-
-  octave_mp* retval = new octave_mp(static_cast<long unsigned int>(0), v1.prec, v1.rnd); 
-  (void) mpfr_add(retval->scalar, v1.scalar, v2.scalar, v1.rnd);
-  return octave_value (retval);
- 
-}
-
-// DEFBINOP_OP (sub, mp, mp, -)
-// DEFBINOP_OP (mul, mp, mp, *)
+/* generate our own version of DEFBINOP */
 
 #if defined(DEFBINOP_OP)
 #undef DEFBINOP_OP
 #endif
 
-#define DEFBINOP_OP(name, t1, t2, op)           \
-  BINOPDECL (name, a1, a2)                      \
+#define DEFBINOP_OP(name, t1, t2, op)                                   \
+  BINOPDECL (name, a1, a2)                                              \
   {                                                                     \
-    CAST_BINOP_ARGS (const CONCAT2(octave_, t1)&, const CONCAT2(octave_, t2)&); \
-    return octave_value(v1. ## op (v2));                                \
+    octave_mp retval;                                                   \
+    return  retval.oct_binop_proxy (a1, a2, mpfr_ ## op);               \
   }
+DEFBINOP_OP (add, mp, mp, add)
+DEFBINOP_OP (sub, mp, mp, sub)
+DEFBINOP_OP (mul, mp, mp, mul)
 
 //DEFBINOP_OP (eq, mp, mp,  mp_eq_proxy)
 static octave_value oct_binop_eq (const octave_base_value& a1, const octave_base_value& a2) { 
@@ -95,5 +85,7 @@
   // INSTALL_BINOP (op_ne, octave_mp, octave_mp, ne);
   // INSTALL_BINOP (op_el_and, octave_mp, octave_mp, el_and);
   // INSTALL_BINOP (op_el_or, octave_mp, octave_mp, el_or);
-  INSTALL_BINOP (octave_mp::oct_binop, octave_mp, octave_mp, add);
+  INSTALL_BINOP (op_add, octave_mp, octave_mp, add);
+  INSTALL_BINOP (op_add, octave_double, octave_mp, add);
+  INSTALL_BINOP (op_add, octave_mp, octave_double, add);
 }