diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java
index 7b71053..e243c0f 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java
@@ -23,12 +23,14 @@
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.UnboundMetadata;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Multimap;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 import static java.util.Objects.requireNonNull;
 
@@ -68,8 +70,14 @@
     };
   }
 
+  @Deprecated // to be removed before 2.0
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def) {
     return ImmutableMultimap.of();
   }
+
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    return ImmutableList.of();
+  }
 }
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java
index a99a6dc..499b4fc 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java
@@ -23,12 +23,14 @@
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.UnboundMetadata;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Multimap;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 import java.lang.reflect.Method;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -119,8 +121,14 @@
     };
   }
 
+  @Deprecated
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def) {
     return ImmutableMultimap.of();
   }
+
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    return ImmutableList.of();
+  }
 }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java
index 0c7349f..01e53a7 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java
@@ -83,11 +83,17 @@
     };
   }
 
+  @Deprecated // to be removed before 2.0
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def) {
     return underlyingProvider.handlers(def);
   }
 
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    return underlyingProvider.handlers(handlerClass);
+  }
+
   //~ Inner Classes ----------------------------------------------------------
 
   /** An entry in the cache. Consists of the cached object and the timestamp
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java
index a0c4520..5377b06 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java
@@ -105,6 +105,7 @@
     }
   }
 
+  @Deprecated // to be removed before 2.0
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def) {
     final ImmutableMultimap.Builder<Method, MetadataHandler<M>> builder =
@@ -115,6 +116,16 @@
     return builder.build();
   }
 
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    final ImmutableList.Builder<MetadataHandler<?>> builder =
+        ImmutableList.builder();
+    for (RelMetadataProvider provider : providers) {
+      builder.addAll(provider.handlers(handlerClass));
+    }
+    return builder.build();
+  }
+
   /** Creates a chain. */
   public static RelMetadataProvider of(List<RelMetadataProvider> list) {
     return new ChainedRelMetadataProvider(ImmutableList.copyOf(list));
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java
index f3eb478..6d5639e 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java
@@ -21,8 +21,8 @@
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.linq4j.tree.Primitive;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey;
 import org.apache.calcite.rel.metadata.janino.DispatchGenerator;
-import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.ControlFlowException;
 import org.apache.calcite.util.Util;
 
@@ -45,6 +45,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -66,13 +67,13 @@
   /** Cache of pre-generated handlers by provider and kind of metadata.
    * For the cache to be effective, providers should implement identity
    * correctly. */
-  @SuppressWarnings("unchecked")
-  private static final LoadingCache<Key, MetadataHandler> HANDLERS =
+  private static final LoadingCache<Key, MetadataHandler<?>> HANDLERS =
       maxSize(CacheBuilder.newBuilder(),
           CalciteSystemProperty.METADATA_HANDLER_CACHE_MAXIMUM_SIZE.value())
           .build(
               CacheLoader.from(key ->
-                  load3(key.def, key.provider.handlers(key.def))));
+                  generateCompileAndInstantiate(key.handlerClass,
+                      key.provider.handlers(key.handlerClass))));
 
   /** Private constructor; use {@link #of}. */
   private JaninoRelMetadataProvider(RelMetadataProvider provider) {
@@ -115,69 +116,105 @@
     throw new UnsupportedOperationException();
   }
 
+  @Deprecated // to be removed before 2.0
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>>
       handlers(MetadataDef<M> def) {
     return provider.handlers(def);
   }
 
