 <p>This is because AngularJS escape HTML tags in string (replace them with HTML entities) by default to save you from XSS and some other security problems as well. To display trusted content un-escaped you could use <code>ngBindHTMLUnsafe</code> (in older AngularJS version), or the the <code>ngBindHTML</code> ans SCE in 1.2 and newer. For example:</p> <pre><code>&lt;div&gt;{{sometext|newline2br}}&lt;/div&gt; </code></pre> <p>Would be rewritten as (below 1.2):</p> <pre><code>&lt;div ng-bind-html-unsafe="sometext|newline2br"&gt;&lt;/div&gt; </code></pre> <p>With 1.2 and above:</p> <pre><code>&lt;div ng-bind-html="sometext|newline2br|trusted"&gt;&lt;/div&gt; </code></pre> <p>with the trusted filter:</p> <pre><code>app .filter('trusted', function($sce) { // You can use this one as `value|newline2br|trusted`, // but I don't recommend it return function(input) { return $sce.trustAsHtml(input) } }) </code></pre> <p>Or better with:</p> <pre><code>&lt;div ng-bind-html="sometext|newline2br"&gt;&lt;/div&gt; </code></pre> <p>and:</p> <pre><code>app .filter('newline2br', function($sce) { // This is my preferred way return function(input) { return $sce.trustAsHtml(input.replace(/\n/g, "&lt;br&gt;")) } }) </code></pre> <p>Plunker: <a href="http://plnkr.co/LIxFVpi6ChtTLEni11qy" rel="nofollow">http://plnkr.co/LIxFVpi6ChtTLEni11qy</a></p>