private List<T> implementers = null;
 
   // 'ServiceLoader' that is used to discover and create the services
-  private ServiceLoader<T> serviceLoader = null; //ServiceLoader.load(T.class);
+  private ServiceLoader<T> serviceLoader = null;
+
+  // use this to ensure that we only use one unique instance of each class
+  @SuppressWarnings("rawtypes")
+  private static HashMap<Class,OrderedService> classToSingleton =
+       new HashMap<>();
 
   /**
    * Constructor - create the 'ServiceLoader' instance
                                                           rval = o1.getClass().getName().compareTo
                                                                 (o2.getClass().getName());
                                                         }
-                                                  return(rval);
+                                                  return rval;
                                                 }
                                         });
 
        return implementers;
   }
 
-  // use this to ensure that we only use one unique instance of each class
-  @SuppressWarnings("rawtypes")
-  static private HashMap<Class,OrderedService> classToSingleton =
-       new HashMap<>();
-
   /**
    * If a service implements multiple APIs managed by 'ServiceLoader', a
    * separate instance is created for each API. This method ensures that
    *   the object of this class that was initially created is returned
    *   instead.
    */
-  static private synchronized OrderedService
+  private static synchronized OrderedService
        getSingleton(OrderedService service)
   {
        // see if we already have an instance of this class
 
 import java.util.Timer;
 import java.util.TimerTask;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * This class provides utilities to read properties from a properties
  * file, and optionally get notifications of future changes
  */
 public class PropertyUtil
 {
+
+  // timer thread used for polling for property file changes
+  private static Timer timer = null;
+
+  // this table maps canonical file into a 'ListenerRegistration' instance
+  private static HashMap<File, ListenerRegistration> registrations =
+       new HashMap<>();
+  
+  private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class.getName());
+  
   /**
    * Read in a properties file
    * @param file the properties file
    *   does not exist or can't be opened, and 'IOException' if there is
    *   a problem loading the properties file.
    */
-  static public Properties getProperties(File file) throws IOException
+  public static Properties getProperties(File file) throws IOException
   {
        // create an InputStream (may throw a FileNotFoundException)
        FileInputStream fis = new FileInputStream(file);
    *   does not exist or can't be opened, and 'IOException' if there is
    *   a problem loading the properties file.
    */
-  static public Properties getProperties(String fileName) throws IOException
+  public static Properties getProperties(String fileName) throws IOException
   {
        return getProperties(new File(fileName));
   }
 
   /* ============================================================ */
 
-  // timer thread used for polling for property file changes
-  private static Timer timer = null;
-
   /**
    * This is the callback interface, used for sending notifications of
    * changes in the properties file.
        void propertiesChanged(Properties properties, Set<String> changedKeys);
   }
 
-  // this table maps canonical file into a 'ListenerRegistration' instance
-  static private HashMap<File, ListenerRegistration> registrations =
-       new HashMap<>();
-
   /**
    * This is an internal class - one instance of this exists for each
    * property file that is being monitored. Note that multiple listeners
                          }
                        catch (Exception e)
                          {
-                               System.err.println(e);
+                               logger.warn("Polling for property changes", e);
                          }
                  }
                };
    *   does not exist or can't be opened, and 'IOException' if there is
    *   a problem loading the properties file.
    */
-  static public Properties getProperties(File file, Listener listener)
+  public static Properties getProperties(File file, Listener listener)
        throws IOException
   {
+    File propFile = file;
        if (listener == null)
          {
                // no listener specified -- just fetch the properties
-               return getProperties(file);
+               return getProperties(propFile);
          }
 
        // Convert the file to a canonical form in order to avoid the situation
        // where different names refer to the same file.
-       file = file.getCanonicalFile();
+       propFile = propFile.getCanonicalFile();
 
        // See if there is an existing registration. The 'synchronized' block
        // is needed to handle the case where a new listener is added at about
        // the same time that another one is being removed.
        synchronized(registrations)
          {
-               ListenerRegistration reg = registrations.get(file);
+               ListenerRegistration reg = registrations.get(propFile);
                if (reg == null)
                  {
                        // a new registration is needed
-                       reg = new ListenerRegistration(file);
+                       reg = new ListenerRegistration(propFile);
                  }
                return reg.addListener(listener);
          }
    *   does not exist or can't be opened, and 'IOException' if there is
    *   a problem loading the properties file.
    */
-  static public Properties getProperties(String fileName, Listener listener)
+  public static Properties getProperties(String fileName, Listener listener)
        throws IOException
   {
        return getProperties(new File(fileName), listener);
    * @param notify if not null, this is a callback interface that was used for
    *   notifications of changes
    */
-  static public void stopListening(File file, Listener listener)
+  public static void stopListening(File file, Listener listener)
   {
        if (listener != null)
          {
    * @param notify if not null, this is a callback interface that was used for
    *   notifications of changes
    */
-  static public void stopListening(String fileName, Listener listener)
+  public static void stopListening(String fileName, Listener listener)
   {
        stopListening(new File(fileName), listener);
   }