-  private static <M extends Metadata> MetadataHandler<M> load3(
-      MetadataDef<M> def, Multimap<Method, ? extends MetadataHandler<?>> map) {
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    return provider.handlers(handlerClass);
+  }
+
+  private static <MH extends MetadataHandler<?>> MH generateCompileAndInstantiate(
+      Class<MH> handlerClass,
+      List<? extends MetadataHandler<? extends Metadata>> handlers) {
+    final LinkedHashSet<? extends MetadataHandler<? extends Metadata>> handlerSet =
+        new LinkedHashSet<>(handlers);
     final StringBuilder buff = new StringBuilder();
     final String name =
-        "GeneratedMetadata_" + simpleNameForHandler(def.handlerClass);
+        "GeneratedMetadata_" + simpleNameForHandler(handlerClass);
 
     final Map<MetadataHandler<?>, String> handlerToName = new LinkedHashMap<>();
-    for (MetadataHandler<?> provider : map.values()) {
+    for (MetadataHandler<?> provider : handlerSet) {
       if (!handlerToName.containsKey(provider)) {
         handlerToName.put(provider, "provider" + handlerToName.size());
       }
     }
-
-    buff.append("  private final ").append(MetadataDef.class.getName()).append(" def;\n");
+    //Properties
     for (Map.Entry<MetadataHandler<?>, String> handlerAndName : handlerToName.entrySet()) {
       buff.append("  public final ").append(handlerAndName.getKey().getClass().getName())
           .append(' ').append(handlerAndName.getValue()).append(";\n");
     }
-    buff.append("  public ").append(name).append("(\n")
-        .append("      ").append(MetadataDef.class.getName()).append(" def");
+    //Constructor
+    buff.append("  public ").append(name).append("(\n");
     for (Map.Entry<MetadataHandler<?>, String> handlerAndName : handlerToName.entrySet()) {
-      buff.append(",\n")
-          .append("      ")
+      buff.append("      ")
           .append(handlerAndName.getKey().getClass().getName())
           .append(' ')
-          .append(handlerAndName.getValue());
+          .append(handlerAndName.getValue())
+          .append(",\n");
     }
-    buff.append(") {\n")
-        .append("    this.def = def;\n");
-
+    if (!handlerToName.isEmpty()) {
+      //Remove trailing comma and new line
+      buff.setLength(buff.length() - 2);
+    }
+    buff.append(") {\n");
     for (String handlerName : handlerToName.values()) {
       buff.append("    this.").append(handlerName).append(" = ").append(handlerName)
           .append(";\n");
     }
-    buff.append("  }\n")
-        .append("  public ")
-        .append(MetadataDef.class.getName())
-        .append(" getDef() {\n")
-        .append("    return ")
-        .append(def.metadataClass.getName())
-        .append(".DEF;\n")
-        .append("  }\n");
+    buff.append("  }\n");
+    getDefMethod(buff, handlerToName.values()
+        .stream()
+        .findFirst()
+        .orElse(null));
+
     DispatchGenerator dispatchGenerator = new DispatchGenerator(handlerToName);
-    for (Ord<Method> method : Ord.zip(map.keySet())) {
+    for (Ord<Method> method : Ord.zip(handlerClass.getDeclaredMethods())) {
+      cacheProperties(buff, method.e, method.i);
       generateCachedMethod(buff, method.e, method.i);
-      dispatchGenerator.dispatchMethod(buff, method.e, map.get(method.e));
+      dispatchGenerator.dispatchMethod(buff, method.e, handlerSet);
     }
-    final List<Object> argList = new ArrayList<>();
-    argList.add(def);
-    argList.addAll(handlerToName.keySet());
+    final List<Object> argList = new ArrayList<>(handlerToName.keySet());
     try {
-      return compile(name, buff.toString(), def, argList);
+      return compile(name, buff.toString(), handlerClass, argList);
     } catch (CompileException | IOException e) {
       throw new RuntimeException("Error compiling:\n"
           + buff, e);
     }
   }
 
+  static void cacheProperties(StringBuilder buff, Method method, int methodIndex) {
+    buff.append("  private final Object ");
+    appendKeyName(buff, methodIndex);
+    buff.append(" = new ")
+        .append(DescriptiveCacheKey.class.getName())
+        .append("(\"")
+        .append(method.toString())
+        .append("\");\n");
+  }
+
+  private static void appendKeyName(StringBuilder buff, int methodIndex) {
+    buff.append("methodKey").append(methodIndex);
+  }
+
+  private static void getDefMethod(StringBuilder buff, @Nullable String handlerName) {
+    buff.append("  public ")
+        .append(MetadataDef.class.getName())
+        .append(" getDef() {\n");
+
+    if (handlerName == null) {
+      buff.append("    return null;");
+    } else {
+      buff.append("    return ")
+          .append(handlerName)
+          .append(".getDef();\n");
+    }
+    buff.append("  }\n");
+  }
+
   private static void generateCachedMethod(StringBuilder buff, Method method, int methodIndex) {
     String delRelClass = DelegatingMetadataRel.class.getName();
     buff.append("  public ")
@@ -202,13 +239,7 @@
                 ? org.apache.calcite.runtime.FlatLists.class
                 : ImmutableList.class).getName())
         .append(".of(");
-    if (methodIndex == 0) {
-      buff.append("def");
-    } else {
-      buff.append("def.methods.get(")
-          .append(methodIndex)
-          .append(")");
-    }
+    appendKeyName(buff, methodIndex);
     safeArgList(buff, method)
         .append(");\n")
         .append("    final Object v = mq.map.get(r, key);\n")
@@ -268,20 +299,23 @@
 
   /** Returns e.g. ", ignoreNulls". */
   private static StringBuilder argList(StringBuilder buff, Method method) {
-    for (Ord<Class<?>> t : Ord.zip(method.getParameterTypes())) {
-      buff.append(", a").append(t.i);
+    Class<?>[] paramTypes = method.getParameterTypes();
+    for (int i = 2; i < paramTypes.length; i++) {
+      buff.append(", a").append(i - 2);
     }
     return buff;
   }
 
   /** Returns e.g. ", ignoreNulls". */
   private static StringBuilder safeArgList(StringBuilder buff, Method method) {
-    for (Ord<Class<?>> t : Ord.zip(method.getParameterTypes())) {
-      if (Primitive.is(t.e) || RexNode.class.isAssignableFrom(t.e)) {
-        buff.append(", a").append(t.i);
+    Class<?>[] paramTypes = method.getParameterTypes();
+    for (int i = 2; i < paramTypes.length; i++) {
+      Class<?> t = paramTypes[i];
+      if (Primitive.is(t)) {
+        buff.append(", a").append(i - 2);
       } else {
         buff.append(", ") .append(NullSentinel.class.getName())
-            .append(".mask(a").append(t.i).append(")");
+            .append(".mask(a").append(i - 2).append(")");
       }
     }
     return buff;
@@ -289,14 +323,15 @@
 
   /** Returns e.g. ",\n boolean ignoreNulls". */
   private static StringBuilder paramList(StringBuilder buff, Method method) {
-    for (Ord<Class<?>> t : Ord.zip(method.getParameterTypes())) {
-      buff.append(",\n      ").append(t.e.getName()).append(" a").append(t.i);
+    Class<?>[] paramTypes = method.getParameterTypes();
+    for (int i = 2; i < paramTypes.length; i++) {
+      buff.append(",\n      ").append(paramTypes[i].getName()).append(" a").append(i - 2);
     }
     return buff;
   }
 
-  static <M extends Metadata> MetadataHandler<M> compile(String className,
-      String classBody, MetadataDef<M> def,
+  static  <MH extends MetadataHandler<?>> MH compile(String className,
+      String classBody, Class<MH> handlerClass,
       List<Object> argList) throws CompileException, IOException {
     final ICompilerFactory compilerFactory;
     ClassLoader classLoader =
@@ -312,7 +347,7 @@
     compiler.setParentClassLoader(JaninoRexCompiler.class.getClassLoader());
 
     final String s = "public final class " + className
-        + " implements " + def.handlerClass.getCanonicalName() + " {\n"
+        + " implements " + handlerClass.getCanonicalName() + " {\n"
         + classBody
         + "\n"
         + "}";
@@ -328,7 +363,7 @@
     final Object o;
     try {
       constructor = compiler.getClassLoader().loadClass(className)
-              .getDeclaredConstructors()[0];
+          .getDeclaredConstructors()[0];
       o = constructor.newInstance(argList.toArray());
     } catch (InstantiationException
         | IllegalAccessException
@@ -336,26 +371,19 @@
         | ClassNotFoundException e) {
       throw new RuntimeException(e);
     }
-    return def.handlerClass.cast(o);
+    return handlerClass.cast(o);
   }
 
-  synchronized <M extends Metadata, H extends MetadataHandler<M>> H create(
-      MetadataDef<M> def) {
+  synchronized <H extends MetadataHandler<?>> H revise(Class<H> handlerClass) {
     try {
-      final Key key = new Key((MetadataDef) def, provider);
+      final Key key = new Key(handlerClass, provider);
       //noinspection unchecked
-      return (H) HANDLERS.get(key);
+      return handlerClass.cast(HANDLERS.get(key));
     } catch (UncheckedExecutionException | ExecutionException e) {
       throw Util.throwAsRuntime(Util.causeOrSelf(e));
     }
   }
 
-  synchronized <M extends Metadata, H extends MetadataHandler<M>> H revise(
-      Class<? extends RelNode> rClass, MetadataDef<M> def) {
-    //noinspection unchecked
-    return (H) create(def);
-  }
-
   /** Registers some classes. Does not flush the providers, but next time we
    * need to generate a provider, it will handle all of these classes. So,
    * calling this method reduces the number of times we need to re-generate. */
@@ -376,23 +404,24 @@
 
   /** Key for the cache. */
   private static class Key {
-    public final MetadataDef def;
-    public final RelMetadataProvider provider;
+    final Class<? extends MetadataHandler<? extends Metadata>> handlerClass;
+    final RelMetadataProvider provider;
 
-    private Key(MetadataDef def, RelMetadataProvider provider) {
-      this.def = def;
+    private Key(Class<? extends MetadataHandler<?>> handlerClass,
+        RelMetadataProvider provider) {
+      this.handlerClass = handlerClass;
       this.provider = provider;
     }
 
     @Override public int hashCode() {
-      return (def.hashCode() * 37
+      return (handlerClass.hashCode() * 37
           + provider.hashCode()) * 37;
     }
 
     @Override public boolean equals(@Nullable Object obj) {
       return this == obj
           || obj instanceof Key
-          && ((Key) obj).def.equals(def)
+          && ((Key) obj).handlerClass.equals(handlerClass)
           && ((Key) obj).provider.equals(provider);
     }
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java
index 122367b..ab01fc2 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java
@@ -68,7 +68,10 @@
   private final ConcurrentMap<Class<RelNode>, UnboundMetadata> map;
   @Deprecated // to be removed before 2.0
   private final Class<? extends Metadata> metadataClass0;
+  @Deprecated // to be removed before 2.0
   private final ImmutableMultimap<Method, MetadataHandler> handlerMap;
+  private final Class<? extends MetadataHandler<?>> handlerClass;
+  private final ImmutableList<MetadataHandler<?>> handlers;
 
   //~ Constructors -----------------------------------------------------------
 
@@ -82,12 +85,15 @@
   protected ReflectiveRelMetadataProvider(
       ConcurrentMap<Class<RelNode>, UnboundMetadata> map,
       Class<? extends Metadata> metadataClass0,
-      Multimap<Method, MetadataHandler> handlerMap) {
+      Multimap<Method, MetadataHandler<?>> handlerMap,
+      Class<? extends MetadataHandler<?>> handlerClass) {
     Preconditions.checkArgument(!map.isEmpty(), "ReflectiveRelMetadataProvider "
         + "methods map is empty; are your methods named wrong?");
     this.map = map;
     this.metadataClass0 = metadataClass0;
     this.handlerMap = ImmutableMultimap.copyOf(handlerMap);
+    this.handlerClass = handlerClass;
+    this.handlers = ImmutableList.copyOf(handlerMap.values());
   }
 
   /** Returns an implementation of {@link RelMetadataProvider} that scans for
@@ -107,20 +113,31 @@
    * that extend {@link org.apache.calcite.rel.core.Union}
    * or {@link org.apache.calcite.rel.core.Filter}.</p>
    */
+  @Deprecated // to be removed before 2.0
   public static RelMetadataProvider reflectiveSource(Method method,
       MetadataHandler target) {
-    return reflectiveSource(target, ImmutableList.of(method));
+    return reflectiveSource(target, ImmutableList.of(method), target.getDef().handlerClass);
   }
 
   /** Returns a reflective metadata provider that implements several
    * methods. */
+  @Deprecated // to be removed before 2.0
   public static RelMetadataProvider reflectiveSource(MetadataHandler target,
       Method... methods) {
-    return reflectiveSource(target, ImmutableList.copyOf(methods));
+    return reflectiveSource(target, ImmutableList.copyOf(methods), target.getDef().handlerClass);
   }
 
+  @SuppressWarnings("deprecation")
+  public static <M extends Metadata> RelMetadataProvider reflectiveSource(
+      MetadataHandler<? extends M> handler, Class<? extends MetadataHandler<M>> handlerClass) {
+    //When deprecated code is removed, handler.getDef().methods will no longer be required
+    return reflectiveSource(handler, handler.getDef().methods, handlerClass);
+  }
+
+  @Deprecated // to be removed before 2.0
   private static RelMetadataProvider reflectiveSource(
-      final MetadataHandler target, final ImmutableList<Method> methods) {
+      final MetadataHandler target, final ImmutableList<Method> methods,
+      final Class<? extends MetadataHandler<?>> handlerClass) {
     final Space2 space = Space2.create(target, methods);
 
     // This needs to be a concurrent map since RelMetadataProvider are cached in static
@@ -199,9 +216,10 @@
       methodsMap.put(key, function);
     }
     return new ReflectiveRelMetadataProvider(methodsMap, space.metadataClass0,
-        space.providerMap);
+        space.providerMap, handlerClass);
   }
 
+  @Deprecated // to be removed before 2.0
   @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def) {
     final ImmutableMultimap.Builder<Method, MetadataHandler<M>> builder =
@@ -215,6 +233,16 @@
     return builder.build();
   }
 
+  @Override public List<MetadataHandler<?>> handlers(
+      Class<? extends MetadataHandler<?>> handlerClass) {
+    if (this.handlerClass.isAssignableFrom(handlerClass)) {
+      return handlers;
+    } else {
+      return ImmutableList.of();
+    }
+  }
+
+  @Deprecated // to be removed before 2.0
   private static boolean couldImplement(Method handlerMethod, Method method) {
     if (!handlerMethod.getName().equals(method.getName())
         || (handlerMethod.getModifiers() & Modifier.STATIC) != 0
@@ -278,19 +306,20 @@
 
   /** Workspace for computing which methods can act as handlers for
    * given metadata methods. */
+  @Deprecated // to be removed before 2.0
   static class Space {
     final Set<Class<RelNode>> classes = new HashSet<>();
     final Map<Pair<Class<RelNode>, Method>, Method> handlerMap = new HashMap<>();
-    final ImmutableMultimap<Method, MetadataHandler> providerMap;
+    final ImmutableMultimap<Method, MetadataHandler<?>> providerMap;
 
-    Space(Multimap<Method, MetadataHandler> providerMap) {
+    Space(Multimap<Method, MetadataHandler<?>> providerMap) {
       this.providerMap = ImmutableMultimap.copyOf(providerMap);
 
       // Find the distinct set of RelNode classes handled by this provider,
       // ordered base-class first.
-      for (Map.Entry<Method, MetadataHandler> entry : providerMap.entries()) {
+      for (Map.Entry<Method, MetadataHandler<?>> entry : providerMap.entries()) {
         final Method method = entry.getKey();
-        final MetadataHandler provider = entry.getValue();
+        final MetadataHandler<?> provider = entry.getValue();
         for (final Method handlerMethod : provider.getClass().getMethods()) {
           if (couldImplement(handlerMethod, method)) {
             @SuppressWarnings("unchecked") final Class<RelNode> relNodeClass =
@@ -332,16 +361,19 @@
   }
 
   /** Extended work space. */
+  @Deprecated // to be removed before 2.0
   static class Space2 extends Space {
     private Class<Metadata> metadataClass0;
 
     Space2(Class<Metadata> metadataClass0,
-        ImmutableMultimap<Method, MetadataHandler> providerMap) {
+        ImmutableMultimap<Method, MetadataHandler<?>> providerMap) {
       super(providerMap);
       this.metadataClass0 = metadataClass0;
     }
 
-    public static Space2 create(MetadataHandler target,
+    @Deprecated // to be removed before 2.0
+    public static Space2 create(
+        MetadataHandler<?> target,
         ImmutableList<Method> methods) {
       assert methods.size() > 0;
       final Method method0 = methods.get(0);
@@ -352,7 +384,7 @@
         assert method.getDeclaringClass() == metadataClass0;
       }
 
-      final ImmutableMultimap.Builder<Method, MetadataHandler> providerBuilder =
+      final ImmutableMultimap.Builder<Method, MetadataHandler<?>> providerBuilder =
           ImmutableMultimap.builder();
       for (final Method method : methods) {
         providerBuilder.put(method, target);
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java
index ef02613..0ca61be 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java
@@ -41,7 +41,6 @@
 import org.apache.calcite.rex.RexTableInputRef.RelTableRef;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 
@@ -78,8 +77,9 @@
  */
 public class RelMdAllPredicates
     implements MetadataHandler<BuiltInMetadata.AllPredicates> {
-  public static final RelMetadataProvider SOURCE = ReflectiveRelMetadataProvider
-      .reflectiveSource(BuiltInMethod.ALL_PREDICATES.method, new RelMdAllPredicates());
+  public static final RelMetadataProvider SOURCE =
+      ReflectiveRelMetadataProvider.reflectiveSource(
+          new RelMdAllPredicates(), BuiltInMetadata.AllPredicates.Handler.class);
 
   @Override public MetadataDef<BuiltInMetadata.AllPredicates> getDef() {
     return BuiltInMetadata.AllPredicates.DEF;
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
index 850f99a..e32ad62 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
@@ -51,7 +51,6 @@
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.sql.validate.SqlMonotonicity;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.Pair;
@@ -84,7 +83,7 @@
     implements MetadataHandler<BuiltInMetadata.Collation> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.COLLATIONS.method, new RelMdCollation());
+          new RelMdCollation(), BuiltInMetadata.Collation.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
index 560f5ff..c8a56e2 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
@@ -35,7 +35,6 @@
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexVisitor;
 import org.apache.calcite.rex.RexVisitorImpl;
-import org.apache.calcite.util.BuiltInMethod;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.checkerframework.checker.nullness.qual.PolyNull;
@@ -53,7 +52,7 @@
     implements MetadataHandler<BuiltInMetadata.ColumnOrigin> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.COLUMN_ORIGIN.method, new RelMdColumnOrigins());
+          new RelMdColumnOrigins(), BuiltInMetadata.ColumnOrigin.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
index 5a9d12d..7e912f0 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
@@ -45,7 +45,6 @@
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
@@ -67,7 +66,7 @@
     implements MetadataHandler<BuiltInMetadata.ColumnUniqueness> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.COLUMN_UNIQUENESS.method, new RelMdColumnUniqueness());
+          new RelMdColumnUniqueness(), BuiltInMetadata.ColumnUniqueness.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
index a8b42cf..d172f37 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
@@ -33,7 +33,6 @@
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.util.Bug;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.NumberUtil;
 
@@ -55,7 +54,7 @@
     implements MetadataHandler<BuiltInMetadata.DistinctRowCount> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.DISTINCT_ROW_COUNT.method, new RelMdDistinctRowCount());
+          new RelMdDistinctRowCount(), BuiltInMetadata.DistinctRowCount.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
index e06cab5..5133dbb 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
@@ -35,7 +35,6 @@
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexProgram;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.mapping.Mappings;
 
 import com.google.common.collect.ImmutableList;
@@ -53,7 +52,7 @@
     implements MetadataHandler<BuiltInMetadata.Distribution> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.DISTRIBUTION.method, new RelMdDistribution());
+          new RelMdDistribution(), BuiltInMetadata.Distribution.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java
index 6795522..1f5d8f5 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java
@@ -18,7 +18,6 @@
 
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.sql.SqlExplainLevel;
-import org.apache.calcite.util.BuiltInMethod;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -30,8 +29,7 @@
     implements MetadataHandler<BuiltInMetadata.ExplainVisibility> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.EXPLAIN_VISIBILITY.method,
-          new RelMdExplainVisibility());
+          new RelMdExplainVisibility(), BuiltInMetadata.ExplainVisibility.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java
index 6cc92bf..cc9d0e4 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java
@@ -40,7 +40,6 @@
 import org.apache.calcite.rex.RexTableInputRef.RelTableRef;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
@@ -84,7 +83,7 @@
     implements MetadataHandler<BuiltInMetadata.ExpressionLineage> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.EXPRESSION_LINEAGE.method, new RelMdExpressionLineage());
+          new RelMdExpressionLineage(), BuiltInMetadata.ExpressionLineage.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java
index 6e59655..b54f2d0 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java
@@ -21,7 +21,6 @@
 import org.apache.calcite.plan.volcano.VolcanoPlanner;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.metadata.BuiltInMetadata.LowerBoundCost;
-import org.apache.calcite.util.BuiltInMethod;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -34,7 +33,7 @@
 
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          new RelMdLowerBoundCost(), BuiltInMethod.LOWER_BOUND_COST.method);
+          new RelMdLowerBoundCost(), LowerBoundCost.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
index 31c632b..e4801b6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
@@ -36,7 +36,6 @@
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.util.Bug;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.Util;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -49,7 +48,7 @@
     implements MetadataHandler<BuiltInMetadata.MaxRowCount> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.MAX_ROW_COUNT.method, new RelMdMaxRowCount());
+          new RelMdMaxRowCount(), BuiltInMetadata.MaxRowCount.Handler.class);
 
   //~ Methods ----------------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java
index a1019f0..b8333fc 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java
@@ -17,7 +17,6 @@
 package org.apache.calcite.rel.metadata;
 
 import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.util.BuiltInMethod;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -34,9 +33,7 @@
    * {@link org.apache.calcite.rel.metadata.BuiltInMetadata.Memory}. */
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(new RelMdMemory(),
-          BuiltInMethod.MEMORY.method,
-          BuiltInMethod.CUMULATIVE_MEMORY_WITHIN_PHASE.method,
-          BuiltInMethod.CUMULATIVE_MEMORY_WITHIN_PHASE_SPLIT.method);
+          BuiltInMetadata.Memory.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
index eb4a1d9..21d55ad 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
@@ -34,7 +34,6 @@
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.util.Bug;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.Util;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -47,7 +46,7 @@
     implements MetadataHandler<BuiltInMetadata.MinRowCount> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.MIN_ROW_COUNT.method, new RelMdMinRowCount());
+          new RelMdMinRowCount(), BuiltInMetadata.MinRowCount.Handler.class);
 
   //~ Methods ----------------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
index 04a71e0..a7d160f 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
@@ -35,7 +35,6 @@
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rel.core.Window;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ArrayListMultimap;
@@ -51,7 +50,7 @@
     implements MetadataHandler<BuiltInMetadata.NodeTypes> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.NODE_TYPES.method, new RelMdNodeTypes());
+          new RelMdNodeTypes(), BuiltInMetadata.NodeTypes.Handler.class);
 
   //~ Methods ----------------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdParallelism.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdParallelism.java
index 4f2a371..2bd1747 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdParallelism.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdParallelism.java
@@ -20,7 +20,6 @@
 import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Values;
-import org.apache.calcite.util.BuiltInMethod;
 
 /**
  * Default implementations of the
@@ -36,8 +35,7 @@
    * {@link org.apache.calcite.rel.metadata.BuiltInMetadata.Parallelism}. */
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(new RelMdParallelism(),
-          BuiltInMethod.IS_PHASE_TRANSITION.method,
-          BuiltInMethod.SPLIT_COUNT.method);
+          BuiltInMetadata.Parallelism.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java
index 949931f..a25d2ee 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java
@@ -22,7 +22,6 @@
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Union;
-import org.apache.calcite.util.BuiltInMethod;
 
 import com.google.common.collect.ImmutableList;
 
@@ -36,30 +35,26 @@
  * {@link RelMetadataQuery#getPercentageOriginalRows} for the standard logical
  * algebra.
  */
-public class RelMdPercentageOriginalRows
-    implements MetadataHandler<BuiltInMetadata.PercentageOriginalRows> {
-  private static final RelMdPercentageOriginalRows INSTANCE =
-      new RelMdPercentageOriginalRows();
-
+public class RelMdPercentageOriginalRows {
   public static final RelMetadataProvider SOURCE =
       ChainedRelMetadataProvider.of(
           ImmutableList.of(
               ReflectiveRelMetadataProvider.reflectiveSource(
-                  BuiltInMethod.PERCENTAGE_ORIGINAL_ROWS.method, INSTANCE),
-
+                  new RelMdPercentageOriginalRowsHandler(),
+                  BuiltInMetadata.PercentageOriginalRows.Handler.class),
               ReflectiveRelMetadataProvider.reflectiveSource(
-                  BuiltInMethod.CUMULATIVE_COST.method, INSTANCE),
-
+                  new RelMdCumulativeCost(),
+                  BuiltInMetadata.CumulativeCost.Handler.class),
               ReflectiveRelMetadataProvider.reflectiveSource(
-                  BuiltInMethod.NON_CUMULATIVE_COST.method, INSTANCE)));
+                  new RelMdNonCumulativeCost(),
+                  BuiltInMetadata.NonCumulativeCost.Handler.class
+              )
+          ));
 
   //~ Methods ----------------------------------------------------------------
 
   private RelMdPercentageOriginalRows() {}
 
-  @Override public MetadataDef<BuiltInMetadata.PercentageOriginalRows> getDef() {
-    return BuiltInMetadata.PercentageOriginalRows.DEF;
-  }
 
   public @Nullable Double getPercentageOriginalRows(Aggregate rel, RelMetadataQuery mq) {
     // REVIEW jvs 28-Mar-2006: The assumption here seems to be that
@@ -199,4 +194,41 @@
       return numerator / denominator;
     }
   }
+
+  /**
+   * Binds {@link RelMdPercentageOriginalRows} to {@link BuiltInMetadata.CumulativeCost}.
+   */
+  private static final class RelMdCumulativeCost
+      extends RelMdPercentageOriginalRows
+      implements MetadataHandler<BuiltInMetadata.CumulativeCost> {
+    @Deprecated // to be removed before 2.0
+    @Override public MetadataDef<BuiltInMetadata.CumulativeCost> getDef() {
+      return BuiltInMetadata.CumulativeCost.DEF;
+    }
+  }
+
+  /**
+   * Binds {@link RelMdPercentageOriginalRows} to {@link BuiltInMetadata.NonCumulativeCost}.
+   */
+  private static final class RelMdNonCumulativeCost
+      extends RelMdPercentageOriginalRows
+      implements MetadataHandler<BuiltInMetadata.NonCumulativeCost> {
+
+    @Deprecated // to be removed before 2.0
+    @Override public MetadataDef<BuiltInMetadata.NonCumulativeCost> getDef() {
+      return BuiltInMetadata.NonCumulativeCost.DEF;
+    }
+  }
+
+  /**
+   * Binds {@link RelMdPercentageOriginalRows} to {@link BuiltInMetadata.PercentageOriginalRows}.
+   */
+  private static final class RelMdPercentageOriginalRowsHandler
+      extends RelMdPercentageOriginalRows
+      implements MetadataHandler<BuiltInMetadata.PercentageOriginalRows> {
+    @Deprecated // to be removed before 2.0
+    @Override public MetadataDef<BuiltInMetadata.PercentageOriginalRows> getDef() {
+      return BuiltInMetadata.PercentageOriginalRows.DEF;
+    }
+  }
 }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
index 7c34639..779457f 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
@@ -28,7 +28,6 @@
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -43,7 +42,7 @@
     implements MetadataHandler<BuiltInMetadata.PopulationSize> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.POPULATION_SIZE.method, new RelMdPopulationSize());
+          new RelMdPopulationSize(), BuiltInMetadata.PopulationSize.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
index 603f7a5..00aae1b 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
@@ -52,7 +52,6 @@
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.util.BitSets;
 import org.apache.calcite.util.Bug;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 import org.apache.calcite.util.mapping.Mapping;
@@ -129,7 +128,7 @@
 public class RelMdPredicates
     implements MetadataHandler<BuiltInMetadata.Predicates> {
   public static final RelMetadataProvider SOURCE = ReflectiveRelMetadataProvider
-      .reflectiveSource(BuiltInMethod.PREDICATES.method, new RelMdPredicates());
+      .reflectiveSource(new RelMdPredicates(), BuiltInMetadata.Predicates.Handler.class);
 
   private static final List<RexNode> EMPTY_LIST = ImmutableList.of();
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
index 528fa8d..6b10195 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
@@ -36,7 +36,6 @@
 import org.apache.calcite.rex.RexDynamicParam;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.util.Bug;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.NumberUtil;
 import org.apache.calcite.util.Util;
@@ -51,7 +50,7 @@
     implements MetadataHandler<BuiltInMetadata.RowCount> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.ROW_COUNT.method, new RelMdRowCount());
+          new RelMdRowCount(), BuiltInMetadata.RowCount.Handler.class);
 
   //~ Methods ----------------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
index 4060d35..f61b26c 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
@@ -32,7 +32,6 @@
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -48,7 +47,7 @@
     implements MetadataHandler<BuiltInMetadata.Selectivity> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.SELECTIVITY.method, new RelMdSelectivity());
