diff --git a/examples/servicebased.circle/pom.xml b/examples/servicebased.circle/pom.xml
index 71d293a..0f01c5a 100644
--- a/examples/servicebased.circle/pom.xml
+++ b/examples/servicebased.circle/pom.xml
@@ -16,8 +16,8 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project>
-
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  
   <parent>
     <groupId>org.apache.felix</groupId>
     <artifactId>felix</artifactId>
@@ -59,6 +59,14 @@
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/examples/servicebased.circle/src/main/java/org/apache/felix/example/servicebased/circle/Activator.java b/examples/servicebased.circle/src/main/java/org/apache/felix/example/servicebased/circle/Activator.java
index a21a684..f1391e3 100644
--- a/examples/servicebased.circle/src/main/java/org/apache/felix/example/servicebased/circle/Activator.java
+++ b/examples/servicebased.circle/src/main/java/org/apache/felix/example/servicebased/circle/Activator.java
@@ -23,11 +23,13 @@
 import java.awt.GradientPaint;
 import java.awt.Graphics2D;
 import java.awt.Point;
-import java.awt.geom.*;
+import java.awt.geom.Ellipse2D;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import javax.swing.ImageIcon;
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
-import org.osgi.framework.*;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 
 /**
  * This class implements a simple bundle activator for the circle
@@ -47,7 +49,7 @@
     public void start(BundleContext context)
     {
         m_context = context;
-        Hashtable dict = new Hashtable();
+        Dictionary<String, Object> dict = new Hashtable<String, Object>();
         dict.put(SimpleShape.NAME_PROPERTY, "Circle");
         dict.put(SimpleShape.ICON_PROPERTY,
             new ImageIcon(this.getClass().getResource("circle.png")));
diff --git a/examples/servicebased.host/pom.xml b/examples/servicebased.host/pom.xml
index 36a8a05..115a72d 100644
--- a/examples/servicebased.host/pom.xml
+++ b/examples/servicebased.host/pom.xml
@@ -16,7 +16,7 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <parent>
     <groupId>org.apache.felix</groupId>
@@ -59,6 +59,14 @@
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/Activator.java b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/Activator.java
index 77524c6..4615034 100644
--- a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/Activator.java
+++ b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/Activator.java
@@ -22,17 +22,18 @@
 import java.awt.event.WindowEvent;
 import java.io.File;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
-import javax.swing.*;
-
-import org.osgi.framework.*;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
 import org.apache.felix.framework.Felix;
 import org.apache.felix.framework.util.FelixConstants;
-import org.apache.felix.framework.util.StringMap;
-import org.apache.felix.framework.cache.BundleCache;
 import org.apache.felix.main.AutoActivator;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
 
 /**
  * The activator of the host application bundle. The activator creates the
@@ -62,13 +63,14 @@
     **/
     public void start(final BundleContext context)
     {
-        javax.swing.SwingUtilities.invokeLater(new Runnable() {
+        SwingUtilities.invokeLater(new Runnable() {
             // This creates of the application window.
             public void run()
             {
                 m_frame = new DrawingFrame();
                 m_frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                 m_frame.addWindowListener(new WindowAdapter() {
+                    @Override
                     public void windowClosing(WindowEvent evt)
                     {
                         try
@@ -114,7 +116,7 @@
         {
             try
             {
-                javax.swing.SwingUtilities.invokeAndWait(runner);
+                SwingUtilities.invokeAndWait(runner);
             }
             catch (Exception ex)
             {
@@ -140,13 +142,14 @@
         final File cachedir = File.createTempFile("felix.example.servicebased", null);
         cachedir.delete();
         Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
             public void run()
             {
                 deleteFileOrDir(cachedir);
             }
         });
 
-        Map configMap = new StringMap(false);
+        Map<String, Object> configMap = new HashMap<String, Object>();
         configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
             "org.apache.felix.example.servicebased.host.service; version=1.0.0");
         configMap.put(AutoActivator.AUTO_START_PROP + ".1",
@@ -157,7 +160,7 @@
         configMap.put(Constants.FRAMEWORK_STORAGE, cachedir.getAbsolutePath());
 
         // Create list to hold custom framework activators.
-        List list = new ArrayList();
+        List<BundleActivator> list = new ArrayList<BundleActivator>();
         // Add activator to process auto-start/install properties.
         list.add(new AutoActivator(configMap));
         // Add our own activator.
diff --git a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/DrawingFrame.java b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/DrawingFrame.java
index 82c079b..b2672ff 100644
--- a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/DrawingFrame.java
+++ b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/DrawingFrame.java
@@ -18,11 +18,23 @@
  */
 package org.apache.felix.example.servicebased.host;
 
-import java.awt.*;
-import java.awt.event.*;
-import java.util.*;
-
-import javax.swing.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.HashMap;
+import java.util.Map;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JToolBar;
 
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
 
@@ -38,13 +50,13 @@
 {
     private static final long serialVersionUID = 1L;
     private static final int BOX = 54;
-    private JToolBar m_toolbar;
+    private final JToolBar m_toolbar;
     private String m_selected;
-    private JPanel m_panel;
+    private final JPanel m_panel;
     private ShapeComponent m_selectedComponent;
-    private Map m_shapes = new HashMap();
-    private SimpleShape m_defaultShape = new DefaultShape();
-    private ActionListener m_reusableActionListener = new ShapeActionListener();
+    private final Map<String, ShapeInfo> m_shapes = new HashMap<String, ShapeInfo>();
+    private final SimpleShape m_defaultShape = new DefaultShape();
+    private final ActionListener m_reusableActionListener = new ShapeActionListener();
 
     /**
      * Default constructor that populates the main window.
@@ -83,7 +95,7 @@
     **/
     public SimpleShape getShape(String name)
     {
-        ShapeInfo info = (ShapeInfo) m_shapes.get(name);
+        ShapeInfo info = m_shapes.get(name);
         if (info == null)
         {
             return m_defaultShape;
@@ -261,9 +273,9 @@
     **/
     private static class ShapeInfo
     {
-        public String m_name;
-        public Icon m_icon;
-        public SimpleShape m_shape;
+        private final String m_name;
+        private final Icon m_icon;
+        private final SimpleShape m_shape;
         public ShapeInfo(String name, Icon icon, SimpleShape shape)
         {
             m_name = name;
diff --git a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeComponent.java b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeComponent.java
index fbeca54..e7ea189 100644
--- a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeComponent.java
+++ b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeComponent.java
@@ -18,10 +18,11 @@
  */
 package org.apache.felix.example.servicebased.host;
 
-import java.awt.*;
-
-import javax.swing.*;
-
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.RenderingHints;
+import javax.swing.JComponent;
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
 
 /**
@@ -31,8 +32,8 @@
 public class ShapeComponent extends JComponent
 {
     private static final long serialVersionUID = 1L;
-    private DrawingFrame m_frame;
-    private String m_shapeName;
+    private final DrawingFrame m_frame;
+    private final String m_shapeName;
 
     /**
      * Construct a component for the specified drawing frame with the specified
@@ -54,7 +55,8 @@
      * to account for service dynamism.
      * @param g The graphics object to use for painting.
     **/
-    protected void paintComponent(Graphics g)
+    @Override
+	protected void paintComponent(Graphics g)
     {
         super.paintComponent(g);
         Graphics2D g2 = (Graphics2D) g;
diff --git a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeTracker.java b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeTracker.java
index 0a76971..5393764 100644
--- a/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeTracker.java
+++ b/examples/servicebased.host/src/main/java/org/apache/felix/example/servicebased/host/ShapeTracker.java
@@ -18,11 +18,13 @@
  */
 package org.apache.felix.example.servicebased.host;
 
-import javax.swing.*;
+import javax.swing.Icon;
+import javax.swing.SwingUtilities;
 
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
-import org.osgi.framework.*;
-import org.osgi.util.tracker.*;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
 
 /**
  * Extends the <tt>ServiceTracker</tt> to create a tracker for
@@ -35,16 +37,10 @@
 **/
 public class ShapeTracker extends ServiceTracker
 {
-    // Flag indicating an added shape.
-    private static final int ADDED = 1;
-    // Flag indicating a modified shape.
-    private static final int MODIFIED = 2;
-    // Flag indicating a removed shape.
-    private static final int REMOVED = 3;
     // The bundle context used for tracking.
-    private BundleContext m_context;
+    private final BundleContext m_context;
     // The application object to notify.
-    private DrawingFrame m_frame;
+    private final DrawingFrame m_frame;
 
     /**
      * Constructs a tracker that uses the specified bundle context to
@@ -66,10 +62,11 @@
      * @param ref The service reference of the added service.
      * @return The service object to be used by the tracker.
     **/
+    @Override
     public Object addingService(ServiceReference ref)
     {
         SimpleShape shape = new DefaultShape(m_context, ref);
-        processShapeOnEventThread(ADDED, ref, shape);
+        processShapeOnEventThread(ShapeEvent.ADDED, ref, shape);
         return shape;
     }
 
@@ -79,9 +76,10 @@
      * @param ref The service reference of the modified service.
      * @param svc The service object of the modified service.
     **/
+    @Override
     public void modifiedService(ServiceReference ref, Object svc)
     {
-        processShapeOnEventThread(MODIFIED, ref, (SimpleShape) svc);
+        processShapeOnEventThread(ShapeEvent.MODIFIED, ref, (SimpleShape) svc);
     }
 
     /**
@@ -90,9 +88,10 @@
      * @param ref The service reference of the removed service.
      * @param svc The service object of the removed service.
     **/
+    @Override
     public void removedService(ServiceReference ref, Object svc)
     {
-        processShapeOnEventThread(REMOVED, ref, (SimpleShape) svc);
+        processShapeOnEventThread(ShapeEvent.REMOVED, ref, (SimpleShape) svc);
         ((DefaultShape) svc).dispose();
     }
 
@@ -100,22 +99,22 @@
      * Processes a received service notification from the <tt>ServiceTracker</tt>,
      * forcing the processing of the notification onto the Swing event thread
      * if it is not already on it.
-     * @param action The type of action associated with the notification.
+     * @param event The type of action associated with the notification.
      * @param ref The service reference of the corresponding service.
      * @param shape The service object of the corresponding service.
     **/
     private void processShapeOnEventThread(
-        int action, ServiceReference ref, SimpleShape shape)
+        ShapeEvent event, ServiceReference ref, SimpleShape shape)
     {
         try
         {
             if (SwingUtilities.isEventDispatchThread())
             {
-                processShape(action, ref, shape);
+                processShape(event, ref, shape);
             }
             else
             {
-                SwingUtilities.invokeAndWait(new ShapeRunnable(action, ref, shape));
+                SwingUtilities.invokeAndWait(new ShapeRunnable(event, ref, shape));
             }
         }
         catch (Exception ex)
@@ -128,15 +127,15 @@
      * Actually performs the processing of the service notification. Invokes
      * the appropriate callback method on the application object depending on
      * the action type of the notification.
-     * @param action The type of action associated with the notification.
+     * @param event The type of action associated with the notification.
      * @param ref The service reference of the corresponding service.
      * @param shape The service object of the corresponding service.
     **/
-    private void processShape(int action, ServiceReference ref, SimpleShape shape)
+    private void processShape(ShapeEvent event, ServiceReference ref, SimpleShape shape)
     {
         String name = (String) ref.getProperty(SimpleShape.NAME_PROPERTY);
 
-        switch (action)
+        switch (event)
         {
             case MODIFIED:
                 m_frame.removeShape(name);
@@ -160,20 +159,20 @@
     **/
     private class ShapeRunnable implements Runnable
     {
-        private int m_action;
-        private ServiceReference m_ref;
-        private SimpleShape m_shape;
+        private final ShapeEvent m_event;
+        private final ServiceReference m_ref;
+        private final SimpleShape m_shape;
 
         /**
          * Constructs an object with the specified action, service reference,
          * and service object for processing on the Swing event thread.
-         * @param action The type of action associated with the notification.
+         * @param event The type of action associated with the notification.
          * @param ref The service reference of the corresponding service.
          * @param shape The service object of the corresponding service.
         **/
-        public ShapeRunnable(int action, ServiceReference ref, SimpleShape shape)
+        public ShapeRunnable(ShapeEvent event, ServiceReference ref, SimpleShape shape)
         {
-            m_action = action;
+            m_event = event;
             m_ref = ref;
             m_shape = shape;
         }
@@ -183,7 +182,14 @@
         **/
         public void run()
         {
-            processShape(m_action, m_ref, m_shape);
+            processShape(m_event, m_ref, m_shape);
         }
     }
+
+    private static enum ShapeEvent
+    {
+        ADDED,
+        MODIFIED,
+        REMOVED
+    }
 }
\ No newline at end of file
diff --git a/examples/servicebased.square/pom.xml b/examples/servicebased.square/pom.xml
index efa78b6..89b241a 100644
--- a/examples/servicebased.square/pom.xml
+++ b/examples/servicebased.square/pom.xml
@@ -16,7 +16,7 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <parent>
     <groupId>org.apache.felix</groupId>
@@ -59,6 +59,14 @@
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/examples/servicebased.square/src/main/java/org/apache/felix/example/servicebased/square/Activator.java b/examples/servicebased.square/src/main/java/org/apache/felix/example/servicebased/square/Activator.java
index 5867223..984d1eb 100644
--- a/examples/servicebased.square/src/main/java/org/apache/felix/example/servicebased/square/Activator.java
+++ b/examples/servicebased.square/src/main/java/org/apache/felix/example/servicebased/square/Activator.java
@@ -23,11 +23,13 @@
 import java.awt.GradientPaint;
 import java.awt.Graphics2D;
 import java.awt.Point;
-import java.awt.geom.*;
+import java.awt.geom.Rectangle2D;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import javax.swing.ImageIcon;
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
-import org.osgi.framework.*;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 
 /**
  * This class implements a simple bundle activator for the square
@@ -47,7 +49,7 @@
     public void start(BundleContext context)
     {
         m_context = context;
-        Hashtable dict = new Hashtable();
+        Dictionary<String, Object> dict = new Hashtable<String, Object>();
         dict.put(SimpleShape.NAME_PROPERTY, "Square");
         dict.put(SimpleShape.ICON_PROPERTY,
             new ImageIcon(this.getClass().getResource("square.png")));
diff --git a/examples/servicebased.trapezoid/pom.xml b/examples/servicebased.trapezoid/pom.xml
index b52b91b..09b5fa7 100644
--- a/examples/servicebased.trapezoid/pom.xml
+++ b/examples/servicebased.trapezoid/pom.xml
@@ -16,7 +16,7 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <parent>
     <groupId>org.apache</groupId>
@@ -57,6 +57,14 @@
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/examples/servicebased.trapezoid/src/main/java/org/apache/felix/example/servicebased/trapezoid/Activator.java b/examples/servicebased.trapezoid/src/main/java/org/apache/felix/example/servicebased/trapezoid/Activator.java
index 1c94b10..23d628f 100644
--- a/examples/servicebased.trapezoid/src/main/java/org/apache/felix/example/servicebased/trapezoid/Activator.java
+++ b/examples/servicebased.trapezoid/src/main/java/org/apache/felix/example/servicebased/trapezoid/Activator.java
@@ -23,11 +23,13 @@
 import java.awt.GradientPaint;
 import java.awt.Graphics2D;
 import java.awt.Point;
-import java.awt.geom.*;
+import java.awt.geom.GeneralPath;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import javax.swing.ImageIcon;
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
-import org.osgi.framework.*;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 
 /**
  * This class implements a simple bundle activator for the trapezoid
@@ -47,7 +49,7 @@
     public void start(BundleContext context)
     {
         m_context = context;
-        Hashtable dict = new Hashtable();
+        Dictionary<String, Object> dict = new Hashtable<String, Object>();
         dict.put(SimpleShape.NAME_PROPERTY, "Trapezoid");
         dict.put(SimpleShape.ICON_PROPERTY,
             new ImageIcon(this.getClass().getResource("trapezoid.png")));
diff --git a/examples/servicebased.triangle/pom.xml b/examples/servicebased.triangle/pom.xml
index 67716ec..1178e18 100644
--- a/examples/servicebased.triangle/pom.xml
+++ b/examples/servicebased.triangle/pom.xml
@@ -16,7 +16,7 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <parent>
     <groupId>org.apache.felix</groupId>
@@ -59,6 +59,14 @@
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/examples/servicebased.triangle/src/main/java/org/apache/felix/example/servicebased/triangle/Activator.java b/examples/servicebased.triangle/src/main/java/org/apache/felix/example/servicebased/triangle/Activator.java
index ade57d1..55efbaa 100644
--- a/examples/servicebased.triangle/src/main/java/org/apache/felix/example/servicebased/triangle/Activator.java
+++ b/examples/servicebased.triangle/src/main/java/org/apache/felix/example/servicebased/triangle/Activator.java
@@ -23,11 +23,13 @@
 import java.awt.GradientPaint;
 import java.awt.Graphics2D;
 import java.awt.Point;
-import java.awt.geom.*;
+import java.awt.geom.GeneralPath;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import javax.swing.ImageIcon;
 import org.apache.felix.example.servicebased.host.service.SimpleShape;
-import org.osgi.framework.*;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 
 /**
  * This class implements a simple bundle activator for the triangle
@@ -47,7 +49,7 @@
     public void start(BundleContext context)
     {
         m_context = context;
-        Hashtable dict = new Hashtable();
+        Dictionary<String, Object> dict = new Hashtable<String, Object>();
         dict.put(SimpleShape.NAME_PROPERTY, "Triangle");
         dict.put(SimpleShape.ICON_PROPERTY,
             new ImageIcon(this.getClass().getResource("triangle.png")));
