diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
index 7dd71d1..22a6698 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
@@ -23,6 +23,7 @@
 import java.net.URISyntaxException;
 import java.net.URI;
 
+import org.apache.felix.fileinstall.util.Util;
 import org.osgi.framework.*;
 import org.osgi.service.cm.*;
 import org.osgi.service.log.*;
@@ -443,15 +444,15 @@
         for (int i = 0; i < list.length; i++)
         {
             File file = new File(jardir, list[i]);
-            if (list[i].endsWith(".jar"))
+            if (list[i].endsWith(".cfg"))
+            {
+                configs.add(file.getAbsolutePath());
+            }
+            else if (Util.isValidJar(file.getAbsolutePath()))
             {
                 Jar jar = new Jar(file);
                 jars.put(jar.getPath(), jar);
             }
-            else if (list[i].endsWith(".cfg"))
-            {
-                configs.add(file.getAbsolutePath());
-            }
         }
     }
 
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
index 88c0f49..f5c51ed 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
@@ -18,11 +18,11 @@
  */
 package org.apache.felix.fileinstall.util;
 
-
+import java.io.IOException;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
-
+import java.util.jar.JarFile;
 
 public class Util
 {
@@ -49,17 +49,17 @@
      * @return The value of the specified string after system property substitution.
      * @throws IllegalArgumentException If there was a syntax error in the
      *         property placeholder syntax or a recursive variable reference.
-    **/
-    public static String substVars( String val, String currentKey, Map cycleMap, Dictionary configProps )
+     **/
+    public static String substVars(String val, String currentKey, Map cycleMap, Dictionary configProps)
         throws IllegalArgumentException
     {
-        if ( cycleMap == null )
+        if (cycleMap == null)
         {
             cycleMap = new HashMap();
         }
 
         // Put the current key in the cycle map.
-        cycleMap.put( currentKey, currentKey );
+        cycleMap.put(currentKey, currentKey);
 
         // Assume we have a value that is something like:
         // "leading ${foo.${bar}} middle ${baz} trailing"
@@ -67,20 +67,20 @@
         // Find the first ending '}' variable delimiter, which
         // will correspond to the first deepest nested variable
         // placeholder.
-        int stopDelim = val.indexOf( DELIM_STOP );
+        int stopDelim = val.indexOf(DELIM_STOP);
 
         // Find the matching starting "${" variable delimiter
         // by looping until we find a start delimiter that is
         // greater than the stop delimiter we have found.
-        int startDelim = val.indexOf( DELIM_START );
-        while ( stopDelim >= 0 )
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0)
         {
-            int idx = val.indexOf( DELIM_START, startDelim + DELIM_START.length() );
-            if ( ( idx < 0 ) || ( idx > stopDelim ) )
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim))
             {
                 break;
             }
-            else if ( idx < stopDelim )
+            else if (idx < stopDelim)
             {
                 startDelim = idx;
             }
@@ -88,55 +88,86 @@
 
         // If we do not have a start or stop delimiter, then just
         // return the existing value.
-        if ( ( startDelim < 0 ) && ( stopDelim < 0 ) )
+        if ((startDelim < 0) && (stopDelim < 0))
         {
             return val;
         }
         // At this point, we found a stop delimiter without a start,
         // so throw an exception.
-        else if ( ( ( startDelim < 0 ) || ( startDelim > stopDelim ) ) && ( stopDelim >= 0 ) )
+        else if (((startDelim < 0) || (startDelim > stopDelim)) && (stopDelim >= 0))
         {
-            throw new IllegalArgumentException( "stop delimiter with no start delimiter: " + val );
+            throw new IllegalArgumentException("stop delimiter with no start delimiter: " + val);
         }
 
         // At this point, we have found a variable placeholder so
         // we must perform a variable substitution on it.
         // Using the start and stop delimiter indices, extract
         // the first, deepest nested variable placeholder.
