diff --git a/src/main/java/org/testng/Reporter.java b/src/main/java/org/testng/Reporter.java
index 8abdba2..01f8f36 100755
--- a/src/main/java/org/testng/Reporter.java
+++ b/src/main/java/org/testng/Reporter.java
@@ -2,6 +2,7 @@
 
 import org.testng.collections.Lists;
 import org.testng.collections.Maps;
+import org.testng.util.Strings;
 
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,8 @@
 
   private static Map<ITestResult, List<Integer>> m_methodOutputMap = Maps.newHashMap();
 
+  private static boolean m_escapeHtml = false;
+
   public static void setCurrentTestResult(ITestResult m) {
     m_currentTestResult.set(m);
   }
@@ -54,9 +57,18 @@
     m_output.clear();
   }
 
+  /**
+   * @param escapeHtml If true, use HTML entities for special HTML characters (<, >, &, ...).
+   */
+  public static void setEscapeHtml(boolean escapeHtml) {
+    m_escapeHtml = escapeHtml;
+  }
+
   private static synchronized void log(String s, ITestResult m) {
     // Escape for the HTML reports
-    s = s.replace("<", "[").replace(">", "]") + "<br>";
+    if (m_escapeHtml) {
+      s = Strings.escapeHtml(s);
+    }
 
     // synchronization needed to ensure the line number and m_output are updated atomically
     int n = getOutput().size();
diff --git a/src/main/java/org/testng/collections/Lists.java b/src/main/java/org/testng/collections/Lists.java
index 222bc97..a0cba2d 100755
--- a/src/main/java/org/testng/collections/Lists.java
+++ b/src/main/java/org/testng/collections/Lists.java
@@ -14,6 +14,14 @@
     return new ArrayList<K>(c);
   }
 
+  public static <K> List<K> newArrayList(K... elements) {
+    List<K> result = new ArrayList<K>();
+    for (K e : elements) {
+      result.add(e);
+    }
+    return result;
+  }
+
   public static <K> List<K> newArrayList(int size) {
     return new ArrayList<K>(size);
   }
diff --git a/src/main/java/org/testng/util/Strings.java b/src/main/java/org/testng/util/Strings.java
index c8fc146..56faee8 100644
--- a/src/main/java/org/testng/util/Strings.java
+++ b/src/main/java/org/testng/util/Strings.java
@@ -1,7 +1,40 @@
 package org.testng.util;
 
+import com.google.inject.internal.Maps;
+
+import org.testng.collections.Lists;
+
+import java.util.List;
+import java.util.Map;
+
 public class Strings {
   public static boolean isNullOrEmpty(String string) {
     return string == null || string.length() == 0; // string.isEmpty() in Java 6
   }
+
+  private static List<String> ESCAPE_HTML_LIST = Lists.newArrayList(
+    "<", "&lt;",
+    ">", "&gt;",
+    "&", "&amp;"
+  );
+  
+  private static final Map<String, String> ESCAPE_HTML_MAP = Maps.newHashMap();
+
+  static {
+    for (int i = 0; i < ESCAPE_HTML_LIST.size(); i += 2) {
+      ESCAPE_HTML_MAP.put(ESCAPE_HTML_LIST.get(i), ESCAPE_HTML_LIST.get(i + 1));
+    }
+  }
+
+  public static String escapeHtml(String text) {
+    String result = text;
+    for (Map.Entry<String, String> entry : ESCAPE_HTML_MAP.entrySet()) {
+      result = result.replace(entry.getKey(), entry.getValue());
+    }
+    return result;
+  }
+
+  public static void main(String[] args) {
+    System.out.println(escapeHtml("10 < 20 && 30 > 20"));
+  }
 }
