Index: autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/evaluation/result/UsabilityDefect.java
===================================================================
--- autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/evaluation/result/UsabilityDefect.java	(revision 1031)
+++ autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/evaluation/result/UsabilityDefect.java	(revision 1032)
@@ -2,10 +2,25 @@
 package de.ugoe.cs.autoquest.usability.evaluation.result;
 
+import static java.lang.String.format;
+
+import java.util.List;
 import java.util.Map;
 
+import lombok.AllArgsConstructor;
+import lombok.ExtensionMethod;
 import lombok.Getter;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
 import de.ugoe.cs.autoquest.usability.DefectDescription;
 import de.ugoe.cs.autoquest.usability.ParameterFragment;
+import de.ugoe.cs.autoquest.usability.util.DefectDescriptionExtensionMethods;
 
+@AllArgsConstructor
+@ExtensionMethod({DefectDescriptionExtensionMethods.class})
 public class UsabilityDefect {
 
@@ -17,55 +32,34 @@
     private Map<String, String> descriptionParametersValues;
 
-    public UsabilityDefect(UsabilityDefectSeverityLevel severityLevel,
-                                           DefectDescription recommendationDescription,
-                                           Map<String, String> descriptionParametersValues) {
-        this.severityLevel = severityLevel;
-        this.defectDescription = recommendationDescription;
-        this.descriptionParametersValues = descriptionParametersValues;
+    public String defectDescription() {
+        if(defectDescription.containsParameterFragments()) {
+            return assembleDefectDescription();
+        } else {
+            return Joiner.on(" ").skipNulls().join(defectDescription.getTextFragmentOrParameterFragment());
+        }
     }
 
-    public String defectDescription() {
-        StringBuffer result = new StringBuffer();
+    private String assembleDefectDescription() {
+        List<String> descriptionParts = 
+                Lists.newArrayListWithCapacity(defectDescription.getTextFragmentOrParameterFragment().size());
 
         for (Object fragment : defectDescription.getTextFragmentOrParameterFragment()) {
-            if (result.length() > 0) {
-                result.append(" ");
-            }
-
-            if (fragment instanceof ParameterFragment) {
-                String value = null;
-                if (descriptionParametersValues != null) {
-                    value =
-                        descriptionParametersValues.get(((ParameterFragment) fragment)
-                            .getParameterName());
-                }
-
-                if (value != null) {
-                    result.append(value);
-                }
-                else {
-                    throw new IllegalArgumentException("required parameter \"" +
-                        ((ParameterFragment) fragment).getParameterName() +
-                        "\" for usability defect description not provided");
-                }
-            }
-            else {
-                result.append(getFragmentString(fragment));
+            if (fragment.isParameterFragment()) {
+                descriptionParts.add(parameterFragmentAsString((ParameterFragment) fragment));
+            } else {
+                 descriptionParts.add(CharMatcher.WHITESPACE.collapseFrom((String) fragment, ' ').trim());
             }
         }
 
-        return result.toString();
+        return Joiner.on(' ').join(descriptionParts);
     }
 
-    private String getFragmentString(Object fragment) {
-        String fragmentStr = fragment.toString().trim();
-
-        fragmentStr = fragmentStr.replaceAll("\n", " ");
-
-        while (fragmentStr.indexOf("  ") > -1) {
-            fragmentStr = fragmentStr.replaceAll("  ", " ");
+    private String parameterFragmentAsString(ParameterFragment fragment) {
+        String value = descriptionParametersValues.getValueOrEmptyString(fragment.getParameterName());
+        if (StringUtils.isNotEmpty(value)) {
+            return value;
+        } else {
+            throw new IllegalArgumentException(format("required parameter \"%s\" for usability defect description not provided", fragment.getParameterName()));
         }
-
-        return fragmentStr;
     }
 
Index: autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/util/DefectDescriptionExtensionMethods.java
===================================================================
--- autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/util/DefectDescriptionExtensionMethods.java	(revision 1032)
+++ autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/util/DefectDescriptionExtensionMethods.java	(revision 1032)
@@ -0,0 +1,40 @@
+package de.ugoe.cs.autoquest.usability.util;
+
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang.StringUtils;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import de.ugoe.cs.autoquest.usability.DefectDescription;
+import de.ugoe.cs.autoquest.usability.ParameterFragment;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class DefectDescriptionExtensionMethods {
+
+    public static boolean containsParameterFragments(DefectDescription defectDescription) {
+        return Iterables.any(defectDescription.getTextFragmentOrParameterFragment(), new Predicate<Object>() {
+
+            @Override
+            public boolean apply(@Nullable Object fragment) {
+                return fragment instanceof ParameterFragment;
+            }
+            
+        });
+    }
+    
+    public static boolean isParameterFragment(Object object) {
+        return object instanceof ParameterFragment;
+    }
+    
+    public static String getValueOrEmptyString(Map<String, String> stringKeyValueMap, String key) {
+        return stringKeyValueMap != null && stringKeyValueMap.containsKey(key) ? stringKeyValueMap.get(key) : StringUtils.EMPTY;
+    }
+    
+}
