diff --git a/org.apache.felix.examples.dictionaryclient2/pom.xml b/org.apache.felix.examples.dictionaryclient2/pom.xml
index 8943f6b..e22b064 100644
--- a/org.apache.felix.examples.dictionaryclient2/pom.xml
+++ b/org.apache.felix.examples.dictionaryclient2/pom.xml
@@ -6,8 +6,8 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <packaging>osgi-bundle</packaging>
-  <name>Apache Felix Examples: Dictionary Client</name>
-  <artifactId>org.apache.felix.examples.dictionaryclient</artifactId>
+  <name>Apache Felix Examples: Dynamic Dictionary Client</name>
+  <artifactId>org.apache.felix.examples.dictionaryclient2</artifactId>
   <dependencies>
     <dependency>
       <groupId>${pom.groupId}</groupId>
@@ -31,13 +31,13 @@
         <extensions>true</extensions>
         <configuration>
           <osgiManifest>
-            <bundleName>Dictionary Client Example</bundleName>
+            <bundleName>Dynamic Dictionary Client Example</bundleName>
             <bundleVendor>Apache Software Foundation</bundleVendor>
             <bundleDescription>
-              A bundle using the dictionary service if it finds it at startup.
+              A client bundle with more complex requirements for the dictionary.
             </bundleDescription>
             <bundleActivator>
-              org.apache.felix.examples.dictionaryclient.Activator
+              org.apache.felix.examples.dictionaryclient2.Activator
             </bundleActivator>
             <importPackage>
               org.apache.felix.examples.dictionaryservice