+          new RelMdSelectivity(), BuiltInMetadata.Selectivity.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
index e22fa53..77b2ed6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
@@ -38,7 +38,6 @@
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableNullableList;
 import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Pair;
@@ -64,8 +63,7 @@
    * {@link org.apache.calcite.rel.metadata.BuiltInMetadata.Size}. */
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(new RelMdSize(),
-          BuiltInMethod.AVERAGE_COLUMN_SIZES.method,
-          BuiltInMethod.AVERAGE_ROW_SIZE.method);
+          BuiltInMetadata.Size.Handler.class);
 
   /** Bytes per character (2). */
   public static final int BYTES_PER_CHARACTER = Character.SIZE / Byte.SIZE;
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
index 0d09815..e9554a6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
@@ -31,7 +31,6 @@
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Window;
 import org.apache.calcite.rex.RexTableInputRef.RelTableRef;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.Util;
 
 import com.google.common.collect.HashMultimap;
@@ -64,7 +63,7 @@
     implements MetadataHandler<BuiltInMetadata.TableReferences> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.TABLE_REFERENCES.method, new RelMdTableReferences());
+          new RelMdTableReferences(), BuiltInMetadata.TableReferences.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
index 3d728dc..f8a845f 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
@@ -35,7 +35,6 @@
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexProgram;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 
@@ -60,7 +59,7 @@
     implements MetadataHandler<BuiltInMetadata.UniqueKeys> {
   public static final RelMetadataProvider SOURCE =
       ReflectiveRelMetadataProvider.reflectiveSource(
-          BuiltInMethod.UNIQUE_KEYS.method, new RelMdUniqueKeys());
+          new RelMdUniqueKeys(), BuiltInMetadata.UniqueKeys.Handler.class);
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java
index 84cff20..57c0eb9 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java
@@ -23,6 +23,7 @@
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 /**
  * RelMetadataProvider defines an interface for obtaining metadata about
@@ -70,6 +71,24 @@
   <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata<M> apply(
       Class<? extends RelNode> relClass, Class<? extends M> metadataClass);
 
+  @Deprecated // to be removed before 2.0
   <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
       MetadataDef<M> def);
+
+  /**
+   * Retrieves a list of {@link MetadataHandler} for implements a particular
+   * {@link MetadataHandler}.class.  The resolution order is specificity of the relNode class,
+   * with preference given to handlers that occur earlier in the list.
+   *
+   * For instance, given a return list of {A, B, C} where A implements RelNode and Scan,
+   * B implements Scan, and C implements LogicalScan and Filter.
+   *
+   * Scan dispatches to a.method(Scan)
+   * LogicalFilter dispatches to c.method(Filter).
+   * LogicalScan dispatches to c.method(LogicalScan).
+   * Aggregate dispatches to a.method(RelNode).
+   *
+   * The behavior is undefined if the class hierarchy for dispatching is not a tree.
+   */
+  List<MetadataHandler<?>> handlers(Class<? extends MetadataHandler<?>> handlerClass);
 }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java
