diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
index 979d70e..5c058b9 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
@@ -496,48 +496,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        long fileDate = System.currentTimeMillis();
-	                        long zipFileDate = fileDate;
-	                    	String metadataDate = targetSettings.getSWFMetadataDate();
-	                    	if (metadataDate != null)
-	                    	{
-	                    		String metadataFormat = targetSettings.getSWFMetadataDateFormat();
-	                    		try {
-	                    			SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
-	                    			Date d = sdf.parse(metadataDate);
-	                    			Calendar cal = new GregorianCalendar();
-	                    			cal.setTime(d);
-	                                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
-	                    			d = sdf.parse(metadataDate);
-	                    			fileDate = d.getTime();
-	                    			ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
-	                    									cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
-	                    			zipFileDate = zdt.toInstant().toEpochMilli();
-	                    		} catch (ParseException e) {
-	                				// TODO Auto-generated catch block
-	                				e.printStackTrace();
-	                			} catch (IllegalArgumentException e1) {
-	                				e1.printStackTrace();
-	                			}
-	                    	}
-	                    	ZipEntry ze = new ZipEntry(outputClassFile);
-	                    	ze.setTime(zipFileDate);
-	                    	ze.setMethod(ZipEntry.STORED);
-	                    	
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 	                        temp.writeTo(baos);
-	                        ze.setSize(baos.size());
-	                        ze.setCompressedSize(baos.size());
-	                        CRC32 crc = new CRC32();
-	                        crc.reset();
-	                        crc.update(baos.toByteArray());
-	                        ze.setCrc(crc.getValue());
-
-	                        zipOutputStream.putNextEntry(ze);
-	                        baos.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-	                        zipOutputStream.closeEntry();
-	                        fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + fileDate + "\"/>\n");
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             if(sourceMapTemp != null)
                             {
                                 String sourceMapFile = getOutputSourceMapFile(
@@ -549,24 +510,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                ze = new ZipEntry(sourceMapFile);
-    	                    	ze.setTime(zipFileDate);
-    	                    	ze.setMethod(ZipEntry.STORED);
-    	                    	
     	                        baos = new ByteArrayOutputStream();
                                 sourceMapTemp.writeTo(baos);
-    	                        ze.setSize(baos.size());
-    	                        ze.setCompressedSize(baos.size());
-    	                        crc = new CRC32();
-    	                        crc.reset();
-    	                        crc.update(baos.toByteArray());
-    	                        ze.setCrc(crc.getValue());
-                                
-                                zipOutputStream.putNextEntry(ze);
-    	                        baos.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + fileDate + "\"/>\n");
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
                             writer.close();
                         }
@@ -670,6 +616,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            String metadataFormat = targetSettings.getSWFMetadataDateFormat();
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+                Date d = sdf.parse(metadataDate);
+                Calendar cal = new GregorianCalendar();
+                cal.setTime(d);
+                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+                d = sdf.parse(metadataDate);
+                fileDate = d.getTime();
+                ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
+                                        cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+                zipFileDate = zdt.toInstant().toEpochMilli();
+            } catch (ParseException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      * 
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
index 7f85f76..e2b3d11 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
@@ -26,11 +26,20 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Enumeration;
+import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.Set;
+import java.util.TimeZone;
+import java.util.zip.CRC32;
 import java.util.zip.Deflater;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -352,11 +361,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        zipOutputStream.putNextEntry(new ZipEntry(outputClassFile));
-	                        temp.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-	                        zipOutputStream.closeEntry();
-	                        fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + System.currentTimeMillis() + "\"/>\n");
+	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	                        temp.writeTo(baos);
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             if(sourceMapTemp != null)
                             {
                                 String sourceMapFile = getOutputSourceMapFile(
@@ -368,11 +375,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                zipOutputStream.putNextEntry(new ZipEntry(sourceMapFile));
-                                sourceMapTemp.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + System.currentTimeMillis() + "\"/>\n");
+    	                        baos = new ByteArrayOutputStream();
+                                sourceMapTemp.writeTo(baos);
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
                             writer.close();
                         }
@@ -408,6 +413,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            String metadataFormat = targetSettings.getSWFMetadataDateFormat();
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+                Date d = sdf.parse(metadataDate);
+                Calendar cal = new GregorianCalendar();
+                cal.setTime(d);
+                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+                d = sdf.parse(metadataDate);
+                fileDate = d.getTime();
+                ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
+                                        cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+                zipFileDate = zdt.toInstant().toEpochMilli();
+            } catch (ParseException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      * 
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
index ed38c4b..4ed9d8c 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
@@ -382,48 +382,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        long fileDate = System.currentTimeMillis();
-	                        long zipFileDate = fileDate;
-	                    	String metadataDate = targetSettings.getSWFMetadataDate();
-	                    	if (metadataDate != null)
-	                    	{
-	                    		String metadataFormat = targetSettings.getSWFMetadataDateFormat();
-	                    		try {
-	                    			SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
-	                    			Date d = sdf.parse(metadataDate);
-	                    			Calendar cal = new GregorianCalendar();
-	                    			cal.setTime(d);
-	                                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
-	                    			d = sdf.parse(metadataDate);
-	                    			fileDate = d.getTime();
-	                    			ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
-	                    									cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
-	                    			zipFileDate = zdt.toInstant().toEpochMilli();
-	                    		} catch (ParseException e) {
-	                				// TODO Auto-generated catch block
-	                				e.printStackTrace();
-	                			} catch (IllegalArgumentException e1) {
-	                				e1.printStackTrace();
-	                			}
-	                    	}
-	                    	ZipEntry ze = new ZipEntry(outputClassFile);
-	                    	ze.setTime(zipFileDate);
-	                    	ze.setMethod(ZipEntry.STORED);
-	                    	
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-	                        temp.writeTo(baos);
-	                        ze.setSize(baos.size());
-	                        ze.setCompressedSize(baos.size());
-	                        CRC32 crc = new CRC32();
-	                        crc.reset();
-	                        crc.update(baos.toByteArray());
-	                        ze.setCrc(crc.getValue());
-
-	                        zipOutputStream.putNextEntry(ze);
-	                        baos.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-                            zipOutputStream.closeEntry();
-                            fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + fileDate + "\"/>\n");
+                            temp.writeTo(baos);
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             
                             if(sourceMapTemp != null)
                             {
@@ -436,24 +397,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                ze = new ZipEntry(sourceMapFile);
-                                ze.setTime(zipFileDate);
-                                ze.setMethod(ZipEntry.STORED);
-                                
                                 baos = new ByteArrayOutputStream();
                                 sourceMapTemp.writeTo(baos);
-                                ze.setSize(baos.size());
-                                ze.setCompressedSize(baos.size());
-                                crc = new CRC32();
-                                crc.reset();
-                                crc.update(baos.toByteArray());
-                                ze.setCrc(crc.getValue());
-                                
-                                zipOutputStream.putNextEntry(ze);
-                                baos.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + fileDate + "\"/>\n");
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
 	                        writer.close();
                     	}
@@ -534,6 +480,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            String metadataFormat = targetSettings.getSWFMetadataDateFormat();
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+                Date d = sdf.parse(metadataDate);
+                Calendar cal = new GregorianCalendar();
+                cal.setTime(d);
+                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+                d = sdf.parse(metadataDate);
+                fileDate = d.getTime();
+                ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
+                                        cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+                zipFileDate = zdt.toInstant().toEpochMilli();
+            } catch (ParseException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      * 