diff --git a/org.apache.felix.examples.dictionaryclient2/src/main/java/org/apache/felix/examples/dictionaryclient2/Activator.java b/org.apache.felix.examples.dictionaryclient2/src/main/java/org/apache/felix/examples/dictionaryclient2/Activator.java
new file mode 100644
index 0000000..3e70082
--- /dev/null
+++ b/org.apache.felix.examples.dictionaryclient2/src/main/java/org/apache/felix/examples/dictionaryclient2/Activator.java
@@ -0,0 +1,200 @@
+/*
+ *   Copyright 2006 The Apache Software Foundation
+ *
+ *   Licensed 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.examples.dictionaryclient2;
+
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+import org.apache.felix.examples.dictionaryservice.DictionaryService;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ * This class implements a bundle that uses a dictionary service to check for
+ * the proper spelling of a word by checking for its existence in the
+ * dictionary. This bundle is more complex than the bundle in Example 3 because
+ * it monitors the dynamic availability of the dictionary services. In other
+ * words, if the service it is using departs, then it stops using it gracefully,
+ * or if it needs a service and one arrives, then it starts using it
+ * automatically. As before, the bundle uses the first service that it finds and
+ * uses the calling thread of the start() method to read words from standard
+ * input. You can stop checking words by entering an empty line, but to start
+ * checking words again you must stop and then restart the bundle.
+ * 
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class Activator implements BundleActivator, ServiceListener
+{
+    // Bundle's context.
+    private BundleContext m_context = null;
+
+    // The service reference being used.
+    private ServiceReference m_ref = null;
+
+    // The service object being used.
+    private DictionaryService m_dictionary = null;
+
+
+    /**
+     * Implements BundleActivator.start(). Adds itself as a listener for service
+     * events, then queries for available dictionary services. If any
+     * dictionaries are found it gets a reference to the first one available and
+     * then starts its "word checking loop". If no dictionaries are found, then
+     * it just goes directly into its "word checking loop", but it will not be
+     * able to check any words until a dictionary service arrives; any arriving
+     * dictionary service will be automatically used by the client if a
+     * dictionary is not already in use. Once it has dictionary, it reads words
+     * from standard input and checks for their existence in the dictionary that
+     * it is using. (NOTE: It is very bad practice to use the calling thread to
+     * perform a lengthy process like this; this is only done for the purpose of
+     * the tutorial.)
+     * 
+     * @param context the framework context for the bundle.
+     */
+    public void start( BundleContext context ) throws Exception
+    {
+        m_context = context;
+
+        // Listen for events pertaining to dictionary services.
+        m_context.addServiceListener( this, "(&(objectClass=" + DictionaryService.class.getName() + ")"
+            + "(Language=*))" );
+
+        // Query for any service references matching any language.
+        ServiceReference[] refs = m_context.getServiceReferences( DictionaryService.class.getName(), "(Language=*)" );
+
+        // If we found any dictionary services, then just get
+        // a reference to the first one so we can use it.
+        if ( refs != null )
+        {
+            m_ref = refs[0];
+            m_dictionary = ( DictionaryService ) m_context.getService( m_ref );
+        }
+
+        try
+        {
+            System.out.println( "Enter a blank line to exit." );
+            String word = "";
+            BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
+
+            // Loop endlessly.
+            while ( true )
+            {
+                // Ask the user to enter a word.
+                System.out.print( "Enter word: " );
+                word = in.readLine();
+
+                // If the user entered a blank line, then
+                // exit the loop.
+                if ( word.length() == 0 )
+                {
+                    break;
+                }
+                // If there is no dictionary, then say so.
+                else if ( m_dictionary == null )
+                {
+                    System.out.println( "No dictionary available." );
+                }
+                // Otherwise print whether the word is correct or not.
+                else if ( m_dictionary.checkWord( word ) )
+                {
+                    System.out.println( "Correct." );
+                }
+                else
+                {
+                    System.out.println( "Incorrect." );
+                }
+            }
+        }
+        catch ( Exception ex )
+        {
+        }
+    }
+
+
+    /**
+     * Implements BundleActivator.stop(). Does nothing since the framework will
+     * automatically unget any used services.
+     * 
+     * @param context the framework context for the bundle.
+     */
+    public void stop( BundleContext context )
+    {
+        // NOTE: The service is automatically released.
+    }
+
+
+    /**
+     * Implements ServiceListener.serviceChanged(). Checks to see if the service
+     * we are using is leaving or tries to get a service if we need one.
+     * 
+     * @param event
+     *            the fired service event.
+     */
+    public void serviceChanged( ServiceEvent event )
+    {
+        // If a dictionary service was registered, see if we
+        // need one. If so, get a reference to it.
+        if ( event.getType() == ServiceEvent.REGISTERED )
+        {
+            if ( m_ref == null )
+            {
+                // Get a reference to the service object.
+                m_ref = event.getServiceReference();
+                m_dictionary = ( DictionaryService ) m_context.getService( m_ref );
+            }
+        }
+        // If a dictionary service was unregistered, see if it
+        // was the one we were using. If so, unget the service
+        // and try to query to get another one.
+        else if ( event.getType() == ServiceEvent.UNREGISTERING )
+        {
+            if ( event.getServiceReference() == m_ref )
+            {
+                // Unget service object and null references.
+                m_context.ungetService( m_ref );
+                m_ref = null;
+                m_dictionary = null;
+
+                // Query to see if we can get another service.
+                ServiceReference[] refs = null;
+                
+                try
+                {
+                    refs = m_context.getServiceReferences( DictionaryService.class.getName(), "(Language=*)" );
+                }
+                catch ( InvalidSyntaxException e )
+                {
+                    e.printStackTrace();
+                }
+
+                if ( refs != null )
+                {
+                    // Get a reference to the first service object.
+                    m_ref = refs[0];
+                    m_dictionary = ( DictionaryService ) m_context.getService( m_ref );
+                }
+            }
+        }
+    }
+}
diff --git a/pom.xml b/pom.xml
index 1889a4e..b7ce98e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
     <module>org.apache.felix.examples.dictionaryservice</module>
     <module>org.apache.felix.examples.frenchdictionary</module>
     <module>org.apache.felix.examples.dictionaryclient</module>
+    <module>org.apache.felix.examples.dictionaryclient2</module>
   </modules>
 
   <repositories>