index 45378f2..d05e701 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java
@@ -196,7 +196,7 @@
       try {
         return nodeTypesHandler.getNodeTypes(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        nodeTypesHandler = revise(e.relClass, BuiltInMetadata.NodeTypes.DEF);
+        nodeTypesHandler = revise(BuiltInMetadata.NodeTypes.Handler.class);
       } catch (CyclicMetadataException e) {
         return null;
       }
@@ -218,7 +218,7 @@
         Double result = rowCountHandler.getRowCount(rel, this);
         return RelMdUtil.validateResult(castNonNull(result));
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        rowCountHandler = revise(e.relClass, BuiltInMetadata.RowCount.DEF);
+        rowCountHandler = revise(BuiltInMetadata.RowCount.Handler.class);
       }
     }
   }
@@ -236,8 +236,7 @@
       try {
         return maxRowCountHandler.getMaxRowCount(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        maxRowCountHandler =
-            revise(e.relClass, BuiltInMetadata.MaxRowCount.DEF);
+        maxRowCountHandler = revise(BuiltInMetadata.MaxRowCount.Handler.class);
       }
     }
   }
@@ -255,8 +254,7 @@
       try {
         return minRowCountHandler.getMinRowCount(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        minRowCountHandler =
-            revise(e.relClass, BuiltInMetadata.MinRowCount.DEF);
+        minRowCountHandler = revise(BuiltInMetadata.MinRowCount.Handler.class);
       }
     }
   }
