diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
index a4ae2dd..503bf92 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
@@ -68,6 +68,9 @@
     @SafeVarargs
     public final <T extends OsgiContextImpl> void addPlugin(ContextPlugin<T>... plugin) {
         for (final ContextPlugin<T> item : plugin) {
+            if (item == null) {
+                continue;
+            }
             plugins.add(item);
         }
     }
@@ -80,6 +83,9 @@
     @SafeVarargs
     public final <T extends OsgiContextImpl> void addBeforeSetUpCallback(final ContextCallback<T>... beforeSetUpCallback) {
         for (final ContextCallback<T> item : beforeSetUpCallback) {
+            if (item == null) {
+                continue;
+            }
             plugins.add(new AbstractContextPlugin<T>() {
                 @Override
                 public void beforeSetUp(T context) throws Exception {
@@ -101,6 +107,9 @@
     @SafeVarargs
     public final <T extends OsgiContextImpl> void addAfterSetUpCallback(final ContextCallback<T>... afterSetUpCallback) {
         for (final ContextCallback<T> item : afterSetUpCallback) {
+            if (item == null) {
+                continue;
+            }
             plugins.add(new AbstractContextPlugin<T>() {
                 @Override
                 public void afterSetUp(T context) throws Exception {
@@ -122,6 +131,9 @@
     @SafeVarargs
     public final <T extends OsgiContextImpl> void addBeforeTearDownCallback(final ContextCallback<T>... beforeTearDownCallback) {
         for (final ContextCallback<T> item : beforeTearDownCallback) {
+            if (item == null) {
+                continue;
+            }
             plugins.add(new AbstractContextPlugin<T>() {
                 @Override
                 public void beforeTearDown(T context) throws Exception {
@@ -143,6 +155,9 @@
     @SafeVarargs
     public final <T extends OsgiContextImpl> void addAfterTearDownCallback(final ContextCallback<T>... afterTearDownCallback) {
         for (final ContextCallback<T> item : afterTearDownCallback) {
+            if (item == null) {
+                continue;
+            }
             plugins.add(new AbstractContextPlugin<T>() {
                 @Override
                 public void afterTearDown(T context) throws Exception {
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/context/ContextPluginsTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/context/ContextPluginsTest.java
index c6b5462..cee77f0 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/context/ContextPluginsTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/context/ContextPluginsTest.java
@@ -71,7 +71,7 @@
     @Test
     public void testExecuteBeforeSetUpCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addPlugin(plugin1, plugin2);
+        underTest.addPlugin(plugin1, plugin2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -85,7 +85,7 @@
     @Test
     public void testExecuteAfterSetUpCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addPlugin(plugin1, plugin2);
+        underTest.addPlugin(plugin1, plugin2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -99,7 +99,7 @@
     @Test
     public void testExecuteBeforeTearDownCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addPlugin(plugin1, plugin2);
+        underTest.addPlugin(plugin1, plugin2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -113,7 +113,7 @@
     @Test
     public void testExecuteAfterTearDownCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addPlugin(plugin1, plugin2);
+        underTest.addPlugin(plugin1, plugin2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -127,7 +127,7 @@
     @Test
     public void testAddBeforeSetUpCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addBeforeSetUpCallback(callback1, callback2);
+        underTest.addBeforeSetUpCallback(callback1, callback2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -139,7 +139,7 @@
     @Test
     public void testAddAfterSetUpCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addAfterSetUpCallback(callback1, callback2);
+        underTest.addAfterSetUpCallback(callback1, callback2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -151,7 +151,7 @@
     @Test
     public void testAddBeforeTearDownCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addBeforeTearDownCallback(callback1, callback2);
+        underTest.addBeforeTearDownCallback(callback1, callback2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
@@ -163,7 +163,7 @@
     @Test
     public void testAddAfterTearDownCallback() throws Exception {
         ContextPlugins underTest = new ContextPlugins();
-        underTest.addAfterTearDownCallback(callback1, callback2);
+        underTest.addAfterTearDownCallback(callback1, callback2, null);
         
         assertEquals(2, underTest.getPlugins().size());
         
