Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/CMDperformUsabilityEvaluation.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/CMDperformUsabilityEvaluation.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/CMDperformUsabilityEvaluation.java	(revision 1138)
@@ -0,0 +1,150 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability;
+
+import java.util.List;
+
+import com.google.common.base.Optional;
+
+import de.ugoe.cs.autoquest.CommandHelpers;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.usability.rules.EmptyRuleset;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityResult;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRuleset;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.GlobalDataContainer;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class CMDperformUsabilityEvaluation implements Command {
+
+    private final int taskTreeParamaterIndex = 0;
+    
+    private final int evaluationResultParameterIndex = 1;
+    
+    private final String defaultEvaluationResultParameterName = "usabilityEvaluationResult";
+    
+    private final UsabilityRuleset defaultUsabilityRuleset = new EmptyRuleset();
+    
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+     */
+    @Override
+    public void run(List<Object> parameters) {
+        String nameOfTaskTree = getTaskTreeParameter(parameters);
+        Optional<ITaskTree> taskTree = getTaskTreeFromDataContainer(nameOfTaskTree);
+        if(taskTree.isPresent()) {
+            UsabilityRuleset ruleset = getUsabilityRuleset();
+            UsabilityResult result = UsabilityEvaluator.evaluate(taskTree.get()).using(ruleset);
+            String evaluationResultParameterName = getEvaluationResultParameter(parameters);
+            storeUsabilityResultInDataContainer(evaluationResultParameterName, result);
+        }
+        return;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param parameters
+     * @return
+     */
+    private String getTaskTreeParameter(List<Object> parameters) {
+        try {
+            return (String) parameters.get(taskTreeParamaterIndex);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("must provide a task tree name");
+        }
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param parameters
+     * @return
+     */
+    private String getEvaluationResultParameter(List<Object> parameters) {
+        if(parameters.size() == 2) {
+            return (String) parameters.get(evaluationResultParameterIndex);
+        }
+        return defaultEvaluationResultParameterName;
+    }
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param nameOfTaskTree
+     * @return
+     */
+    private Optional<ITaskTree> getTaskTreeFromDataContainer(String nameOfTaskTree) {
+        Object dataObject = GlobalDataContainer.getInstance().getData(nameOfTaskTree);
+        if(dataObject != null) {
+            if(dataObject instanceof ITaskTree) {
+                ITaskTree taskTree = (ITaskTree) dataObject;
+                return Optional.of(taskTree);
+            } else {
+                CommandHelpers.objectNotType(nameOfTaskTree, "ITaskTree");
+                return Optional.absent();
+            }
+        }
+        CommandHelpers.objectNotFoundMessage(nameOfTaskTree);
+        return Optional.absent();
+    }
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @return
+     */
+    private UsabilityRuleset getUsabilityRuleset() {
+        // TODO Auto-generated method stub
+        System.out.println("TODO: implement CMDperformUsabilityEvaluation.getUsabilityRuleset ");
+        return this.defaultUsabilityRuleset;
+    }
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * @param evaluationResultParameterName 
+     *
+     */
+    private void storeUsabilityResultInDataContainer(String evaluationResultParameterName, UsabilityResult result) {
+        if (GlobalDataContainer.getInstance().addData(evaluationResultParameterName, result)) {
+            CommandHelpers.dataOverwritten(evaluationResultParameterName);
+        }   
+    }
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.util.console.Command#help()
+     */
+    @Override
+    public String help() {
+        return "peformUsabilityEvaluation <taskTree> {evaluationResult}";
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluator.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluator.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluator.java	(revision 1138)
@@ -0,0 +1,75 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability;
+
+import java.util.logging.Level;
+
+import com.google.common.base.Optional;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityResult;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRule;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRuleset;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class UsabilityEvaluator {
+    
+    private ITaskTree taskTree;
+
+    private UsabilityEvaluator(ITaskTree taskTree) {
+        this.taskTree = taskTree;
+    }
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param taskTree
+     * @return
+     */
+    public static UsabilityEvaluator evaluate(ITaskTree taskTree) {
+        return new UsabilityEvaluator(taskTree);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param object
+     * @return
+     */
+    public UsabilityResult using(UsabilityRuleset ruleset) {
+        Console.traceln(Level.INFO, "evaluating usability of task tree " + this.taskTree);
+        UsabilityResult result = new UsabilityResult();
+        for(UsabilityRule rule : ruleset.evaluationRules()) {
+            Optional<UsabilityDefect> defect = rule.check();
+            if(defect.isPresent()) {
+                result.addDefect(defect.get());
+            }
+        }
+        return result;
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/DefectDescriptionResolver.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/DefectDescriptionResolver.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/DefectDescriptionResolver.java	(revision 1138)
@@ -0,0 +1,208 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.result;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import jodd.props.Props;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class DefectDescriptionResolver {
+
+    private final String defectDescriptionFile = "defects.props";
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @param name
+     * @return
+     */
+    public UsabilityDefect descriptionFor(String usabilityRuleName) {
+        Props allProperties = initProperties();
+        Map<String, String> usabilityRuleProperties =
+            allUsabilityRuleProperties(allProperties, usabilityRuleName);
+        return createUsabilityDefect(usabilityRuleProperties);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @return
+     */
+    private Props initProperties() {
+        Optional<File> defectDescriptionFile = getDefectDescriptionFile();
+        Props props = new Props();
+        props.setEscapeNewLineValue("\n");
+        props.setValueTrimLeft(true);
+        if (defectDescriptionFile.isPresent()) {
+            loadProperties(defectDescriptionFile, props);
+        }
+        return props;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @return
+     */
+    private Optional<File> getDefectDescriptionFile() {
+        try {
+            return Optional.fromNullable(new File(ClassLoader
+                .getSystemResource(defectDescriptionFile).toURI()));
+        }
+        catch (URISyntaxException e) {
+            Console.printerr("Error while loading defect description file.");
+            Console.logException(e);
+            return Optional.absent();
+        }
+    }
+
+    private void loadProperties(Optional<File> defectDescriptionFile, Props props) {
+        try {
+            props.load(defectDescriptionFile.get());
+        }
+        catch (IOException e) {
+            Console.logException(e);
+        }
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @return
+     */
+    private Map<String, String> allUsabilityRuleProperties(Props allProperties,
+                                                                   String usabilityRuleName)
+    {
+        Map<String, String> usabilityRuleProperties = Maps.newHashMap();
+        allProperties.extractSubProps(usabilityRuleProperties, usabilityRuleName + ".*");
+        return usabilityRuleProperties;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @param usabilityRuleProperties
+     * @return
+     */
+    private UsabilityDefect createUsabilityDefect(Map<String, String> usabilityRuleProperties) {
+        String description =
+            Iterables.getOnlyElement(Maps.filterKeys(usabilityRuleProperties, descriptionProperty()).values());
+        EnumMap<UsabilityDefectSeverityLevel, Double> severity =
+            getSeverityMap(usabilityRuleProperties);
+        return new UsabilityDefect(description, severity);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @return
+     */
+    private Predicate<String> descriptionProperty() {
+        return new Predicate<String>() {
+
+            public boolean apply(String key) {
+                return key.endsWith("description");
+            }
+
+        };
+    }
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @param usabilityRuleProperties
+     * @return
+     */
+    private EnumMap<UsabilityDefectSeverityLevel, Double> getSeverityMap(Map<String, String> usabilityRuleProperties)
+    {
+        EnumMap<UsabilityDefectSeverityLevel, Double> severityMap =
+            Maps.newEnumMap(UsabilityDefectSeverityLevel.class);
+        Map<String, String> allSeverityProperties =
+            Maps.filterEntries(usabilityRuleProperties, allSeverityProperties());
+        for (Entry<String, String> severityProperty : allSeverityProperties.entrySet()) {
+            UsabilityDefectSeverityLevel severityLevel =
+                getSeverityLevel(severityProperty.getKey());
+            Double rule = Double.valueOf(severityProperty.getValue());
+            severityMap.put(severityLevel, rule);
+        }
+        return severityMap;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @param key
+     * @return
+     */
+    private UsabilityDefectSeverityLevel getSeverityLevel(String severityProperty) {
+        int startSeverityLevel = severityProperty.lastIndexOf(".") + 1;
+        String severitLevelIdentifier =
+            severityProperty.substring(startSeverityLevel).toUpperCase();
+        return UsabilityDefectSeverityLevel.valueOf(severitLevelIdentifier);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * 
+     * @return
+     */
+    private Predicate<Entry<String, String>> allSeverityProperties() {
+        return new Predicate<Map.Entry<String, String>>() {
+
+            public boolean apply(Map.Entry<String, String> entry) {
+                return entry.getKey().contains("severity");
+            }
+
+        };
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefect.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefect.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefect.java	(revision 1138)
@@ -0,0 +1,121 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.result;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.Maps;
+
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class UsabilityDefect {
+
+    private UsabilityDefectSeverityLevel severityLevel = UsabilityDefectSeverityLevel.NONE;
+    
+    private String description;
+    
+    private final EnumMap<UsabilityDefectSeverityLevel, Double> severity;
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param description
+     * @param severity
+     */
+    public UsabilityDefect(String description,
+                           EnumMap<UsabilityDefectSeverityLevel, Double> severity)
+    {
+        this.description = description;
+        this.severity = severity;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @return
+     */
+    public UsabilityDefectSeverityLevel getSeverityLevel() {
+        return this.severityLevel;
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param evaluationMetric
+     * @return
+     */
+    public Optional<UsabilityDefect> isPresent(float evaluationMetric) {
+        Optional<UsabilityDefect> defect = Optional.absent();
+        Map<UsabilityDefectSeverityLevel, Double> matchingSeverityLevels = Maps.filterValues(this.severity, severityForMetric(evaluationMetric));
+        if(matchingSeverityLevels.isEmpty()) {
+            return defect;
+        }
+        setDefectAttributes(matchingSeverityLevels, evaluationMetric);
+        return Optional.of(this);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param matchingSeverityLevels
+     * @param evaluationMetric
+     */
+    private void setDefectAttributes(Map<UsabilityDefectSeverityLevel, Double> matchingSeverityLevels,
+                                     float evaluationMetric)
+    {
+        BiMap<Double, UsabilityDefectSeverityLevel> inverse = HashBiMap.create(matchingSeverityLevels).inverse();
+        this.severityLevel = inverse.get(Collections.max(inverse.keySet()));
+        this.description = String.format(this.description, evaluationMetric);
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     * @param evaluationMetric 
+     *
+     * @return
+     */
+    private Predicate< Double> severityForMetric(final float evaluationMetric) {
+        return new Predicate<Double>() {
+            
+            public boolean apply(Double severityThreshold) {
+                return evaluationMetric > severityThreshold;
+            }
+            
+        };
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefectSeverityLevel.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefectSeverityLevel.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/result/UsabilityDefectSeverityLevel.java	(revision 1138)
@@ -0,0 +1,28 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.result;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public enum UsabilityDefectSeverityLevel {
+    
+    NONE, INFO, LOW, MEDIUM, HIGH;
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/EmptyRuleset.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/EmptyRuleset.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/EmptyRuleset.java	(revision 1138)
@@ -0,0 +1,38 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class EmptyRuleset implements UsabilityRuleset {
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.usability.UsabilityRuleset#evaluationRules()
+     */
+    @Override
+    public List<UsabilityRule> evaluationRules() {
+        return Collections.emptyList();
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetric.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetric.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetric.java	(revision 1138)
@@ -0,0 +1,26 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public interface UsabilityMetric {
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetricsRuleset.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetricsRuleset.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetricsRuleset.java	(revision 1138)
@@ -0,0 +1,58 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.usability.rules.metrics.NoLetterOrDigitRatioMetric;
+import de.ugoe.cs.autoquest.usability.rules.metrics.TextInputEntryRepetitionsMetric;
+import de.ugoe.cs.autoquest.usability.rules.metrics.TextInputRatioMetric;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class UsabilityMetricsRuleset implements UsabilityRuleset {
+
+    private List<UsabilityRule> metrics;
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     */
+    private UsabilityMetricsRuleset(ITaskTree taskTree) {
+        this.metrics = Lists.newArrayList();
+        metrics.add(new NoLetterOrDigitRatioMetric(taskTree));
+        metrics.add(new TextInputEntryRepetitionsMetric(taskTree));
+        metrics.add(new TextInputRatioMetric(taskTree));
+    }
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.usability.UsabilityRuleset#evaluationRules()
+     */
+    @Override
+    public List<UsabilityRule> evaluationRules() {
+        return this.metrics;
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityResult.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityResult.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityResult.java	(revision 1138)
@@ -0,0 +1,54 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefectSeverityLevel;
+
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class UsabilityResult {
+    
+    private Multimap<UsabilityDefectSeverityLevel, UsabilityDefect> detectedDefects;
+    
+    public UsabilityResult() {
+        this.detectedDefects = ArrayListMultimap.create();
+    }
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param usabilityDefect
+     */
+    public void addDefect(UsabilityDefect usabilityDefect) {
+        this.detectedDefects.put(usabilityDefect.getSeverityLevel(), usabilityDefect);
+    }
+    
+    public boolean hasDefects() {
+        return !this.detectedDefects.isEmpty();
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRule.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRule.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRule.java	(revision 1138)
@@ -0,0 +1,49 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+import com.google.common.base.Optional;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public abstract class UsabilityRule {
+    
+    protected final ITaskTree taskTree;
+    
+    protected String name;
+    
+    protected UsabilityDefect defect;
+    
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     */
+    public UsabilityRule(ITaskTree taskTree) {
+        this.taskTree = taskTree;
+    }
+    
+    public abstract Optional<UsabilityDefect> check();
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRuleset.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRuleset.java	(revision 1138)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRuleset.java	(revision 1138)
@@ -0,0 +1,37 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules;
+
+import java.util.List;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public interface UsabilityRuleset {
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @return
+     */
+    public List<UsabilityRule> evaluationRules();
+
+}
