diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index b76b9a2692283475bffbcbe2658369121f72ca5c..3eafef2aec8168ff11e3371b653ba047568eb46c 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -8783,7 +8783,6 @@ PMOD_EXPORT void f_map(INT32 args)
 
              ref_push_string(literal_array_string);
              apply_low(o, f, 1);
-
              if (TYPEOF(Pike_sp[-1]) == T_ARRAY)
              {
 	       free_svalue(mysp-3);
@@ -9160,53 +9159,50 @@ PMOD_EXPORT void f_filter(INT32 args)
       case T_OBJECT:
 	 mysp=Pike_sp+3-args;
 
-	 push_svalue(mysp-3);
-	 push_constant_text("cast");
-	 f_arrow(2);
-	 if (!UNSAFE_IS_ZERO(Pike_sp-1))
 	 {
-	    pop_stack();
-
-	    ref_push_string(literal_array_string);
-	    /* FIXME: Object subtype! */
-	    safe_apply(mysp[-3].u.object,"cast",1);
-	    if (TYPEOF(Pike_sp[-1]) == T_ARRAY)
-	    {
-	       free_svalue(mysp-3);
-	       mysp[-3]=*(--Pike_sp);
-	       dmalloc_touch_svalue(Pike_sp);
-	       f_filter(args);
-	       return;
-	    }
-	    pop_stack();
-
-	    ref_push_string(literal_mapping_string);
-	    /* FIXME: Object subtype! */
-	    safe_apply(mysp[-3].u.object,"cast",1);
-	    if (TYPEOF(Pike_sp[-1]) == T_MAPPING)
-	    {
-	       free_svalue(mysp-3);
-	       mysp[-3]=*(--Pike_sp);
-	       dmalloc_touch_svalue(Pike_sp);
-	       f_filter(args);
-	       return;
-	    }
-	    pop_stack();
+            struct object *o = mysp[-3].u.object;
+            int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(mysp[-3])].prog,
+                              LFUN_CAST);
 
-	    ref_push_string(literal_multiset_string);
-	    /* FIXME: Object subtype! */
-	    safe_apply(mysp[-3].u.object,"cast",1);
-	    if (TYPEOF(Pike_sp[-1]) == T_MULTISET)
-	    {
-	       free_svalue(mysp-3);
-	       mysp[-3]=*(--Pike_sp);
-	       dmalloc_touch_svalue(Pike_sp);
-	       f_filter(args);
-	       return;
-	    }
-	    pop_stack();
+            if( f!=-1 )
+            {
+              ref_push_string(literal_array_string);
+              apply_low(o, f, 1);
+              if (TYPEOF(Pike_sp[-1]) == T_ARRAY)
+              {
+                free_svalue(mysp-3);
+                mysp[-3]=*(--Pike_sp);
+                dmalloc_touch_svalue(Pike_sp);
+                f_filter(args);
+                return;
+              }
+              pop_stack();
+
+              ref_push_string(literal_mapping_string);
+              apply_low(o, f, 1);
+              if (TYPEOF(Pike_sp[-1]) == T_MAPPING)
+              {
+                free_svalue(mysp-3);
+                mysp[-3]=*(--Pike_sp);
+                dmalloc_touch_svalue(Pike_sp);
+                f_filter(args);
+                return;
+              }
+              pop_stack();
+
+              ref_push_string(literal_multiset_string);
+              apply_low(o, f, 1);
+              if (TYPEOF(Pike_sp[-1]) == T_MULTISET)
+              {
+                free_svalue(mysp-3);
+                mysp[-3]=*(--Pike_sp);
+                dmalloc_touch_svalue(Pike_sp);
+                f_filter(args);
+                return;
+              }
+              pop_stack();
+            }
 	 }
-	 pop_stack();
 
 	 SIMPLE_BAD_ARG_ERROR("filter",1,
 			      "...|object that can be cast to array, multiset or mapping");