New: Reporter.setEscapeHtml(boolean).
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"));
+  }
 }