diff --git a/swig/bytes.i b/swig/bytes.i
index 8dd957a..aad50b5 100644
--- a/swig/bytes.i
+++ b/swig/bytes.i
@@ -73,4 +73,46 @@
%clear(const void *buf, size_t size);
%clear(void *buf, ssize_t size);
%clear(typeinfo_t *);
+
+%rename (nextthat) py_nextthat;
+%rename (prevthat) py_prevthat;
+%{
+//
+//------------------------------------------------------------------------
+static bool idaapi py_testf_cb(flags_t flags, void *ud)
+{
+ PyObject *py_flags = PyLong_FromLong(flags);
+ PyObject *result = PyObject_CallFunctionObjArgs((PyObject *) ud, py_flags, NULL);
+ bool ret = result != NULL && result == Py_True;
+ Py_XDECREF(result);
+ Py_XDECREF(py_flags);
+ return ret;
+}
+
+//------------------------------------------------------------------------
+// Wraps the (next|prev)that()
+ea_t py_npthat(ea_t ea, ea_t bound, PyObject *py_callable, bool next)
+{
+ if (!PyCallable_Check(py_callable))
+ return BADADDR;
+// ea_t (ida_export *np_that_t)(ea_t, ea_t, testf_t *, void *ud);
+// np_that_t = ;
+ return (next ? nextthat : prevthat)(ea, bound, py_testf_cb, py_callable);
+}
+//
+%}
+
+%inline %{
+//
+ea_t py_nextthat(ea_t ea, ea_t maxea, PyObject *callable)
+{
+ return py_npthat(ea, maxea, callable, true);
+}
+
+ea_t py_prevthat(ea_t ea, ea_t minea, PyObject *callable)
+{
+ return py_npthat(ea, minea, callable, false);
+}
+//
+%}