diff --git a/examples/extenderbased.host/pom.xml b/examples/extenderbased.host/pom.xml
index 6cf6f2c..e54bd16 100644
--- a/examples/extenderbased.host/pom.xml
+++ b/examples/extenderbased.host/pom.xml
@@ -36,7 +36,9 @@
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.main</artifactId>
-      <version>1.8.0</version>
+      <version>4.0.2</version>
+      <type>zip</type>
+      <classifier>source-release</classifier>
     </dependency>
   </dependencies>
   <build>
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java
index 7f6a8ca..7e771e7 100644
--- a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java
+++ b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java
@@ -20,10 +20,8 @@
 
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
-
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
@@ -39,7 +37,7 @@
 public class Activator implements BundleActivator
 {
     private DrawingFrame m_frame = null;
-    private ShapeTracker m_shapetracker = null;
+    private ShapeBundleTracker m_shapetracker = null;
 
     /**
      * Displays the applications window and starts extension tracking;
@@ -75,7 +73,7 @@
 
                 m_frame.setVisible(true);
 
-                m_shapetracker = new ShapeTracker(context, m_frame);
+                m_shapetracker = new ShapeBundleTracker(context, m_frame);
                 m_shapetracker.open();
             }
         });
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/BundleTracker.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/BundleTracker.java
deleted file mode 100644
index a25750f..0000000
--- a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/BundleTracker.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.felix.example.extenderbased.host;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.SynchronousBundleListener;
-
-/**
- * This is a very simple bundle tracker utility class that tracks active
- * bundles. The tracker must be given a bundle context upon creation,
- * which it uses to listen for bundle events. The bundle tracker must be
- * opened to track objects and closed when it is no longer needed. This
- * class is abstract, which means in order to use it you must create a
- * subclass of it. Subclasses must implement the <tt>addedBundle()</tt>
- * and <tt>removedBundle()</tt> methods, which can be used to perform some
- * custom action upon the activation or deactivation of bundles. Since this
- * tracker is quite simple, its concurrency control approach is also
- * simplistic. This means that subclasses should take great care to ensure
- * that their <tt>addedBundle()</tt> and <tt>removedBundle()</tt> methods
- * are very simple and do not do anything to change the state of any bundles.
-**/
-public abstract class BundleTracker
-{
-    final Set<Bundle> m_bundles = new HashSet<Bundle>();
-    protected final BundleContext m_context;
-    final SynchronousBundleListener m_listener;
-    boolean m_open;
-
-    /**
-     * Constructs a bundle tracker object that will use the specified
-     * bundle context.
-     * @param context The bundle context to use to track bundles.
-    **/
-    public BundleTracker(BundleContext context)
-    {
-        m_context = context;
-        m_listener = new SynchronousBundleListener() {
-            public void bundleChanged(BundleEvent evt)
-            {
-                synchronized (BundleTracker.this)
-                {
-                    if (!m_open)
-                    {
-                        return;
-                    }
-
-                    if (evt.getType() == BundleEvent.STARTED)
-                    {
-                        if (!m_bundles.contains(evt.getBundle()))
-                        {
-                            m_bundles.add(evt.getBundle());
-                            addedBundle(evt.getBundle());
-                        }
-                    }
-                    else if (evt.getType() == BundleEvent.STOPPED)
-                    {
-                        if (m_bundles.contains(evt.getBundle()))
-                        {
-                            m_bundles.remove(evt.getBundle());
-                            removedBundle(evt.getBundle());
-                        }
-                    }
-                }
-            }
-        };
-    }
-
-    /**
-     * Returns the current set of active bundles.
-     * @return The current set of active bundles.
-    **/
-    public synchronized Bundle[] getBundles()
-    {
-        return m_bundles.toArray(new Bundle[m_bundles.size()]);
-    }
-
-    /**
-     * Call this method to start the tracking of active bundles.
-    **/
-    public synchronized void open()
-    {
-        if (!m_open)
-        {
-            m_open = true;
-
-            m_context.addBundleListener(m_listener);
-
-            Bundle[] bundles = m_context.getBundles();
-            for (Bundle bundle : bundles)
-            {
-                if (bundle.getState() == Bundle.ACTIVE)
-                {
-                    m_bundles.add(bundle);
-                    addedBundle(bundle);
-                }
-            }
-        }
-    }
-
-    /**
-     * Call this method to stop the tracking of active bundles.
-    **/
-    public synchronized void close()
-    {
-        if (m_open)
-        {
-            m_open = false;
-
-            m_context.removeBundleListener(m_listener);
-
-            for (Iterator<Bundle> itr = m_bundles.iterator(); itr.hasNext();)
-            {
-                Bundle bundle = itr.next();
-                itr.remove();
-                removedBundle(bundle);
-            }
-        }
-    }
-
-    /**
-     * Subclasses must implement this method; it can be used to perform
-     * actions upon the activation of a bundle. Subclasses should keep
-     * this method implementation as simple as possible and should not
-     * cause the change in any bundle state to avoid concurrency issues.
-     * @param bundle The bundle being added to the active set.
-    **/
-    protected abstract void addedBundle(Bundle bundle);
-
-    /**
-     * Subclasses must implement this method; it can be used to perform
-     * actions upon the deactivation of a bundle. Subclasses should keep
-     * this method implementation as simple as possible and should not
-     * cause the change in any bundle state to avoid concurrency issues.
-     * @param bundle The bundle being removed from the active set.
-    **/
-    protected abstract void removedBundle(Bundle bundle);
-}
\ No newline at end of file
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java
new file mode 100644
index 0000000..93b3a09
--- /dev/null
+++ b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java
@@ -0,0 +1,144 @@
+package org.apache.felix.example.extenderbased.host;
+
+import java.util.Dictionary;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.SwingUtilities;
+import org.apache.felix.example.extenderbased.host.extension.SimpleShape;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.util.tracker.BundleTracker;
+
+/**
+ * This is a simple bundle tracker utility class that tracks active
+ * bundles. The tracker must be given a bundle context upon creation,
+ * which it uses to listen for bundle events. The bundle tracker must be
+ * opened to track objects and closed when it is no longer needed.
+ *
+ * @see BundleTracker
+**/
+public class ShapeBundleTracker extends BundleTracker<SimpleShape>
+{
+    // The application object to notify.
+    private final DrawingFrame m_frame;
+
+    /**
+     * Constructs a tracker that uses the specified bundle context to
+     * track extensions and notifies the specified application object about
+     * changes.
+     * @param context The bundle context to be used by the tracker.
+     * @param frame The application object to notify about extension changes.
+    **/
+    public ShapeBundleTracker(BundleContext context, DrawingFrame frame)
+    {
+        // we only want to track active bundles
+        super(context, Bundle.ACTIVE, null);
+        this.m_frame = frame;
+    }
+
+    // Gets called when a bundle in enters the state ACTIVE
+    @Override
+    public SimpleShape addingBundle(Bundle bundle, BundleEvent event)
+    {
+        // Try to get the name of the extension.
+        Dictionary<String, String> dict = bundle.getHeaders();
+        String name = dict.get(SimpleShape.NAME_PROPERTY);
+
+        // if the name is not null, bundle is a ShapeBundle
+        if (name != null)
+        {
+            // Get the icon resource of the extension.
+            String iconPath = dict.get(SimpleShape.ICON_PROPERTY);
+            Icon icon = new ImageIcon(bundle.getResource(iconPath));
+            // Get the class of the extension.
+            String className = dict.get(SimpleShape.CLASS_PROPERTY);
+            SimpleShape shape = new DefaultShape(bundle.getBundleContext(),
+                bundle.getBundleId(), className);
+            processAdd(name, icon, shape);
+            return shape;
+        }
+
+        // bundle is no ShapeBundle, ingore it
+        return null;
+    }
+
+    /**
+     * Util method to process the addition of a new shape.
+     *
+     * @param name The name of the new shape
+     * @param icon The icon of the new shape
+     * @param shape the shape itself
+     */
+    private void processAdd(final String name, final Icon icon, final SimpleShape shape)
+    {
+        try
+        {
+            if (SwingUtilities.isEventDispatchThread())
+            {
+                m_frame.addShape(name, icon, shape);
+            }
+            else
+            {
+                SwingUtilities.invokeAndWait(new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        m_frame.addShape(name, icon, shape);
+                    }
+                });
+            }
+        }
+        catch (Exception ex)
+        {
+            ex.printStackTrace();
+        }
+    }
+
+    // Gets called when a bundle leaves the ACTIVE state
+    @Override
+    public void removedBundle(Bundle bundle, BundleEvent event, SimpleShape object)
+    {
+        // Try to get the name of the extension.
+        Dictionary<String, String> dict = bundle.getHeaders();
+        String name = dict.get(SimpleShape.NAME_PROPERTY);
+
+        // if the name is not null, bundle is a ShapeBundle
+        if (name != null)
+        {
+            prcoessRemove(name);
+        }
+    }
+
+    /**
+     * Util method to process the removal of a shape.
+     *
+     * @param name the name of the shape that is about to be removed.
+     */
+    private void prcoessRemove(final String name)
+    {
+        try
+        {
+            if (SwingUtilities.isEventDispatchThread())
+            {
+                m_frame.removeShape(name);
+            }
+            else
+            {
+                SwingUtilities.invokeAndWait(new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        m_frame.removeShape(name);
+                    }
+                });
+            }
+        }
+        catch (Exception ex)
+        {
+            ex.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeTracker.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeTracker.java
deleted file mode 100644
index 6f4baf4..0000000
--- a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeTracker.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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.felix.example.extenderbased.host;
-
-import java.util.Dictionary;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.SwingUtilities;
-import org.apache.felix.example.extenderbased.host.extension.SimpleShape;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * Extends the <tt>BundleTracker</tt> to create a tracker for
- * <tt>SimpleShape</tt> extensions. The tracker is responsible for
- * listening for <tt>SimpleShape</tt> extensions and informing the
- * application about the availability of shapes. This tracker forces
- * all notifications to be processed on the Swing event thread to
- * avoid synchronization and redraw issues.
-**/
-public class ShapeTracker extends BundleTracker
-{
-    // The application object to notify.
-    private final DrawingFrame m_frame;
-
-    /**
-     * Constructs a tracker that uses the specified bundle context to
-     * track extensions and notifies the specified application object about
-     * changes.
-     * @param context The bundle context to be used by the tracker.
-     * @param frame The application object to notify about extension changes.
-    **/
-    public ShapeTracker(BundleContext context, DrawingFrame frame)
-    {
-        super(context);
-        m_frame = frame;
-    }
-
-    /**
-     * Overrides the <tt>BundleTracker</tt> functionality to inform
-     * the application object about the added extensions.
-     * @param bundle The activated bundle.
-    **/
-    @Override
-    protected void addedBundle(Bundle bundle)
-    {
-        processBundleOnEventThread(ShapeEvent.ADDED, bundle);
-    }
-
-    /**
-     * Overrides the <tt>BundleTracker</tt> functionality to inform
-     * the application object about removed extensions.
-     * @param bundle The inactivated bundle.
-    **/
-    @Override
-    protected void removedBundle(Bundle bundle)
-    {
-        processBundleOnEventThread(ShapeEvent.REMOVED, bundle);
-    }
-
-    /**
-     * Processes a received bundle notification from the <tt>BundleTracker</tt>,
-     * forcing the processing of the notification onto the Swing event thread
-     * if it is not already on it.
-     * @param event The type of action associated with the notification.
-     * @param bundle The bundle of the corresponding extension.
-    **/
-    private void processBundleOnEventThread(ShapeEvent event, Bundle bundle)
-    {
-        try
-        {
-            if (SwingUtilities.isEventDispatchThread())
-            {
-                processBundle(event, bundle);
-            }
-            else
-            {
-                SwingUtilities.invokeAndWait(new BundleRunnable(event, bundle));
-            }
-        }
-        catch (Exception ex)
-        {
-            ex.printStackTrace();
-        }
-    }
-
-    /**
-     * Actually performs the processing of the bundle notification. Invokes
-     * the appropriate callback method on the application object depending on
-     * the action type of the notification.
-     * @param event The type of action associated with the notification.
-     * @param bundle The bundle of the corresponding extension.
-    **/
-    private void processBundle(ShapeEvent event, Bundle bundle)
-    {
-        // see http://www.osgi.org/javadoc/r4v43/org/osgi/framework/Bundle.html#getHeaders()
-        @SuppressWarnings("unchecked")
-        Dictionary<String, String> dict = bundle.getHeaders();
-
-        // Try to get the name of the extension.
-        String name = dict.get(SimpleShape.NAME_PROPERTY);
-        // Return immediately if the bundle is not an extension.
-        if (name == null)
-        {
-            return;
-        }
-
-        switch (event)
-        {
-            case ADDED:
-                // Get the icon resource of the extension.
-                String iconPath = dict.get(SimpleShape.ICON_PROPERTY);
-                Icon icon = new ImageIcon(bundle.getResource(iconPath));
-                // Get the class of the extension.
-                String className = dict.get(SimpleShape.CLASS_PROPERTY);
-                m_frame.addShape(
-                    name,
-                    icon,
-                    new DefaultShape(m_context, bundle.getBundleId(), className));
-                break;
-
-            case REMOVED:
-                m_frame.removeShape(name);
-                break;
-        }
-    }
-
-    /**
-     * Simple class used to process bundle notification handling on the
-     * Swing event thread.
-    **/
-    private class BundleRunnable implements Runnable
-    {
-        private final ShapeEvent m_event;
-        private final Bundle m_bundle;
-
-        /**
-         * Constructs an object with the specified action and bundle
-         * object for processing on the Swing event thread.
-         * @param event The type of action associated with the notification.
-         * @param bundle The bundle of the corresponding extension.
-        **/
-        public BundleRunnable(ShapeEvent event, Bundle bundle)
-        {
-            m_event = event;
-            m_bundle = bundle;
-        }
-
-        /**
-         * Calls the <tt>processBundle()</tt> method.
-        **/
-        public void run()
-        {
-            processBundle(m_event, m_bundle);
-        }
-    }
-
-    private static enum ShapeEvent
-    {
-        ADDED,
-        REMOVED
-    }
-}
\ No newline at end of file
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java
index 2f5516e..df52b2f 100644
--- a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java
+++ b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java
@@ -20,7 +20,6 @@
 
 import java.util.Map;
 import java.util.ServiceLoader;
-
 import org.apache.felix.example.extenderbased.host.Activator;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -35,13 +34,13 @@
  * internal extensions to providing drawing functionality. To successfully
  * launch the stand-alone application, it must be run from this bundle's
  * installation directory using "{@code java -jar}".
- * The locations of any additional extensions that have to be started, have to 
- * be passed as command line arguments to this method. 
+ * The locations of any additional extensions that have to be started, have to
+ * be passed as command line arguments to this method.
  */
 public class Application
 {
     private static Framework m_framework = null;
-    
+
     /**
      * Enables the bundle to run as a stand-alone application. When this
      * static {@code main()} method is invoked, the application creates
@@ -49,33 +48,33 @@
      * internal extensions to provide drawing functionality. To successfully
      * launch as a stand-alone application, this method should be invoked from
      * the bundle's installation directory using "{@code java -jar}".
-     * The location of any extension that shall be installed can be passed 
+     * The location of any extension that shall be installed can be passed
      * as parameters.
      * <p>
      * For example if you build the bundles inside your workspace, maven will
-     * create a target directory in every project. To start the application 
-     * from within your IDE you should pass:  
+     * create a target directory in every project. To start the application
+     * from within your IDE you should pass:
      * <p>
      * <pre>
-     * {@code file:../extenderbased.circle/target/extenderbased.circle-1.0.0.jar 
-     * file:../extenderbased.square/target/extenderbased.square-1.0.0.jar 
+     * {@code file:../extenderbased.circle/target/extenderbased.circle-1.0.0.jar
+     * file:../extenderbased.square/target/extenderbased.square-1.0.0.jar
      * file:../extenderbased.triangle/target/extenderbased.triangle-1.0.0.jar}
      * </pre>
-     * 
+     *
      * @param args The locations of additional bundles to start.
     **/
     public static void main(String[] args)
     {
         // args should never be null if the application is run from the command line. Check it anyway.
         String[] locations = args != null ? args : new String[0];
-        
+
         // Print welcome banner.
         System.out.println("\nWelcome to My Launcher");
         System.out.println("======================\n");
 
         try
         {
-            Map<String, Object> config = ConfigUtil.createConfig();
+            Map<String, String> config = ConfigUtil.createConfig();
             m_framework = createFramework(config);
             m_framework.init();
             m_framework.start();
@@ -92,13 +91,13 @@
     }
 
     /**
-     * Util method for creating an embedded Framework. Tries to create a {@link FrameworkFactory} 
+     * Util method for creating an embedded Framework. Tries to create a {@link FrameworkFactory}
      * which is then be used to create the framework.
      *
      * @param config the configuration to create the framework with
      * @return a Framework with the given configuration
      */
-    private static Framework createFramework(Map<String, Object> config)
+    private static Framework createFramework(Map<String, String> config)
     {
         ServiceLoader<FrameworkFactory> factoryLoader = ServiceLoader.load(FrameworkFactory.class);
         for(FrameworkFactory factory : factoryLoader){
@@ -106,10 +105,10 @@
         }
         throw new IllegalStateException("Unable to load FrameworkFactory service.");
     }
-    
+
     /**
-     * Installs and starts all bundles used by the application. Therefore the host bundle will be started. The locations 
-     * of extensions for the host bundle can be passed in as parameters.  
+     * Installs and starts all bundles used by the application. Therefore the host bundle will be started. The locations
+     * of extensions for the host bundle can be passed in as parameters.
      *
      * @param bundleLocations the locations where extension for the host bundle are located. Must not be {@code null}!
      * @throws BundleException if something went wrong while installing or starting the bundles.
@@ -125,4 +124,4 @@
             addition.start();
         }
     }
-}
+}
\ No newline at end of file
diff --git a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java
index b4375f6..dcfdbda 100644
--- a/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java
+++ b/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java
@@ -22,7 +22,6 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-
 import org.osgi.framework.Constants;
 
 /**
@@ -32,21 +31,22 @@
 {
 
     /**
-     * Creates a configuration for the framework. Therefore this method attempts to create 
-     * a temporary cache dir. If creation of the cache dir is successful, it will be added 
+     * Creates a configuration for the framework. Therefore this method attempts to create
+     * a temporary cache dir. If creation of the cache dir is successful, it will be added
      * to the configuration.
-     * 
+     *
      * @return
      */
-    public static Map<String, Object> createConfig()
+    public static Map<String, String> createConfig()
     {
         final File cachedir = createCacheDir();
 
-        Map<String, Object> configMap = new HashMap<String, Object>();
-        // Tells the framework to export the extension package, making it accessible for the other shape bundels
+        Map<String, String> configMap = new HashMap<String, String>();
+        // Tells the framework to export the extension package, making it accessible
+        // for the other shape bundels
         configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
             "org.apache.felix.example.extenderbased.host.extension; version=1.0.0");
-        
+
         // if we could create a cache dir, we use it. Otherwise the platform default will be used
         if (cachedir != null)
         {
@@ -57,8 +57,8 @@
     }
 
     /**
-     * Tries to create a temporay cache dir. If creation of the cache dir is successful, 
-     * it will be returned. If creation fails, null will be returned. 
+     * Tries to create a temporay cache dir. If creation of the cache dir is successful,
+     * it will be returned. If creation fails, null will be returned.
      *
      * @return a {@code File} object representing the cache dir
      */
@@ -80,7 +80,7 @@
     }
 
     /**
-     * Adds a shutdown hook to the runtime, that will make sure, that the cache dir will 
+     * Adds a shutdown hook to the runtime, that will make sure, that the cache dir will
      * be deleted after the application has been terminated.
      */
     private static void createShutdownHook(final File cachedir)
@@ -113,4 +113,4 @@
         }
         file.delete();
     }
-}
+}
\ No newline at end of file
