diff --git a/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java b/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java
index fb68a2b..7751bc1 100644
--- a/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java
+++ b/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java
@@ -18,6 +18,7 @@
 package org.apache.commons.proxy2.interceptor;
 
 import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.Invoker;
 import org.apache.commons.proxy2.ObjectProvider;
 import org.apache.commons.proxy2.provider.ObjectProviderUtils;
 
@@ -71,12 +72,21 @@
         return new ThrowingInterceptor(provider);
     }
 
+    /**
+     * Creates an {@link Interceptor} that delegates to the specified {@link Invoker}.
+     * @param invoker delegate
+     * @return invoker {@link Interceptor}
+     */
+    public static Interceptor invoking(Invoker invoker)
+    {
+        return new InvokerInterceptor(invoker);
+    }
+
 //----------------------------------------------------------------------------------------------------------------------
 // Constructors
 //----------------------------------------------------------------------------------------------------------------------
 
     private InterceptorUtils()
     {
-
     }
 }
diff --git a/core/src/main/java/org/apache/commons/proxy2/interceptor/InvokerInterceptor.java b/core/src/main/java/org/apache/commons/proxy2/interceptor/InvokerInterceptor.java
new file mode 100644
index 0000000..d4fdaea
--- /dev/null
+++ b/core/src/main/java/org/apache/commons/proxy2/interceptor/InvokerInterceptor.java
@@ -0,0 +1,46 @@
+/*
+ * 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.commons.proxy2.interceptor;
+
+import org.apache.commons.lang3.Validate;
+import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.Invocation;
+import org.apache.commons.proxy2.Invoker;
+
+/**
+ * Adapts an {@link Invoker} to the {@link Interceptor} interface.
+ */
+public class InvokerInterceptor implements Interceptor
+{
+    private static final long serialVersionUID = 1L;
+
+    private final Invoker invoker;
+
+    public InvokerInterceptor(Invoker invoker)
+    {
+        super();
+        this.invoker = Validate.notNull(invoker);
+    }
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable
+    {
+        return invoker.invoke(invocation.getProxy(), invocation.getMethod(), invocation.getArguments());
+    }
+
+}
diff --git a/core/src/test/java/org/apache/commons/proxy2/interceptor/InvokerInterceptorTest.java b/core/src/test/java/org/apache/commons/proxy2/interceptor/InvokerInterceptorTest.java
new file mode 100644
index 0000000..6fea1f0
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy2/interceptor/InvokerInterceptorTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.commons.proxy2.interceptor;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Method;
+
+import org.apache.commons.proxy2.Invocation;
+import org.apache.commons.proxy2.Invoker;
+import org.apache.commons.proxy2.util.AbstractTestCase;
+import org.apache.commons.proxy2.util.Echo;
+import org.junit.Test;
+
+public class InvokerInterceptorTest extends AbstractTestCase
+{
+    // ----------------------------------------------------------------------------------------------------------------------
+    // Other Methods
+    // ----------------------------------------------------------------------------------------------------------------------
+
+    @Test
+    public void testIntercept() throws Throwable
+    {
+        final InvokerInterceptor interceptor = new InvokerInterceptor(new Invoker()
+        {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable
+            {
+                return "Hello!";
+            }
+        });
+        final Invocation invocation = new MockInvocationBuilder(Echo.class.getDeclaredMethod("echoBack", String.class))
+                .withArguments("foo").build();
+
+        assertEquals("Hello!", interceptor.intercept(invocation));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testWithNullInvoker()
+    {
+        new InvokerInterceptor(null);
+    }
+}
