diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 7c0c796401afeed231e64d8787b8b324f95b4dc5..8719e38a0994f3f2bd5906cdc4943af053beeb7a 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -876,6 +876,20 @@
           <filterConditionProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/filterConditionProcess.js</filterConditionProcess>
           <filtertype>BASIC</filtertype>
         </filterExtensionSet>
+        <filterExtensionSet>
+          <name>ClassificationSummary_filter</name>
+          <filterFieldsProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterFieldsProcess.js</filterFieldsProcess>
+          <filterValuesProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterValuesProcess.js</filterValuesProcess>
+          <filterConditionProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtensionSet>
+        <filterExtensionSet>
+          <name>ClassificationScore_filter</name>
+          <filterFieldsProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterFieldsProcess.js</filterFieldsProcess>
+          <filterValuesProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterValuesProcess.js</filterValuesProcess>
+          <filterConditionProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtensionSet>
       </filterExtensions>
     </dbRecordContainer>
     <indexRecordContainer>
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterConditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterConditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9a81e734d1d5832c87848fa6b12650b9af03993
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterConditionProcess.js
@@ -0,0 +1,33 @@
+import("Sql_lib");
+import("system.logging");
+import("AttributeFilter_lib");
+import("Entity_lib");
+import("Context_lib");
+import("system.vars");
+import("system.result");
+
+
+var operator = vars.get("$local.operator");
+var rawvalue = vars.get("$local.rawvalue");
+var columnPlaceholder = vars.get("$local.columnPlaceholder");
+var filterCond = vars.get("$local.condition");
+var classificationtypeid = AttributeSearchNameCoder.decode(vars.getString("$local.name")).id;
+var sqlCond;
+
+
+var subsqlclosed = newSelect("OBJECT_ROWID").from("CLASSIFICATION").where("CLASSIFICATION.OBJECT_TYPE", "Salesproject");
+var subsqlExtra2 =  subsqlclosed.andIfSet("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationtypeid);
+var subsqlExtra = subsqlclosed.andIfSet("CLASSIFICATION.CLASSIFICATIONSCORE_ID", rawvalue);
+
+if (operator == "1")//equal
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subsqlExtra, SqlBuilder.IN()).toString();
+else if (operator == "2")//not equal 
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subsqlExtra, SqlBuilder.NOT_IN()).toString();
+else if (operator == "11")//is not empty
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subsqlExtra2, SqlBuilder.IN()).toString();
+else if (operator == "12")//is empty
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subsqlExtra2, SqlBuilder.NOT_IN()).toString();
+else sqlCond = "1=1";
+
+
+result.string(sqlCond);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterFieldsProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterFieldsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2733262042f5986d7d3cae681ed536f454fffbd
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterFieldsProcess.js
@@ -0,0 +1,28 @@
+import("Sql_lib");
+import("system.translate");
+import("system.logging");
+import("system.util");
+import("KeywordRegistry_basic");
+import("system.entities");
+import("Attribute_lib");
+import("AttributeFilter_lib");
+import("system.result");
+
+var res = [];
+
+var data = newSelect("CLASSIFICATIONTYPEID, CLASSIFICATIONGROUP, SCORETYPE") 
+          .from("classificationtype") 
+          .orderBy("CLASSIFICATIONGROUP").table();
+
+data.forEach(function(row){
+    var name = AttributeSearchNameCoder.encode(row[0], row[2]);
+    res.push({
+        name: name,
+        title: translate.text(row[1]) + " / " + translate.text(row[2]),
+        contentType: "TEXT",
+        hasDropDownValues: true 
+    });
+})
+
+res = JSON.stringify(res);
+result.string(res);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterValuesProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterValuesProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6750d045ccbf390d579bac8c82f19e61027d3b13
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationscore_filter/filterValuesProcess.js
@@ -0,0 +1,27 @@
+import("IndexSearch_lib");
+import("system.logging");
+import("system.vars");
+import("Sql_lib");
+import("AttributeFilter_lib");
+import("Attribute_lib");
+import("system.result");
+import("system.translate");
+
+var filter = JSON.parse(vars.get("$local.filter"));
+var nameObject = AttributeSearchNameCoder.decode(filter.name); 
+var classID = nameObject.id;
+
+
+var res = newSelect("CLASSIFICATIONSCOREID , TITLE")
+          .from("CLASSIFICATIONSCORE")
+          .where("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", classID)
+          .table();
+
+for(var i = 0; i < res.length; i++)
+{
+    res[i][1] = translate.text(res[i][1])
+}
+
+if (res == null)
+    res = [];
+result.object(res);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterConditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterConditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffad1bd95e4772a70895b5d53923ec4fd4ef2789
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterConditionProcess.js
@@ -0,0 +1,43 @@
+import("Sql_lib");
+import("Classification_lib");
+import("system.logging");
+import("AttributeFilter_lib");
+import("Entity_lib");
+import("Context_lib");
+import("system.vars");
+import("system.result");
+
+
+var operator = vars.get("$local.operator");
+var rawvalue = vars.get("$local.rawvalue");
+var columnPlaceholder = vars.get("$local.columnPlaceholder");
+var filterCond = vars.get("$local.condition");
+var classificationTypeID = AttributeSearchNameCoder.decode(vars.getString("$local.name")).id;
+var sqlCond;
+
+//[["A","A"],["B","B"],["C","C"],["D","D"]]
+var scoreValue = ClassificationUtils.mapClassLetter(rawvalue);
+var havingCase;
+if(scoreValue[0] == 0)
+    havingCase = "sum(SCORE) >= " + scoreValue[0];
+else
+    havingCase = "sum(SCORE) > " + scoreValue[0];
+            
+var having = havingCase + " and sum(SCORE) <= " + scoreValue[1];  
+
+
+var subSqlCond = newSelect("OBJECT_ROWID").from("classification").join("classificationscore", "classiFICATIONSCOREID = CLASSIFICATIONSCORE_ID")
+    .where("classificationscore.CLASSIFICATIONTYPE_ID", newSelect("classificationtypeId").from("classificationtype")
+    .where("classificationtype.CLASSIFICATIONGROUP", classificationTypeID), SqlBuilder.IN()).groupBy("classification.OBJECT_ROWID");
+
+if (operator == "1")//equal
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subSqlCond.having(having), SqlBuilder.IN()).toString();
+else if (operator == "2")//not equal
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subSqlCond.having(having), SqlBuilder.NOT_IN()).toString();
+else if (operator == "11")//is not empty
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subSqlCond, SqlBuilder.IN()).toString();
+else if (operator == "12")//is empty
+    sqlCond = newWhere("SALESPROJECT.SALESPROJECTID", subSqlCond, SqlBuilder.NOT_IN()).or("SALESPROJECT.SALESPROJECTID", newSelect("OBJECT_ROWID").from("classification"), SqlBuilder.NOT_IN()).toString();
+else sqlCond = "1=1";
+
+result.string(sqlCond);
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterFieldsProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterFieldsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9121b18d618730e329ce439e3d72cb6eb11e91d3
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterFieldsProcess.js
@@ -0,0 +1,29 @@
+import("Sql_lib");
+import("system.translate");
+import("system.logging");
+import("system.util");
+import("KeywordRegistry_basic");
+import("system.entities");
+import("Attribute_lib");
+import("AttributeFilter_lib");
+import("system.result");
+
+var res = [];
+
+var data = newSelect("distinct CLASSIFICATIONGROUP, CLASSIFICATIONGROUP") 
+          .from("classificationtype") 
+          .orderBy("CLASSIFICATIONGROUP").table();
+
+
+data.forEach(function(row){
+    var name = AttributeSearchNameCoder.encode(row[0], row[1]);
+    res.push({
+        name: name,
+        title: translate.text(row[1]),
+        contentType: "TEXT",
+        hasDropDownValues: true 
+    });
+})
+
+res = JSON.stringify(res);
+result.string(res);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterValuesProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterValuesProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8a572bd1090952e3ff3ef6d731c18a18b1c218fe
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationsummary_filter/filterValuesProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.object([["A","A"],["B","B"],["C","C"],["D","D"]]);
\ No newline at end of file
diff --git a/process/Classification_lib/process.js b/process/Classification_lib/process.js
index 126a6dde2d44fd2fa1f2421e7f4dcab7acbc13c9..94dd142e6d231a5db377a0cef0eaa1ba3148a553 100644
--- a/process/Classification_lib/process.js
+++ b/process/Classification_lib/process.js
@@ -85,6 +85,40 @@ ClassificationUtils.mapToClass = function(pScore)
     return "_";
 }
 
+
+/**
+ * get the lowest Score for a Letter.
+ * The classes are hardcoded like this:
+ * >=0 to 25:    D
+ * > 25 to 50:   C
+ * > 50 to 75:   B
+ * > 75 to 100:  A
+ * 
+ * @return {Array} [min, max] Points the Letter is between
+ */
+ClassificationUtils.mapClassLetter = function(pLetter) 
+{
+    var res;
+    switch (pLetter) {
+        case 'A':
+            res = [75,100]
+            break;
+        case 'B':
+            res = [50, 75];
+            break;
+        case 'C':
+            res = [25, 50];
+            break;
+        case 'D':
+            res = [0, 25];
+            break;
+    }
+    if(!res)
+        res = false;
+    return res;
+}
+
+
 /**
  * Get all possible groupnames for a classificationtype
  * Either as [["group", "group"]] (for the possible items process)