diff --git a/find/parser.c b/find/parser.c
index 889d437..cd20df7 100644
--- a/find/parser.c
+++ b/find/parser.c
@@ -2146,6 +2146,7 @@ new_insert_exec_ok (const char *action,
   our_pred = insert_primary_withpred (entry, func);
   our_pred->side_effects = our_pred->no_default_print = true;
   execp = &our_pred->args.exec_vec;
+  execp->state.wd = 0;
 
   if ((func != pred_okdir) && (func != pred_ok))
     {
diff --git a/find/pred.c b/find/pred.c
index ec8e94a..a27665a 100644
--- a/find/pred.c
+++ b/find/pred.c
@@ -457,6 +457,28 @@ new_impl_pred_exec (const char *pathname, struct stat *stat_buf,
   size_t len = strlen(pathname);
 
   (void) stat_buf;
+
+  if (execp->use_current_dir)
+    {
+      /* Workaround for the bug #find3:
+       * 1. cut the pathname at its basename
+       * 2. tell launch function to cwd into deepest directory possible 
+       *
+       * Here we do the 1st part
+       */
+      char *cut_slash = strrchr(pathname, '/');
+
+      if (cut_slash)
+        {
+          if (execp->state.wd == 0)
+            {
+              *cut_slash = 0;
+              execp->state.wd = open(pathname, O_RDONLY | O_DIRECTORY);
+              *cut_slash = '/';
+            }
+          pathname = cut_slash + 1; // cut at character next after last slash
+        }
+    }
   
   if (execp->multiple)
     {
@@ -1573,12 +1595,25 @@ launch (const struct buildcmd_control *ctl,
              _exit (1);
            }
        }
+      else if (buildstate->wd)
+        {
+          if(fchdir(buildstate->wd))
+            {
+              error (0, errno, "%s", buildstate->cmd_argv[0]);
+              _exit (1);
+            }
+        }
       
       execvp (buildstate->cmd_argv[0], buildstate->cmd_argv);
       error (0, errno, "%s", buildstate->cmd_argv[0]);
       _exit (1);
     }
 
+  if (buildstate->wd)
+    {
+      close(buildstate->wd);
+      buildstate->wd = 0;
+    }
 
   /* In parent; set up for next time. */
   bc_clear_args(ctl, buildstate);
diff --git a/lib/buildcmd.h b/lib/buildcmd.h
index 15f0418..614cc67 100644
--- a/lib/buildcmd.h
+++ b/lib/buildcmd.h
@@ -47,6 +47,9 @@ struct buildcmd_state
 
   /* to-do flag. */
   int todo;
+
+  /* working directory if non-zero */
+  int wd;
 };
