diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh
index b2b2f0e..0e8fbff 100644
--- a/src/hb-ot-layout-gpos-table.hh
+++ b/src/hb-ot-layout-gpos-table.hh
@@ -2556,12 +2556,6 @@
     }
   }
 
-  bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const
-  {
-    hb_intersects_context_t c (glyphs);
-    return dispatch (&c, lookup_type);
-  }
-
   protected:
   union {
   SinglePos		single;
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index 5f10ecb..cfc6c76 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -1348,12 +1348,6 @@
     }
   }
 
-  bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const
-  {
-    hb_intersects_context_t c (glyphs);
-    return dispatch (&c, lookup_type);
-  }
-
   protected:
   union {
   SingleSubst			single;
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index c8fe944..0f1f98d 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -44,23 +44,24 @@
 struct hb_intersects_context_t :
        hb_dispatch_context_t<hb_intersects_context_t, bool>
 {
-  template <typename T>
-  return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); }
-  static return_t default_return_value () { return false; }
-  bool stop_sublookup_iteration (return_t r) const { return r; }
-
   const hb_set_t *glyphs;
 
   hb_intersects_context_t (const hb_set_t *glyphs_) :
 			     glyphs (glyphs_) {}
+
+  /* Dispatch interface. */
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, obj.intersects (this->glyphs))
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
 };
 
 struct hb_closure_context_t :
        hb_dispatch_context_t<hb_closure_context_t>
 {
   typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
-  template <typename T>
-  return_t dispatch (const T &obj) { obj.closure (this); return hb_empty_t (); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, (obj.closure (this), hb_empty_t ()))
   static return_t default_return_value () { return hb_empty_t (); }
   void recurse (unsigned int lookup_index)
   {
@@ -134,8 +135,8 @@
        hb_dispatch_context_t<hb_closure_lookups_context_t>
 {
   typedef return_t (*recurse_func_t) (hb_closure_lookups_context_t *c, unsigned lookup_index);
-  template <typename T>
-  return_t dispatch (const T &obj) { obj.closure_lookups (this); return hb_empty_t (); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, (obj.closure_lookups (this), hb_empty_t ()))
   static return_t default_return_value () { return hb_empty_t (); }
   void recurse (unsigned lookup_index)
   {
@@ -200,8 +201,8 @@
 struct hb_would_apply_context_t :
        hb_dispatch_context_t<hb_would_apply_context_t, bool>
 {
-  template <typename T>
-  return_t dispatch (const T &obj) { return obj.would_apply (this); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, obj.would_apply (this))
   static return_t default_return_value () { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
 
@@ -224,8 +225,8 @@
        hb_dispatch_context_t<hb_collect_glyphs_context_t>
 {
   typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
-  template <typename T>
-  return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_empty_t (); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, (obj.collect_glyphs (this), hb_empty_t()))
   static return_t default_return_value () { return hb_empty_t (); }
   void recurse (unsigned int lookup_index)
   {
@@ -300,8 +301,8 @@
        hb_dispatch_context_t<hb_collect_coverage_context_t<set_t>, const Coverage &>
 {
   typedef const Coverage &return_t; // Stoopid that we have to dupe this here.
-  template <typename T>
-  return_t dispatch (const T &obj) { return obj.get_coverage (); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, obj.get_coverage (this))
   static return_t default_return_value () { return Null (Coverage); }
   bool stop_sublookup_iteration (return_t r) const
   {
@@ -505,8 +506,8 @@
 
   const char *get_name () { return "APPLY"; }
   typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
-  template <typename T>
-  return_t dispatch (const T &obj) { return obj.apply (this); }
+  template <typename T> auto
+  dispatch (const T &obj) HB_RETURN (return_t, obj.apply (this))
   static return_t default_return_value () { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
   return_t recurse (unsigned int sub_lookup_index)
@@ -3159,13 +3160,23 @@
   const X& get_subtable () const
   { return this + reinterpret_cast<const LOffsetTo<typename T::SubTable> &> (extensionOffset); }
 
-  template <typename context_t, typename ...Ts>
-  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+  private:
+  /* If the context accepts dispatching to this object, call it. */
+  template <typename context_t, typename ...Ts> auto
+  _dispatch (context_t *c, hb_priority<1>, Ts&&... ds) const HB_AUTO_RETURN
+  ( c->dispatch (*this, hb_forward<Ts> (ds)...) )
+  /* Otherwise, dispatch to the referred sublookup. */
+  template <typename context_t, typename ...Ts> typename context_t::return_t
+  _dispatch (context_t *c, Ts&&... ds) const
   {
     TRACE_DISPATCH (this, format);
     if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
     return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...));
   }
+  public:
+  template <typename context_t, typename ...Ts> auto
+  dispatch (context_t *c, Ts&&... ds) const HB_AUTO_RETURN
+  ( _dispatch (c, hb_prioritize, hb_forward<Ts> (ds)...) )
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   { dispatch (c); }
@@ -3226,20 +3237,8 @@
     }
   }
 
-  // Specialization of dispatch for subset. dispatch() normally just
-  // dispatches to the sub table this points too, but for subset
-  // we need to run subset on this subtable too.
-  template <typename ...Ts>
-  typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const
-  {
-    switch (u.format) {
-    case 1: return u.format1.subset (c);
-    default: return c->default_return_value ();
-    }
-  }
-
-  template <typename context_t, typename ...Ts>
-  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+  template <typename context_t, typename ...Ts> typename context_t::return_t
+  dispatch (context_t *c, Ts&&... ds) const
   {
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
