diff --git a/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java b/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java
index 736dbe6485a4882e7bb910673a3a3f809dedb98d..5fb291aa1556f10dec99173755a06347a2aeae04 100644
--- a/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java
+++ b/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java
@@ -53,6 +53,23 @@ public final class BitmapEncoder {
   public enum BitmapFormat {
     PNG, JPG, BMP, GIF;
   }
+  
+  /**
+   * Only adds the extension of the BitmapFormat to the filename if the filename doesn't already have it.
+   * 
+   * @param fileName
+   * @param bitmapFormat
+   * @return filename (if extension already exists), otherwise;: filename + "." + extension
+   */
+  public static String addFileExtension(String fileName, BitmapFormat bitmapFormat) {
+	  String fileNameWithFileExtension = fileName;
+	  final String newFileExtension = "." + bitmapFormat.toString().toLowerCase();
+	  if (fileName.length() <= newFileExtension.length() ||
+			  !fileName.substring(fileName.length()-newFileExtension.length(), fileName.length()).equalsIgnoreCase(newFileExtension)) {
+		  fileNameWithFileExtension = fileName + newFileExtension;
+	  }
+	  return fileNameWithFileExtension;
+  }
 
   /**
    * Save a Chart as an image file
@@ -66,7 +83,7 @@ public final class BitmapEncoder {
 
     BufferedImage bufferedImage = getBufferedImage(chart);
 
-    OutputStream out = new FileOutputStream(fileName + "." + bitmapFormat.toString().toLowerCase());
+    OutputStream out = new FileOutputStream(addFileExtension(fileName, bitmapFormat));
     ImageIO.write(bufferedImage, bitmapFormat.toString().toLowerCase(), out);
     out.close();
   }
@@ -108,7 +125,7 @@ public final class BitmapEncoder {
 
       setDPI(metadata, DPI);
 
-      File file = new File(fileName + "." + bitmapFormat.toString().toLowerCase());
+      File file = new File(addFileExtension(fileName, bitmapFormat));
       FileImageOutputStream output = new FileImageOutputStream(file);
       writer.setOutput(output);
       IIOImage image = new IIOImage(bufferedImage, null, metadata);
@@ -150,6 +167,7 @@ public final class BitmapEncoder {
    *
    * @param chart
    * @param fileName
+   * @param bitmapFormat
    * @param quality - a float between 0 and 1 (1 = maximum quality)
    * @throws FileNotFoundException
    * @throws IOException
diff --git a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java
index 32601ab995b6bcd9a0e79002baa7d4c6416ebd6a..1948c7de9cc043a39dd6bc797d52e811aac1676b 100644
--- a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java
+++ b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java
@@ -130,7 +130,7 @@ public class XChartPanel extends JPanel {
           if (fileChooser.getFileFilter() == null) {
             BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.PNG);
           } else if (fileChooser.getFileFilter().getDescription().equals("*.jpg,*.JPG")) {
-            BitmapEncoder.saveJPGWithQuality(chart, theFileToSave.getCanonicalPath().toString() + ".jpg", 1.0f);
+            BitmapEncoder.saveJPGWithQuality(chart, BitmapEncoder.addFileExtension(theFileToSave.getCanonicalPath().toString(), BitmapFormat.JPG), 1.0f);
           } else if (fileChooser.getFileFilter().getDescription().equals("*.png,*.PNG")) {
             BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.PNG);
           } else if (fileChooser.getFileFilter().getDescription().equals("*.bmp,*.BMP")) {