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 c61356a..e367473 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
@@ -26,6 +26,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.ZoneId;
@@ -37,6 +38,10 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.royale.compiler.clients.problems.ProblemPrinter;
@@ -60,6 +65,7 @@
 import org.apache.royale.compiler.targets.ITarget.TargetType;
 import org.apache.royale.compiler.targets.ITargetSettings;
 import org.apache.royale.compiler.units.ICompilationUnit;
+import org.apache.royale.compiler.utils.SourceMapUtils;
 import org.apache.royale.swc.ISWCFileEntry;
 import org.apache.royale.swc.io.SWCReader;
 import org.apache.royale.utils.ArgumentUtil;
@@ -489,32 +495,33 @@
 	                        }
                             writer.writeTo(temp, sourceMapTemp, null);
 
-                    		String outputClassFile = getOutputClassFile(
+                    		File outputClassFile = getOutputClassFile(
                                     cu.getQualifiedNames().get(0),
                                     isExterns ? externsOut : jsOut,
-                                    false).getPath();
-                    		outputClassFile = outputClassFile.replace('\\', '/');
+                                    false);
+                            String outputClassFilePath = outputClassFile.getPath();
+                    		outputClassFilePath = outputClassFilePath.replace('\\', '/');
 	                        if (config.isVerbose())
                             {
-                                System.out.println("Writing file: " + outputClassFile);     	
+                                System.out.println("Writing file: " + outputClassFilePath);     	
                             }
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 	                        temp.writeTo(baos);
-                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+                            writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
                             if(sourceMapTemp != null)
                             {
-                                String sourceMapFile = getOutputSourceMapFile(
+                                String sourceMapFilePath = getOutputSourceMapFile(
                                     cu.getQualifiedNames().get(0),
                                     isExterns ? externsOut : jsOut,
                                     false).getPath();
-                                sourceMapFile = sourceMapFile.replace('\\', '/');
+                                sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
                                 if (config.isVerbose())
                                 {
-                                    System.out.println("Writing file: " + sourceMapFile);
+                                    System.out.println("Writing file: " + sourceMapFilePath);
                                 }
     	                        baos = new ByteArrayOutputStream();
-                                sourceMapTemp.writeTo(baos);
-                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+                                processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+                                writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
                             }
                             writer.close();
                         }
@@ -676,6 +683,45 @@
         return compilationSuccess;
     }
 
+    private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+    {
+        String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+        if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+        {
+            String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+            SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+            try
+            {
+                sourceMapConsumer.parse(sourceMapContents);
+            }
+            catch(SourceMapParseException e)
+            {
+                sourceMapConsumer = null;
+            }
+            if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+            {
+                SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+                String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+                try
+                {
+                    IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+                }
+                catch(IOException e)
+                {
+                }
+                return;
+            }
+        }
+        try
+        {
+            sourceMapTemp.writeTo(baos);
+        }
+        catch(IOException e)
+        {
+
+        }
+    }
+
     private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
     {
         long fileDate = System.currentTimeMillis();
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 125e93d..7f0f662 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,6 +26,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.ZoneId;
@@ -45,6 +46,10 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.royale.compiler.clients.problems.ProblemQuery;
@@ -69,6 +74,7 @@
 import org.apache.royale.compiler.targets.ITarget.TargetType;
 import org.apache.royale.compiler.targets.ITargetSettings;
 import org.apache.royale.compiler.units.ICompilationUnit;
+import org.apache.royale.compiler.utils.SourceMapUtils;
 import org.apache.royale.swc.ISWCFileEntry;
 import org.apache.royale.swc.io.SWCReader;
 
@@ -354,32 +360,33 @@
 	                        }
                             writer.writeTo(temp, sourceMapTemp, null);
 
-                    		String outputClassFile = getOutputClassFile(
+                    		File outputClassFile = getOutputClassFile(
                                     cu.getQualifiedNames().get(0),
                                     isExterns ? externsOut : jsOut,
-                                    false).getPath();
-                            outputClassFile = outputClassFile.replace('\\', '/');
+                                    false);
+                            String outputClassFilePath = outputClassFile.getPath();
+                            outputClassFilePath = outputClassFilePath.replace('\\', '/');
                             if (config.isVerbose())
                             {
-                                System.out.println("Writing file: " + outputClassFile);     	
+                                System.out.println("Writing file: " + outputClassFilePath);     	
                             }
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 	                        temp.writeTo(baos);
-                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+                            writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
                             if(sourceMapTemp != null)
                             {
-                                String sourceMapFile = getOutputSourceMapFile(
+                                String sourceMapFilePath = getOutputSourceMapFile(
                                     cu.getQualifiedNames().get(0),
                                     isExterns ? externsOut : jsOut,
                                     false).getPath();
-                                sourceMapFile = sourceMapFile.replace('\\', '/');
+                                sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
                                 if (config.isVerbose())
                                 {
-                                    System.out.println("Writing file: " + sourceMapFile);
+                                    System.out.println("Writing file: " + sourceMapFilePath);
                                 }
     	                        baos = new ByteArrayOutputStream();
-                                sourceMapTemp.writeTo(baos);
-                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+                                processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+                                writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
                             }
                             writer.close();
                         }