@@ -274,8 +272,7 @@
       try {
         return cumulativeCostHandler.getCumulativeCost(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        cumulativeCostHandler =
-            revise(e.relClass, BuiltInMetadata.CumulativeCost.DEF);
+        cumulativeCostHandler = revise(BuiltInMetadata.CumulativeCost.Handler.class);
       }
     }
   }
@@ -293,8 +290,7 @@
       try {
         return nonCumulativeCostHandler.getNonCumulativeCost(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        nonCumulativeCostHandler =
-            revise(e.relClass, BuiltInMetadata.NonCumulativeCost.DEF);
+        nonCumulativeCostHandler = revise(BuiltInMetadata.NonCumulativeCost.Handler.class);
       }
     }
   }
@@ -316,7 +312,7 @@
         return RelMdUtil.validatePercentage(result);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         percentageOriginalRowsHandler =
-            revise(e.relClass, BuiltInMetadata.PercentageOriginalRows.DEF);
+            revise(BuiltInMetadata.PercentageOriginalRows.Handler.class);
       }
     }
   }
@@ -338,7 +334,7 @@
         return columnOriginHandler.getColumnOrigins(rel, this, column);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         columnOriginHandler =
-            revise(e.relClass, BuiltInMetadata.ColumnOrigin.DEF);
+            revise(BuiltInMetadata.ColumnOrigin.Handler.class);
       }
     }
   }
