diff --git a/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java b/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
index 1d7acc0..a0fc0d8 100644
--- a/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
+++ b/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
@@ -355,18 +355,20 @@
                     	getLogger().warn("JSch not on classpath!", ncdfe);
                     }
 
-                    fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
-                    if (fileObject.exists()) {
-                        reader = new InputStreamReader(fileObject.getContent().getInputStream() , "UTF-8");
-                        //now that we have a reader, remove additional portions of the file url (sftp passwords, etc.)
-                        //check to see if the name is a URLFileName..if so, set file name to not include username/pass
-                        if (fileObject.getName() instanceof URLFileName) {
-                            URLFileName urlFileName = (URLFileName) fileObject.getName();
-                            setHost(urlFileName.getHostName());
-                            setPath(urlFileName.getPath());
+					synchronized(fileSystemManager) {
+                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
+                        if (fileObject.exists()) {
+                            reader = new InputStreamReader(fileObject.getContent().getInputStream() , "UTF-8");
+                            //now that we have a reader, remove additional portions of the file url (sftp passwords, etc.)
+                            //check to see if the name is a URLFileName..if so, set file name to not include username/pass
+                            if (fileObject.getName() instanceof URLFileName) {
+                                URLFileName urlFileName = (URLFileName) fileObject.getName();
+                                setHost(urlFileName.getHostName());
+                                setPath(urlFileName.getPath());
+                            }
+                        } else {
+                            getLogger().info(loggableFileURL + " not available - will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis");
                         }
-                    } else {
-                        getLogger().info(loggableFileURL + " not available - will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis");
                     }
                 } catch (FileSystemException fse) {
                     getLogger().info(loggableFileURL + " not available - may be due to incorrect credentials, but will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis", fse);
@@ -404,12 +406,15 @@
                         }
 
                         //fileobject was created above, release it and construct a new one
-                        if (fileObject != null) {
-                            fileObject.getFileSystem().getFileSystemManager().closeFileSystem(fileObject.getFileSystem());
-                            fileObject.close();
-                            fileObject = null;
+						synchronized(fileSystemManager) {
+	                        if (fileObject != null) {
+	                              fileObject.getFileSystem().getFileSystemManager().closeFileSystem(fileObject.getFileSystem());
+	                              fileObject.close();
+	                              fileObject = null;
+                            }
+                        
+                        	fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
                         }
-                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
 
                         //file may not exist..
                         boolean fileLarger = false;
diff --git a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
index 3a39508..1c2e30c 100644
--- a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
+++ b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
@@ -173,7 +173,7 @@
   private final String[] emptyException = new String[] { "" };
 
   private SimpleDateFormat dateFormat;
-  private String timestampFormat = "yyyy-MM-d HH:mm:ss,SSS";
+  private String timestampFormat;
   private String logFormat;
   private String customLevelDefinitions;
   private String fileURL;
@@ -357,7 +357,7 @@
     /**
    * Accessor
    *
-   * @return timestamp format
+   * @return group
    */
   public String getGroup() { return group; }
     
@@ -481,7 +481,7 @@
     if (currentMap.size() == 0) {
       if (additionalLines.size() > 0) {
         for (Iterator iter = additionalLines.iterator();iter.hasNext();) {
-          getLogger().info("found non-matching line: " + iter.next());
+          getLogger().debug("found non-matching line: " + iter.next());
         }
       }
       additionalLines.clear();
@@ -625,11 +625,14 @@
    */
   private String convertTimestamp() {
     //some locales (for example, French) generate timestamp text with characters not included in \w -
-    // now using \S (all non-whitespace characters) instead of /w 
-    String result = timestampFormat.replaceAll(Pattern.quote("+"), "[+]");
-    result = result.replaceAll(VALID_DATEFORMAT_CHAR_PATTERN, "\\\\S+");
-    //make sure dots in timestamp are escaped
-    result = result.replaceAll(Pattern.quote("."), "\\\\.");
+    // now using \S (all non-whitespace characters) instead of /w
+    String result = "";
+    if (timestampFormat != null) {
+      result = timestampFormat.replaceAll(Pattern.quote("+"), "[+]");
+      result = result.replaceAll(VALID_DATEFORMAT_CHAR_PATTERN, "\\\\S+");
+      //make sure dots in timestamp are escaped
+      result = result.replaceAll(Pattern.quote("."), "\\\\.");
+    }
     return result;
   }
 
@@ -929,7 +932,7 @@
         e.printStackTrace();
       }
     }
-    //use current time if timestamp not parseable
+    //use current time if timestamp not parseable/dateformat not specified
     if (timeStamp == 0L) {
       timeStamp = System.currentTimeMillis();
     }
