--- a/src/mpv.cpp
+++ b/src/mpv.cpp
@@ -4,6 +4,7 @@
 # 1 "/usr/include/stdc-predef.h" 1 3 4
 # 1 "<command-line>" 2
 # 1 "mpv.cc"
+# 20 "mpv.cc"
 # 1 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/config.h" 1
 # 3085 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/config.h"
 extern "C" {
@@ -97,7 +98,7 @@
 
 typedef int octave_idx_type;
 # 3354 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/config.h" 2
-# 2 "mpv.cc" 2
+# 21 "mpv.cc" 2
 # 1 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/oct.h" 1
 # 31 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/oct.h"
 # 1 "/home/padupuis/usr/include/octave-3.8.0/octave/config.h" 1
@@ -68991,15 +68992,16 @@
 
 extern void maybe_missing_function_hook (const std::string& name);
 # 44 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/oct.h" 2
-# 3 "mpv.cc" 2
+# 22 "mpv.cc" 2
+
+
+
+# 1 "op-mp.h" 1
+# 23 "op-mp.h"
 # 1 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/ops.h" 1
 # 36 "/home/padupuis/usr/include/octave-3.8.0/octave/../octave/ops.h"
 extern void install_ops (void);
-# 4 "mpv.cc" 2
-
-static void oct_unop_s_incr (octave_base_value& a) { octave_TYPE ## _scalar& v = dynamic_cast<octave_TYPE ## _scalar&> (a); v.increment (); };
-
-
+# 24 "op-mp.h" 2
 
 # 1 "ov-mp.h" 1
 # 23 "ov-mp.h"
@@ -71064,15 +71066,12 @@
 public:
 
   octave_mp (void);
-  octave_mp (signed long si);
-  octave_mp (unsigned long ui);
+  octave_mp (signed long si, mpfr_prec_t sprec = mpfr_get_default_prec (), mpfr_rnd_t srnd = mpfr_get_default_rounding_mode ());
+
+  octave_mp (unsigned long ui, mpfr_prec_t sprec = mpfr_get_default_prec (), mpfr_rnd_t srnd = mpfr_get_default_rounding_mode ());
   octave_mp (const octave_mp& s);
-  octave_mp (const double& x);
-  octave_mp (const long double& x);
-  octave_mp (const double& x, const mpfr_prec_t prec);
-  octave_mp (const long double& x, const mpfr_prec_t prec);
-  octave_mp (const std::string& x);
-  octave_mp (const std::string& x, const mpfr_prec_t prec);
+  octave_mp (const double& x, mpfr_prec_t sprec = mpfr_get_default_prec (), mpfr_rnd_t srnd = mpfr_get_default_rounding_mode ());
+   octave_mp (const std::string& x, mpfr_prec_t sprec = mpfr_get_default_prec (), mpfr_rnd_t srnd = mpfr_get_default_rounding_mode ());
 
   ~octave_mp (void) { mpfr_clear (scalar); }
 
@@ -71082,6 +71081,8 @@
 
 
 
+
+  type_conv_info numeric_conversion_function (void) const;
 
   dim_vector dims (void) const { static dim_vector dv (1, 1); return dv; }
   int rows (void) const { return 1; }
@@ -71098,6 +71099,20 @@
   bool is_real_type (void) const { return true; }
   bool is_scalar_type (void) const { return true; }
   bool is_mp_type (void) const { return true; }
+
+
+  int mp_eq_proxy(const octave_mp& s) const
+  {
+    return mpfr_equal_p (scalar, s.scalar);
+  }
+
+  int mp_neq_proxy(const octave_mp& s) const
+  {
+    return !mpfr_equal_p (scalar, s.scalar);
+  }
+
+  octave_value oct_binop_proxy (const octave_base_value& a1, const octave_base_value& a2,
+                                int (*func) (mpfr_ptr rop, mpfr_srcptr op1, mpfr_srcptr op2, mpfr_rnd_t rnd));
 
   bool valid_as_scalar_index (void) const
   {
@@ -71114,7 +71129,7 @@
 
   bool is_true (void) const { return (((scalar)->_mpfr_exp > (2 - ((mpfr_exp_t) (((mpfr_uexp_t) -1) >> 1))))); }
 
-  double double_value (bool = false) const { return mpfr_get_d(scalar, rnd); }
+  double double_value (bool = false) const { return mpfr_get_d (scalar, rnd); }
 
   octave_value hermitian (void) const { return new octave_mp (*this); }
 
@@ -71123,6 +71138,8 @@
   void decrement (void) { mpfr_sub_ui(scalar, scalar, 1, rnd); }
 
   void print (std::ostream& os, bool pr_as_read_syntax = false) const;
+
+  octave_value map (unary_mapper_t umap) const;
 
 private:
 
@@ -71134,7 +71151,13 @@
 
   public: int type_id (void) const { return t_id; } std::string type_name (void) const { return t_name; } std::string class_name (void) const { return c_name; } static int static_type_id (void) { return t_id; } static std::string static_type_name (void) { return t_name; } static std::string static_class_name (void) { return c_name; } static void register_type (void); private: static int t_id; static const std::string t_name; static const std::string c_name;
 };
-# 10 "mpv.cc" 2
+# 26 "op-mp.h" 2
+
+void install_mp_ops();
+
+static void oct_unop_s_incr (octave_base_value& a) { octave_mp& v = dynamic_cast<octave_mp&> (a); v.increment (); }
+static void oct_unop_s_decr (octave_base_value& a) { octave_mp& v = dynamic_cast<octave_mp&> (a); v.decrement (); }
+# 26 "mpv.cc" 2
 
  octave_value_list Fmpv (const octave_value_list& args, int ); extern "C" octave_function * Gmpv (const octave_shlib& shl, bool relative) { octave_function *retval = 0; check_version ("api-v49+", "mpv"); if (! error_state) { octave_dld_function *fcn = octave_dld_function::create (Fmpv, shl, "mpv", "mp_val = mpv (val, [prec])\n\nCreates an multi-precision variable from VAL."); if (relative) fcn->mark_relative (); retval = fcn; } return retval; } octave_value_list Fmpv (const octave_value_list& args, int )
 
@@ -71152,15 +71175,15 @@
       (octave_pager_stream::stream ()) << "installing mp type at type-id = "
            << octave_mp::static_type_id () << "\n";
 
-      octave_value_typeinfo::register_non_const_unary_op (octave_value::increment, octave_mp::static_type_id (), oct_unop_incr);;
-
+
+
+      install_mp_ops();
 
       type_loaded = true;
 
     }
 
   octave_value retval;
-
 
   if (args.length () == 2)
     {