@@ -372,7 +368,7 @@
         return expressionLineageHandler.getExpressionLineage(rel, this, expression);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         expressionLineageHandler =
-            revise(e.relClass, BuiltInMetadata.ExpressionLineage.DEF);
+            revise(BuiltInMetadata.ExpressionLineage.Handler.class);
       }
     }
   }
@@ -386,7 +382,7 @@
         return tableReferencesHandler.getTableReferences(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         tableReferencesHandler =
-            revise(e.relClass, BuiltInMetadata.TableReferences.DEF);
+            revise(BuiltInMetadata.TableReferences.Handler.class);
       }
     }
   }
@@ -431,7 +427,7 @@
         return RelMdUtil.validatePercentage(result);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         selectivityHandler =
-            revise(e.relClass, BuiltInMetadata.Selectivity.DEF);
+            revise(BuiltInMetadata.Selectivity.Handler.class);
       }
     }
   }
@@ -468,7 +464,7 @@
         return uniqueKeysHandler.getUniqueKeys(rel, this, ignoreNulls);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         uniqueKeysHandler =
-            revise(e.relClass, BuiltInMetadata.UniqueKeys.DEF);
+            revise(BuiltInMetadata.UniqueKeys.Handler.class);
       }
     }
   }
@@ -552,7 +548,7 @@
             ignoreNulls);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         columnUniquenessHandler =
