diff --git a/api/src/main/java/jakarta/el/BeanSupportFull.java b/api/src/main/java/jakarta/el/BeanSupportFull.java
index b3a6a1d..a4f5703 100644
--- a/api/src/main/java/jakarta/el/BeanSupportFull.java
+++ b/api/src/main/java/jakarta/el/BeanSupportFull.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023 Contributors to the Eclipse Foundation
- * 
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
  * http://www.eclipse.org/legal/epl-2.0.
@@ -41,34 +41,10 @@
                 for (PropertyDescriptor pd : pds) {
                     this.propertyMap.put(pd.getName(), new BeanPropertyFull(baseClass, pd));
                 }
-                /*
-                 * Populating from any interfaces causes default methods to be included.
-                 */
-                populateFromInterfaces(baseClass);
             } catch (IntrospectionException ie) {
                 throw new ELException(ie);
             }
         }
-
-        private void populateFromInterfaces(Class<?> aClass) throws IntrospectionException {
-            Class<?> interfaces[] = aClass.getInterfaces();
-            if (interfaces.length > 0) {
-                for (Class<?> ifs : interfaces) {
-                    BeanInfo info = Introspector.getBeanInfo(ifs);
-                    PropertyDescriptor[] pds = info.getPropertyDescriptors();
-                    for (PropertyDescriptor pd : pds) {
-                        if (!this.propertyMap.containsKey(pd.getName())) {
-                            this.propertyMap.put(pd.getName(), new BeanPropertyFull(this.baseClass, pd));
-                        }
-                    }
-                    populateFromInterfaces(ifs);
-                }
-            }
-            Class<?> superclass = aClass.getSuperclass();
-            if (superclass != null) {
-                populateFromInterfaces(superclass);
-            }
-        }
     }
 
     static final class BeanPropertyFull extends BeanProperty {
diff --git a/api/src/main/java/jakarta/el/BeanSupportStandalone.java b/api/src/main/java/jakarta/el/BeanSupportStandalone.java
index 29a515a..cc4ff6e 100644
--- a/api/src/main/java/jakarta/el/BeanSupportStandalone.java
+++ b/api/src/main/java/jakarta/el/BeanSupportStandalone.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023 Contributors to the Eclipse Foundation
- * 
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
  * http://www.eclipse.org/legal/epl-2.0.
@@ -171,29 +171,6 @@
             for (PropertyDescriptor pd : pds) {
                 this.propertyMap.put(pd.getName(), new BeanPropertyStandalone(baseClass, pd));
             }
-            /*
-             * Populating from any interfaces causes default methods to be included.
-             */
-            populateFromInterfaces(baseClass);
-        }
-
-        private void populateFromInterfaces(Class<?> aClass) {
-            Class<?> interfaces[] = aClass.getInterfaces();
-            if (interfaces.length > 0) {
-                for (Class<?> ifs : interfaces) {
-                    PropertyDescriptor[] pds = getPropertyDescriptors(baseClass);
-                    for (PropertyDescriptor pd : pds) {
-                        if (!this.propertyMap.containsKey(pd.getName())) {
-                            this.propertyMap.put(pd.getName(), new BeanPropertyStandalone(this.baseClass, pd));
-                        }
-                    }
-                    populateFromInterfaces(ifs);
-                }
-            }
-            Class<?> superclass = aClass.getSuperclass();
-            if (superclass != null) {
-                populateFromInterfaces(superclass);
-            }
         }
     }
 
diff --git a/api/src/test/java/jakarta/el/TestBeanSupport.java b/api/src/test/java/jakarta/el/TestBeanSupport.java
index e7ed166..5d52ec0 100644
--- a/api/src/test/java/jakarta/el/TestBeanSupport.java
+++ b/api/src/test/java/jakarta/el/TestBeanSupport.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023 Contributors to the Eclipse Foundation
- * 
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
+ *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
  * http://www.eclipse.org/legal/epl-2.0.
@@ -96,6 +96,12 @@
         doTest(useStandalone, AmbiguousBean02.class, "value", TypeA.class, null, TypeA.class);
     }
 
+    @ParameterizedTest
+    @MethodSource("data")
+    public void testInterfaceDefaultMethod(boolean useStandalone) {
+        doTest(useStandalone, BeanB.class, "defaultValue", String.class, String.class, null);
+    }
+
     private void doTest(boolean useStandalone, Class<?> clazz, String propertyName, Class<?> type, Class<?> typeGet,
             Class<?> typeSet) {
         configureBeanSupport(useStandalone);
@@ -265,4 +271,15 @@
 
     public static class TypeAAA extends TypeAA {
     }
+
+
+    public static interface InterfaceB {
+        default String getDefaultValue() {
+            return "";
+        }
+    }
+
+
+    public static class BeanB implements InterfaceB {
+    }
 }
