--- tomcat5-5.5.15/apache-tomcat-5.5.15-src/jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java.sav	2006-01-03 10:15:14.000000000 -0500
+++ tomcat5-5.5.15/apache-tomcat-5.5.15-src/jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java	2006-02-21 13:50:36.460001000 -0500
@@ -1389,18 +1389,31 @@
 	    this.customNestingLevel = makeCustomNestingLevel();
             this.childInfo = new ChildInfo();
 
-	    this.implementsIterationTag = 
-		IterationTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsBodyTag =
-		BodyTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsTryCatchFinally = 
-		TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsSimpleTag = 
-		SimpleTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsDynamicAttributes = 
-		DynamicAttributes.class.isAssignableFrom(tagHandlerClass);
+	    this.implementsIterationTag = impls(tagHandlerClass, IterationTag.class);
+	    this.implementsBodyTag = impls(tagHandlerClass, BodyTag.class);
+	    this.implementsTryCatchFinally = impls(tagHandlerClass, TryCatchFinally.class);
+	    this.implementsSimpleTag = impls(tagHandlerClass, SimpleTag.class);
+	    this.implementsDynamicAttributes = impls(tagHandlerClass, DynamicAttributes.class);
 	}
 
+        private static final boolean impls(Class klass, Class iface) {
+            if (klass.equals(iface)) { return true; }
+
+            Class[] implemented = klass.getInterfaces();
+            for (int i = 0; i < implemented.length; i++) {
+                if (impls(implemented[i], iface)) {
+                    return true;
+                }
+            }
+
+            Class sup = klass.getSuperclass();
+            if (sup == null) {
+                return false;
+            } else {
+                return impls(sup, iface);
+            }
+        }
+
 	/*
 	 * Constructor for custom action implemented by tag file.
 	 */