@@ -473,6 +480,45 @@
         return compilationSuccess;
     }
 
+    private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+    {
+        String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+        if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+        {
+            String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+            SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+            try
+            {
+                sourceMapConsumer.parse(sourceMapContents);
+            }
+            catch(SourceMapParseException e)
+            {
+                sourceMapConsumer = null;
+            }
+            if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+            {
+                SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+                String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+                try
+                {
+                    IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+                }
+                catch(IOException e)
+                {
+                }
+                return;
+            }
+        }
+        try
+        {
+            sourceMapTemp.writeTo(baos);
+        }
+        catch(IOException e)
+        {
+
+        }
+    }
+
     private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
     {
         long fileDate = System.currentTimeMillis();
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 366de7e..a16bfd5 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
@@ -26,6 +26,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.ZoneId;
@@ -37,6 +38,10 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.royale.compiler.clients.problems.ProblemQuery;
@@ -62,6 +67,7 @@
 import org.apache.royale.compiler.targets.ITargetSettings;
 import org.apache.royale.compiler.units.ICompilationUnit;
 import org.apache.royale.compiler.units.ICompilationUnit.UnitType;
+import org.apache.royale.compiler.utils.SourceMapUtils;
 import org.apache.royale.swc.ISWCFileEntry;
 import org.apache.royale.swc.io.SWCReader;
 
@@ -375,33 +381,34 @@
 	                        }
                             writer.writeTo(temp, sourceMapTemp, null);
 
-                    		String outputClassFile = getOutputClassFile(
+                    		File outputClassFile = getOutputClassFile(
                                     cu.getQualifiedNames().get(0),
                                     isExterns ? externsOut : jsOut,
-                                    false).getPath();
-                    		outputClassFile = outputClassFile.replace('\\', '/');
+                                    false);
+                            String outputClassFilePath = outputClassFile.getPath();
+                    		outputClassFilePath = outputClassFilePath.replace('\\', '/');
 	                        if (config.isVerbose())
                             {
-                                System.out.println("Writing file: " + outputClassFile);     	
+                                System.out.println("Writing file: " + outputClassFilePath);     	
                             }
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                             temp.writeTo(baos);
-                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+                            writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
                             
                             if(sourceMapTemp != null)
                             {
-                                String sourceMapFile = getOutputSourceMapFile(
-                                                                                cu.getQualifiedNames().get(0),
-                                                                                isExterns ? externsOut : jsOut,
-                                                                                false).getPath();
-                                sourceMapFile = sourceMapFile.replace('\\', '/');
+                                String sourceMapFilePath = getOutputSourceMapFile(
+                                    cu.getQualifiedNames().get(0),
+                                    isExterns ? externsOut : jsOut,
+                                    false).getPath();
+                                sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
                                 if (config.isVerbose())
                                 {
-                                    System.out.println("Writing file: " + sourceMapFile);
+                                    System.out.println("Writing file: " + sourceMapFilePath);
                                 }
                                 baos = new ByteArrayOutputStream();
-                                sourceMapTemp.writeTo(baos);
-                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+                                processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+                                writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
                             }
 	                        writer.close();
                     	}
@@ -540,6 +547,45 @@
         return compilationSuccess;
     }
 
+    private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+    {
+        String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+        if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+        {
+            String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+            SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+            try
+            {
+                sourceMapConsumer.parse(sourceMapContents);
+            }
+            catch(SourceMapParseException e)
+            {
+                sourceMapConsumer = null;
+            }
+            if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+            {
+                SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+                String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+                try
+                {
+                    IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+                }
+                catch(IOException e)
+                {
+                }
+                return;
+            }
+        }
+        try
+        {
+            sourceMapTemp.writeTo(baos);
+        }
+        catch(IOException e)
+        {
+
+        }
+    }
+
     private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
     {
         long fileDate = System.currentTimeMillis();
