diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts
index da31878403a1c..bdf42d6011abb 100644
--- a/src/compiler/commandLineParser.ts
+++ b/src/compiler/commandLineParser.ts
@@ -66,6 +66,13 @@ module ts {
             paramType: Diagnostics.KIND,
             error: Diagnostics.Argument_for_module_option_must_be_commonjs_amd_system_or_umd
         },
+        {
+            name: "newLine",
+            type: { "crlf": NewLineKind.CarriageReturnLineFeed, "lf": NewLineKind.LineFeed },
+            description: Diagnostics.Emit_newline_Colon_CRLF_dos_or_LF_unix,
+            paramType: Diagnostics.NEWLINE,
+            error: Diagnostics.Argument_for_newLine_option_must_be_CRLF_or_LF
+        },
         {
             name: "noEmit",
             type: "boolean",
diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts
index 98b5a170ae660..ea4c21e54b073 100644
--- a/src/compiler/diagnosticInformationMap.generated.ts
+++ b/src/compiler/diagnosticInformationMap.generated.ts
@@ -502,6 +502,9 @@ module ts {
         Preserve_new_lines_when_emitting_code: { code: 6057, category: DiagnosticCategory.Message, key: "Preserve new-lines when emitting code." },
         Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: { code: 6058, category: DiagnosticCategory.Message, key: "Specifies the root directory of input files. Use to control the output directory structure with --outDir." },
         File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: { code: 6059, category: DiagnosticCategory.Error, key: "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files." },
+        Emit_newline_Colon_CRLF_dos_or_LF_unix: { code: 6060, category: DiagnosticCategory.Message, key: "Emit newline: 'CRLF' (dos) or 'LF' (unix)." },
+        NEWLINE: { code: 6061, category: DiagnosticCategory.Message, key: "NEWLINE" },
+        Argument_for_newLine_option_must_be_CRLF_or_LF: { code: 6062, category: DiagnosticCategory.Error, key: "Argument for 'newLine' option must be 'CRLF' or 'LF'." },
         Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
         Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
         Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 60d8e8e651507..e74603f2bacfc 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -1998,6 +1998,18 @@
         "category": "Error",
         "code": 6059
     },
+    "Emit newline: 'CRLF' (dos) or 'LF' (unix).": {
+        "category": "Message",
+        "code": 6060
+    },
+    "NEWLINE": { 
+        "category": "Message", 
+        "code": 6061
+    },
+    "Argument for 'newLine' option must be 'CRLF' or 'LF'.": {
+        "category": "Error", 
+        "code": 6062
+    },
 
 
     "Variable '{0}' implicitly has an '{1}' type.": {
diff --git a/src/compiler/program.ts b/src/compiler/program.ts
index cc2fe7ff190f2..96e1773172b99 100644
--- a/src/compiler/program.ts
+++ b/src/compiler/program.ts
@@ -9,6 +9,9 @@ module ts {
 
     /** The version of the TypeScript compiler release */
     export const version = "1.5.0";
+	
+	const NEWLINE_CRLF = "\r\n";
+	const NEWLINE_LF = "\n";
 
     export function findConfigFile(searchPath: string): string {
         var fileName = "tsconfig.json";
@@ -91,6 +94,11 @@ module ts {
             }
         }
 
+        let newLine =
+            options.newLine === NewLineKind.CarriageReturnLineFeed ? NEWLINE_CRLF :
+            options.newLine === NewLineKind.LineFeed ? NEWLINE_LF :
+            sys.newLine;
+
         return {
             getSourceFile,
             getDefaultLibFileName: options => combinePaths(getDirectoryPath(normalizePath(sys.getExecutingFilePath())), getDefaultLibFileName(options)),
@@ -98,7 +106,7 @@ module ts {
             getCurrentDirectory: () => currentDirectory || (currentDirectory = sys.getCurrentDirectory()),
             useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
             getCanonicalFileName,
-            getNewLine: () => sys.newLine
+            getNewLine: () => newLine
         };
     }
 
diff --git a/src/compiler/types.ts b/src/compiler/types.ts
index 9e7e6ac732804..86e680ca8b047 100644
--- a/src/compiler/types.ts
+++ b/src/compiler/types.ts
@@ -1656,6 +1656,7 @@ module ts {
         locale?: string;
         mapRoot?: string;
         module?: ModuleKind;
+        newLine?: NewLineKind;
         noEmit?: boolean;
         noEmitHelpers?: boolean;
         noEmitOnError?: boolean;
@@ -1689,6 +1690,11 @@ module ts {
         System = 4,
     }
 
+    export const enum NewLineKind {
+        CarriageReturnLineFeed = 0,
+        LineFeed = 1,
+    }
+	
     export interface LineAndCharacter {
         line: number;
         /*
diff --git a/src/harness/harness.ts b/src/harness/harness.ts
index 30ae22a9e4aad..60a508e8625d7 100644
--- a/src/harness/harness.ts
+++ b/src/harness/harness.ts
@@ -805,6 +805,9 @@ module Harness {
             return result;
         }
 
+        const NEWLINE_CRLF = "\r\n";
+        const NEWLINE_LF = "\n";
+
         export var defaultLibFileName = 'lib.d.ts';
         export var defaultLibSourceFile = createSourceFileAndAssertInvariants(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest);
         export var defaultES6LibSourceFile = createSourceFileAndAssertInvariants(defaultLibFileName, IO.readFile(libFolder + 'lib.core.es6.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest);
@@ -822,7 +825,8 @@ module Harness {
             scriptTarget: ts.ScriptTarget,
             useCaseSensitiveFileNames: boolean,
             // the currentDirectory is needed for rwcRunner to passed in specified current directory to compiler host
-            currentDirectory?: string): ts.CompilerHost {
+            currentDirectory?: string,
+            newLineKind?: ts.NewLineKind): ts.CompilerHost {
 
             // Local get canonical file name function, that depends on passed in parameter for useCaseSensitiveFileNames
             function getCanonicalFileName(fileName: string): string {
@@ -841,6 +845,11 @@ module Harness {
             };
             inputFiles.forEach(register);
 
+            let newLine =
+                newLineKind === ts.NewLineKind.CarriageReturnLineFeed ? NEWLINE_CRLF :
+                newLineKind === ts.NewLineKind.LineFeed ? NEWLINE_LF :
+                ts.sys.newLine;
+
             return {
                 getCurrentDirectory,
                 getSourceFile: (fn, languageVersion) => {
@@ -869,7 +878,7 @@ module Harness {
                 writeFile,
                 getCanonicalFileName,
                 useCaseSensitiveFileNames: () => useCaseSensitiveFileNames,
-                getNewLine: () => ts.sys.newLine
+                getNewLine: () => newLine
             };
         }
 
@@ -1041,7 +1050,18 @@ module Harness {
                             break;
 
                         case 'newline':
-                        case 'newlines':
+                            if (setting.value.toLowerCase() === 'crlf') {
+                                options.newLine = ts.NewLineKind.CarriageReturnLineFeed;
+                            }
+                            else if (setting.value.toLowerCase() === 'lf') {
+                                options.newLine = ts.NewLineKind.LineFeed;
+                            }
+                            else {
+                                throw new Error('Unknown option for newLine: ' + setting.value);
+                            }
+                            break;
+
+                        case 'normalizenewline':
                             newLine = setting.value;
                             break;
 
@@ -1103,7 +1123,7 @@ module Harness {
                 var programFiles = inputFiles.concat(includeBuiltFiles).map(file => file.unitName);
                 var program = ts.createProgram(programFiles, options, createCompilerHost(inputFiles.concat(includeBuiltFiles).concat(otherFiles),
                     (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }),
-                    options.target, useCaseSensitiveFileNames, currentDirectory));
+                    options.target, useCaseSensitiveFileNames, currentDirectory, options.newLine));
 
                 var emitResult = program.emit();
 
@@ -1486,7 +1506,7 @@ module Harness {
         // List of allowed metadata names
         var fileMetadataNames = ["filename", "comments", "declaration", "module",
             "nolib", "sourcemap", "target", "out", "outdir", "noemithelpers", "noemitonerror",
-            "noimplicitany", "noresolve", "newline", "newlines", "emitbom",
+            "noimplicitany", "noresolve", "newline", "normalizenewline", "emitbom",
             "errortruncation", "usecasesensitivefilenames", "preserveconstenums",
             "includebuiltfile", "suppressimplicitanyindexerrors", "stripinternal",
             "separatecompilation", "inlinesourcemap", "maproot", "sourceroot",
@@ -1744,4 +1764,4 @@ module Harness {
 }
 
 // TODO: not sure why Utils.evalFile isn't working with this, eventually will concat it like old compiler instead of eval
-eval(Harness.tcServicesFile);
\ No newline at end of file
+eval(Harness.tcServicesFile);
diff --git a/tests/baselines/reference/newLineFlagWithCRLF.js b/tests/baselines/reference/newLineFlagWithCRLF.js
new file mode 100644
index 0000000000000..ebf095e5fc732
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithCRLF.js
@@ -0,0 +1,9 @@
+//// [newLineFlagWithCRLF.ts]
+var x=1;
+x=2;
+
+
+
+//// [newLineFlagWithCRLF.js]
+var x = 1;
+x = 2;
diff --git a/tests/baselines/reference/newLineFlagWithCRLF.symbols b/tests/baselines/reference/newLineFlagWithCRLF.symbols
new file mode 100644
index 0000000000000..07825959fbe3e
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithCRLF.symbols
@@ -0,0 +1,8 @@
+=== tests/cases/compiler/newLineFlagWithCRLF.ts ===
+var x=1;
+>x : Symbol(x, Decl(newLineFlagWithCRLF.ts, 0, 3))
+
+x=2;
+>x : Symbol(x, Decl(newLineFlagWithCRLF.ts, 0, 3))
+
+
diff --git a/tests/baselines/reference/newLineFlagWithCRLF.types b/tests/baselines/reference/newLineFlagWithCRLF.types
new file mode 100644
index 0000000000000..2663f4bbc7b67
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithCRLF.types
@@ -0,0 +1,11 @@
+=== tests/cases/compiler/newLineFlagWithCRLF.ts ===
+var x=1;
+>x : number
+>1 : number
+
+x=2;
+>x=2 : number
+>x : number
+>2 : number
+
+
diff --git a/tests/baselines/reference/newLineFlagWithLF.js b/tests/baselines/reference/newLineFlagWithLF.js
new file mode 100644
index 0000000000000..be1b9ed644ec8
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithLF.js
@@ -0,0 +1,9 @@
+//// [newLineFlagWithLF.ts]
+var x=1;
+x=2;
+
+
+
+//// [newLineFlagWithLF.js]
+var x = 1;
+x = 2;
diff --git a/tests/baselines/reference/newLineFlagWithLF.symbols b/tests/baselines/reference/newLineFlagWithLF.symbols
new file mode 100644
index 0000000000000..f4edf68dcb081
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithLF.symbols
@@ -0,0 +1,8 @@
+=== tests/cases/compiler/newLineFlagWithLF.ts ===
+var x=1;
+>x : Symbol(x, Decl(newLineFlagWithLF.ts, 0, 3))
+
+x=2;
+>x : Symbol(x, Decl(newLineFlagWithLF.ts, 0, 3))
+
+
diff --git a/tests/baselines/reference/newLineFlagWithLF.types b/tests/baselines/reference/newLineFlagWithLF.types
new file mode 100644
index 0000000000000..735f31d6c524d
--- /dev/null
+++ b/tests/baselines/reference/newLineFlagWithLF.types
@@ -0,0 +1,11 @@
+=== tests/cases/compiler/newLineFlagWithLF.ts ===
+var x=1;
+>x : number
+>1 : number
+
+x=2;
+>x=2 : number
+>x : number
+>2 : number
+
+
diff --git a/tests/cases/compiler/contextualTyping.ts b/tests/cases/compiler/contextualTyping.ts
index e378fd8206521..a50d542343a86 100644
--- a/tests/cases/compiler/contextualTyping.ts
+++ b/tests/cases/compiler/contextualTyping.ts
@@ -1,4 +1,4 @@
-// @newline: \n
+// @normalizenewline: \n
 // @sourcemap: true
 // DEFAULT INTERFACES
 interface IFoo {
diff --git a/tests/cases/compiler/newLineFlagWithCRLF.ts b/tests/cases/compiler/newLineFlagWithCRLF.ts
new file mode 100644
index 0000000000000..2a25ebc50d1d1
--- /dev/null
+++ b/tests/cases/compiler/newLineFlagWithCRLF.ts
@@ -0,0 +1,4 @@
+// @newline: CRLF
+var x=1;
+x=2;
+
diff --git a/tests/cases/compiler/newLineFlagWithLF.ts b/tests/cases/compiler/newLineFlagWithLF.ts
new file mode 100644
index 0000000000000..2f85a3a1e7f19
--- /dev/null
+++ b/tests/cases/compiler/newLineFlagWithLF.ts
@@ -0,0 +1,4 @@
+// @newline: LF
+var x=1;
+x=2;
+