-            revise(e.relClass, BuiltInMetadata.ColumnUniqueness.DEF);
+            revise(BuiltInMetadata.ColumnUniqueness.Handler.class);
       }
     }
   }
@@ -571,7 +567,7 @@
       try {
         return collationHandler.collations(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        collationHandler = revise(e.relClass, BuiltInMetadata.Collation.DEF);
+        collationHandler = revise(BuiltInMetadata.Collation.Handler.class);
       }
     }
   }
@@ -596,7 +592,7 @@
         return distribution;
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         distributionHandler =
-            revise(e.relClass, BuiltInMetadata.Distribution.DEF);
+            revise(BuiltInMetadata.Distribution.Handler.class);
       }
     }
   }
@@ -622,7 +618,7 @@
         return RelMdUtil.validateResult(result);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         populationSizeHandler =
-            revise(e.relClass, BuiltInMetadata.PopulationSize.DEF);
+            revise(BuiltInMetadata.PopulationSize.Handler.class);
       }
     }
   }
@@ -640,7 +636,7 @@
       try {
         return sizeHandler.averageRowSize(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        sizeHandler = revise(e.relClass, BuiltInMetadata.Size.DEF);
+        sizeHandler = revise(BuiltInMetadata.Size.Handler.class);
       }
     }
   }
@@ -660,7 +656,7 @@
       try {
         return sizeHandler.averageColumnSizes(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        sizeHandler = revise(e.relClass, BuiltInMetadata.Size.DEF);
+        sizeHandler = revise(BuiltInMetadata.Size.Handler.class);
       }
     }
   }
@@ -690,7 +686,7 @@
         return parallelismHandler.isPhaseTransition(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         parallelismHandler =
-            revise(e.relClass, BuiltInMetadata.Parallelism.DEF);
+            revise(BuiltInMetadata.Parallelism.Handler.class);
       }
     }
   }
@@ -709,7 +705,7 @@
         return parallelismHandler.splitCount(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         parallelismHandler =
-            revise(e.relClass, BuiltInMetadata.Parallelism.DEF);
+            revise(BuiltInMetadata.Parallelism.Handler.class);
       }
     }
   }
@@ -729,7 +725,7 @@
       try {
         return memoryHandler.memory(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        memoryHandler = revise(e.relClass, BuiltInMetadata.Memory.DEF);
+        memoryHandler = revise(BuiltInMetadata.Memory.Handler.class);
       }
     }
   }
@@ -749,7 +745,7 @@
       try {
         return memoryHandler.cumulativeMemoryWithinPhase(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        memoryHandler = revise(e.relClass, BuiltInMetadata.Memory.DEF);
+        memoryHandler = revise(BuiltInMetadata.Memory.Handler.class);
       }
     }
   }
@@ -769,7 +765,7 @@
       try {
         return memoryHandler.cumulativeMemoryWithinPhaseSplit(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        memoryHandler = revise(e.relClass, BuiltInMetadata.Memory.DEF);
+        memoryHandler = revise(BuiltInMetadata.Memory.Handler.class);
       }
     }
   }
@@ -797,7 +793,7 @@
         return RelMdUtil.validateResult(result);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         distinctRowCountHandler =
-            revise(e.relClass, BuiltInMetadata.DistinctRowCount.DEF);
+            revise(BuiltInMetadata.DistinctRowCount.Handler.class);
       }
     }
   }
@@ -816,7 +812,7 @@
         RelOptPredicateList result = predicatesHandler.getPredicates(rel, this);
         return result != null ? result : RelOptPredicateList.EMPTY;
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        predicatesHandler = revise(e.relClass, BuiltInMetadata.Predicates.DEF);
+        predicatesHandler = revise(BuiltInMetadata.Predicates.Handler.class);
       }
     }
   }
@@ -834,7 +830,7 @@
       try {
         return allPredicatesHandler.getAllPredicates(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        allPredicatesHandler = revise(e.relClass, BuiltInMetadata.AllPredicates.DEF);
+        allPredicatesHandler = revise(BuiltInMetadata.AllPredicates.Handler.class);
       }
     }
   }
@@ -858,7 +854,7 @@
         return b == null || b;
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         explainVisibilityHandler =
-            revise(e.relClass, BuiltInMetadata.ExplainVisibility.DEF);
+            revise(BuiltInMetadata.ExplainVisibility.Handler.class);
       }
     }
   }
@@ -878,7 +874,7 @@
       try {
         return distributionHandler.distribution(rel, this);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
-        distributionHandler = revise(e.relClass, BuiltInMetadata.Distribution.DEF);
+        distributionHandler = revise(BuiltInMetadata.Distribution.Handler.class);
       }
     }
   }
@@ -892,7 +888,7 @@
         return lowerBoundCostHandler.getLowerBoundCost(rel, this, planner);
       } catch (JaninoRelMetadataProvider.NoHandler e) {
         lowerBoundCostHandler =
-            revise(e.relClass, BuiltInMetadata.LowerBoundCost.DEF);
+            revise(BuiltInMetadata.LowerBoundCost.Handler.class);
       }
     }
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
index 851a96b..229aa42 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java
@@ -94,10 +94,18 @@
 
   /** Re-generates the handler for a given kind of metadata, adding support for
    * {@code class_} if it is not already present. */
+  @Deprecated // to be removed before 2.0
   protected <M extends Metadata, H extends MetadataHandler<M>> H
       revise(Class<? extends RelNode> class_, MetadataDef<M> def) {
     requireNonNull(metadataProvider, "metadataProvider");
-    return metadataProvider.revise(class_, def);
+    return (H) revise(def.handlerClass);
+  }
+
+  /** Re-generates the handler for a given kind of metadata, adding support for
+   * {@code class_} if it is not already present. */
+  protected <H extends MetadataHandler<?>> H revise(Class<H> def) {
+    requireNonNull(metadataProvider, "metadataProvider");
+    return metadataProvider.revise(def);
   }
 
   /**
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/CodeGeneratorUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/CodeGeneratorUtil.java
index 0e439e7..4d902d9 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/CodeGeneratorUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/CodeGeneratorUtil.java
@@ -16,30 +16,31 @@
  */
 package org.apache.calcite.rel.metadata.janino;
 
-import org.apache.calcite.linq4j.Ord;
-
 import java.lang.reflect.Method;
 
 /**
  * Common functions for code generation.
  */