-        String variable = val.substring( startDelim + DELIM_START.length(), stopDelim );
+        String variable = val.substring(startDelim + DELIM_START.length(), stopDelim);
 
         // Verify that this is not a recursive variable reference.
-        if ( cycleMap.get( variable ) != null )
+        if (cycleMap.get(variable) != null)
         {
-            throw new IllegalArgumentException( "recursive variable reference: " + variable );
+            throw new IllegalArgumentException("recursive variable reference: " + variable);
         }
 
         // Get the value of the deepest nested variable placeholder.
         // Try to configuration properties first.
-        String substValue = ( String ) ( ( configProps != null ) ? configProps.get( variable ) : null );
-        if ( substValue == null )
+        String substValue = (String) ((configProps != null) ? configProps.get(variable) : null);
+        if (substValue == null)
         {
             // Ignore unknown property values.
-            substValue = System.getProperty( variable, "" );
+            substValue = System.getProperty(variable, "");
         }
 
         // Remove the found variable from the cycle map, since
         // it may appear more than once in the value and we don't
         // want such situations to appear as a recursive reference.
-        cycleMap.remove( variable );
+        cycleMap.remove(variable);
 
         // Append the leading characters, the substituted value of
         // the variable, and the trailing characters to get the new
         // value.
-        val = val.substring( 0, startDelim ) + substValue
-            + val.substring( stopDelim + DELIM_STOP.length(), val.length() );
+        val = val.substring(0, startDelim) + substValue + val.substring(stopDelim + DELIM_STOP.length(), val.length());
 
         // Now perform substitution again, since there could still
         // be substitutions to make.
-        val = substVars( val, currentKey, cycleMap, configProps );
+        val = substVars(val, currentKey, cycleMap, configProps);
 
         // Return the value.
         return val;
     }
 
+    /**
+     * Check if a file is a legitimate Jar file
+     * @param path
+     * @return
+     */
+    public static boolean isValidJar(String path)
+    {
+        JarFile jar = null;
+        try
+        {
+            jar = new JarFile(path);
+            return true;
+        }
+        catch (IOException ioe)
+        {
+            return false;
+        }
+        finally
+        {
+            if (jar != null)
+            {
+                try
+                {
+                    jar.close();
+                }
+                catch (IOException e)
+                {
+                    //do nothing
+                }
+            }
+        }
+    }
 }
diff --git a/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java b/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
index c74b79e..4e55071 100644
--- a/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
+++ b/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
@@ -26,25 +26,30 @@
 
 public class UtilTest extends TestCase
 {
-
     public void testBasicSubstitution()
     {
-        System.setProperty( "value1", "sub_value1" );
-        Dictionary  props = new Hashtable();
-        props.put( "key0", "value0" );
-        props.put( "key1", "${value1}" );
-        props.put( "key2", "${value2}" );
-        
-        for (Enumeration e = props.keys(); e.hasMoreElements(); )
+        System.setProperty("value1", "sub_value1");
+        Dictionary props = new Hashtable();
+        props.put("key0", "value0");
+        props.put("key1", "${value1}");
+        props.put("key2", "${value2}");
+
+        for (Enumeration e = props.keys(); e.hasMoreElements();)
         {
             String name = (String) e.nextElement();
             props.put(name,
-                Util.substVars(( String ) props.get(name), name, null, props));
-        }    
-        
-        assertEquals( "value0", props.get( "key0" ) );
-        assertEquals( "sub_value1", props.get( "key1" ) );
-        assertEquals( "", props.get( "key2" ) );
-        
+                Util.substVars((String) props.get(name), name, null, props));
+        }
+
+        assertEquals("value0", props.get("key0"));
+        assertEquals("sub_value1", props.get("key1"));
+        assertEquals("", props.get("key2"));
+
     }
-}
+
+    public void testCanRecognizeInvalidJar()
+    {
+        assertFalse(Util.isValidJar("src/test/resources/watched/firstjar.jar"));
+        assertFalse(Util.isValidJar("src/test/resources/watched/notexistentfile.jar"));
+    }
+}
\ No newline at end of file