-public class CodeGeneratorUtil {
+class CodeGeneratorUtil {
 
   private CodeGeneratorUtil() {
   }
 
-  /** Returns e.g. ",\n boolean ignoreNulls". */
+  /** Returns e.g. ",\n boolean ignoreNulls".  This ignores the first 2 arguments. */
   static StringBuilder paramList(StringBuilder buff, Method method) {
-    for (Ord<Class<?>> t : Ord.zip(method.getParameterTypes())) {
-      buff.append(",\n      ").append(t.e.getName()).append(" a").append(t.i);
+    Class<?>[] parameterTypes = method.getParameterTypes();
+    for (int i = 2; i < parameterTypes.length; i++) {
+      Class<?> t = parameterTypes[i];
+      buff.append(",\n      ").append(t.getName()).append(" a").append(i);
     }
     return buff;
   }
 
-  /** Returns e.g. ", ignoreNulls". */
+  /** Returns e.g. ", a2, a3". This ignores the first 2 arguments. */
   static StringBuilder argList(StringBuilder buff, Method method) {
-    for (Ord<Class<?>> t : Ord.zip(method.getParameterTypes())) {
-      buff.append(", a").append(t.i);
+    Class<?>[] argTypes = method.getParameterTypes();
+    for (int i = 2; i < argTypes.length; i++) {
+      buff.append(", a").append(i);
     }
     return buff;
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/DescriptiveCacheKey.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DescriptiveCacheKey.java
new file mode 100644
index 0000000..3a9f585
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DescriptiveCacheKey.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.rel.metadata.janino;
+
+/**
+ * A key used in caching with descriptive to string.  Note the key uses
+ * reference equality for performance.
+ */
+public final class DescriptiveCacheKey {
+
+  private final String description;
+
+  public DescriptiveCacheKey(String description) {
+    this.description = description;
+  }
+
+  @Override public String toString() {
+    return description;
+  }
+}
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java
index 5e11cad..2c31101 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java
@@ -154,7 +154,7 @@
       Method candidate) {
     if (!superMethod.getName().equals(candidate.getName())) {
       return null;
-    } else if (superMethod.getParameterCount() + 2 != candidate.getParameterCount()) {
+    } else if (superMethod.getParameterCount() != candidate.getParameterCount()) {
       return null;
     } else {
       Class<?>[] cpt = candidate.getParameterTypes();
@@ -164,8 +164,8 @@
       } else if (!RelMetadataQuery.class.equals(cpt[1])) {
         return null;
       }
-      for (int i = 0; i < smpt.length; i++) {
-        if (cpt[i + 2] != smpt[i]) {
+      for (int i = 2; i < smpt.length; i++) {
+        if (cpt[i] != smpt[i]) {
           return null;
         }
       }
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index 709b49b..d83b48c 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -107,7 +107,6 @@
 import org.apache.calcite.tools.FrameworkConfig;
 import org.apache.calcite.tools.Frameworks;
 import org.apache.calcite.tools.RelBuilder;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.Holder;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
@@ -1025,10 +1024,16 @@
           return metadataProvider.apply(relClass, metadataClass);
         }
 
+        @Deprecated // to be removed before 2.0
         @Override public <M extends Metadata> Multimap<Method, MetadataHandler<M>> handlers(
             MetadataDef<M> def) {
           return metadataProvider.handlers(def);
         }
+
+        @Override public List<MetadataHandler<?>> handlers(
+            Class<? extends MetadataHandler<?>> handlerClass) {
+          return metadataProvider.handlers(handlerClass);
+        }
       };
       RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.of(wrappedProvider));
       final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
@@ -1546,8 +1551,9 @@
       assertThat(colType(mq, rel, 0), equalTo("DEPTNO-rel"));
       fail("expected error");
     } catch (IllegalArgumentException e) {
-      final String value = "No handler for method [public abstract java.lang.String "
-          + "org.apache.calcite.test.RelMetadataTest$ColType.getColType(int)] "
+      final String value = "No handler for method [public abstract "
+          + "java.lang.String org.apache.calcite.test.RelMetadataTest$ColType$Handler.getColType("
+          + "org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery,int)] "
           + "applied to argument of type [class org.apache.calcite.rel.logical.LogicalFilter]; "
           + "we recommend you create a catch-all (RelNode) handler";
       assertThat(e.getMessage(), is(value));
@@ -1581,9 +1587,10 @@
       fail("expected error");
     } catch (IllegalArgumentException e) {
       final String value = "No handler for method [public abstract java.lang.String "
-          + "org.apache.calcite.test.RelMetadataTest$ColType.getColType(int)] "
-          + "applied to argument of type [class org.apache.calcite.rel.logical.LogicalFilter]; "
-          + "we recommend you create a catch-all (RelNode) handler";
+          + "org.apache.calcite.test.RelMetadataTest$ColType$Handler.getColType("
+          + "org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery,int)]"
+          + " applied to argument of type [class org.apache.calcite.rel.logical.LogicalFilter];"
+          + " we recommend you create a catch-all (RelNode) handler";
       assertThat(e.getMessage(), is(value));
     }
   }
@@ -1887,10 +1894,8 @@
 
       // Repeat the above tests directly against the handler.
       final RelMdColumnUniqueness handler =
-          (RelMdColumnUniqueness) RelMdColumnUniqueness.SOURCE
-              .handlers(BuiltInMetadata.ColumnUniqueness.DEF)
-              .get(BuiltInMethod.COLUMN_UNIQUENESS.method)
-              .iterator().next();
+          (RelMdColumnUniqueness) Iterables.getOnlyElement(RelMdColumnUniqueness.SOURCE
+              .handlers(BuiltInMetadata.ColumnUniqueness.Handler.class));
       assertThat(handler.areColumnsUnique(values, mq, col0, false),
           is(true));
       assertThat(handler.areColumnsUnique(values, mq, col1, false),
@@ -3512,7 +3517,7 @@
    * reflection. */
   public static class ColTypeImpl extends PartialColTypeImpl {
     public static final RelMetadataProvider SOURCE =
-        ReflectiveRelMetadataProvider.reflectiveSource(ColType.METHOD, new ColTypeImpl());
+        ReflectiveRelMetadataProvider.reflectiveSource(new ColTypeImpl(), ColType.Handler.class);
 
     /** Implementation of {@link ColType#getColType(int)} for
      * {@link RelNode}, called via reflection. */
@@ -3528,8 +3533,8 @@
   /** Implementation of {@link ColType} that has no fall-back for {@link RelNode}. */
   public static class BrokenColTypeImpl extends PartialColTypeImpl {
     public static final RelMetadataProvider SOURCE =
-        ReflectiveRelMetadataProvider.reflectiveSource(ColType.METHOD,
-            new BrokenColTypeImpl());
+        ReflectiveRelMetadataProvider.reflectiveSource(
+            new BrokenColTypeImpl(), ColType.Handler.class);
   }
 
   /** Extension to {@link RelMetadataQuery} to support {@link ColType}.
@@ -3547,7 +3552,7 @@
         try {
           return colTypeHandler.getColType(rel, this, column);
         } catch (JaninoRelMetadataProvider.NoHandler e) {
-          colTypeHandler = revise(e.relClass, ColType.DEF);
+          colTypeHandler = revise(ColType.Handler.class);
         }
       }
     }
