From 12571689ab13480f23e4c1c41d9ef0e5d5f9029c Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 3 May 2013 15:24:38 +0200
Subject: [PATCH] OO-535: implements extended search, save the state in gui
 preferences

---
 .../admin/sysinfo/model/SessionsStats.java    |  19 +
 .../admin/sysinfo/model/UserSessionView.java  |  19 +
 .../core/_i18n/LocalStrings_de.properties     |   1 +
 .../form/flexible/FormUIFactory.java          |  11 +-
 .../flexible/elements/FlexiTableElement.java  |  13 +
 .../flexible/impl/FormBasicController.java    |   1 -
 .../table/AbstractFlexiTableRenderer.java     |   3 +
 .../DefaultFlexiTableDataSourceModel.java     |  10 +-
 .../ExtendedFlexiTableSearchController.java   |  36 ++
 .../table/FlexiDataTablesRenderer.java        |  14 +-
 .../elements/table/FlexiTableDataSource.java  |   4 +
 .../elements/table/FlexiTableElementImpl.java | 100 +++-
 .../generic/modal/ButtonClickedEvent.java     |   4 +-
 .../generic/modal/DialogBoxController.java    |   2 +-
 .../manager/QuestionItemDocumentFactory.java  |   7 +-
 .../manager/QuestionPoolServiceImpl.java      |  35 +-
 .../modules/qpool/model/QItemDocument.java    |   2 +-
 .../qpool/model/SearchQuestionItemParams.java |  22 +
 .../qpool/ui/AbstractItemListController.java  |  16 +-
 .../ui/CollectionQuestionsController.java     |   2 +-
 .../modules/qpool/ui/ItemListController.java  |   2 +-
 .../modules/qpool/ui/PoolsController.java     |   1 +
 .../ui/QuestionItemDetailsController.java     |   1 +
 .../qpool/ui/QuestionListController.java      |   6 +-
 .../ui/QuestionPoolMainEditorController.java  |  11 +-
 .../modules/qpool/ui/QuestionsController.java |   4 +-
 .../olat/modules/qpool/ui/_content/items.html |   9 +-
 .../qpool/ui/_i18n/LocalStrings_de.properties |   4 +-
 .../qpool/ui/admin/PoolEditController.java    |   2 +-
 .../qpool/ui/admin/PoolsAdminController.java  |   2 +-
 .../QEducationalContextEditController.java    |   2 +-
 .../QEducationalContextsAdminController.java  |   2 +-
 .../ui/admin/QItemTypeEditController.java     |   2 +-
 .../ui/admin/QItemTypesAdminController.java   |   2 +-
 .../ui/admin/QLicenseEditController.java      |   2 +-
 .../ui/admin/QLicensesAdminController.java    |   2 +-
 .../ui/admin/TaxonomyAdminController.java     |   2 +-
 .../ui/admin/TaxonomyLevelController.java     |   2 +-
 .../ui/admin/TaxonomyLevelEditController.java |   2 +-
 .../datasource/CollectionOfItemsSource.java   |   1 +
 .../ui/datasource/DefaultItemsSource.java     |   1 +
 .../ui/datasource/SharedItemsSource.java      |   1 +
 .../ui/{edit => events}/QItemEdited.java      |   2 +-
 .../EducationalMetadataController.java        |   6 +-
 .../EducationalMetadataEditController.java    |   7 +-
 .../ui/metadata/ExtendedSearchController.java | 538 ++++++++++++++++++
 .../qpool/ui/metadata/ExtendedSearchPref.java |  62 ++
 .../ui/metadata/ExtendedSearchPrefs.java      |  44 ++
 .../GeneralMetadataController.java            |   6 +-
 .../GeneralMetadataEditController.java        |  10 +-
 .../LifecycleMetadataController.java          |   6 +-
 .../LifecycleMetadataEditController.java      |  11 +-
 .../ui/{edit => metadata}/MetaUIFactory.java  |  65 ++-
 .../MetadataBulkChangeController.java         |  62 +-
 .../{ => metadata}/MetadatasController.java   |  23 +-
 .../QuestionMetadataController.java           |   6 +-
 .../QuestionMetadataEditController.java       |  16 +-
 .../RightsMetadataController.java             |   6 +-
 .../RightsMetadataEditController.java         |   9 +-
 .../{edit => metadata}/SharingController.java |   6 +-
 .../TechnicalMetadataController.java          |   6 +-
 .../TechnicalMetadataEditController.java      |  11 +-
 .../_content/author_list.html                 |   0
 .../_content/bulk_change.html                 |   0
 .../_content/edit_edu_context.html            |   0
 .../ui/metadata/_content/extended_search.html |  11 +
 .../_content/item_metadatas.html              |   0
 .../_content/learning_time.html               |   0
 .../{edit => metadata}/_content/sharing.html  |   0
 .../ui/{edit => metadata}/_content/view.html  |   0
 .../ui/wizard/ExportOverviewController.java   |   2 +-
 .../search/service/SearchServiceImpl.java     |   2 +-
 .../search/service/indexer/JmsIndexWork.java  |  16 +-
 .../search/service/indexer/JmsIndexer.java    |  58 +-
 .../service/indexer/LifeFullIndexer.java      |  13 +
 .../search/service/indexer/LifeIndexer.java   |   2 +
 .../service/indexer/QuestionItemIndexer.java  |   7 +
 .../themes/openolat/all/modules/_dialogs.scss |   3 +-
 .../arquillian/DroneStudentExtension.java     |  19 +
 .../arquillian/StudentConfiguration.java      |  19 +
 .../browser/arquillian/StudentFactory.java    |  22 +-
 81 files changed, 1262 insertions(+), 198 deletions(-)
 create mode 100644 src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java
 rename src/main/java/org/olat/modules/qpool/ui/{edit => events}/QItemEdited.java (96%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/EducationalMetadataController.java (95%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/EducationalMetadataEditController.java (95%)
 create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java
 create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java
 create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/GeneralMetadataController.java (95%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/GeneralMetadataEditController.java (96%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/LifecycleMetadataController.java (94%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/LifecycleMetadataEditController.java (90%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/MetaUIFactory.java (65%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/MetadataBulkChangeController.java (90%)
 rename src/main/java/org/olat/modules/qpool/ui/{ => metadata}/MetadatasController.java (90%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/QuestionMetadataController.java (95%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/QuestionMetadataEditController.java (89%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/RightsMetadataController.java (96%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/RightsMetadataEditController.java (96%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/SharingController.java (97%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/TechnicalMetadataController.java (95%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/TechnicalMetadataEditController.java (91%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/author_list.html (100%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/bulk_change.html (100%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/edit_edu_context.html (100%)
 create mode 100644 src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html
 rename src/main/java/org/olat/modules/qpool/ui/{ => metadata}/_content/item_metadatas.html (100%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/learning_time.html (100%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/sharing.html (100%)
 rename src/main/java/org/olat/modules/qpool/ui/{edit => metadata}/_content/view.html (100%)

diff --git a/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java b/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java
index c3d971e1c90..aff233fb64f 100644
--- a/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java
+++ b/src/main/java/org/olat/admin/sysinfo/model/SessionsStats.java
@@ -1,3 +1,22 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.admin.sysinfo.model;
 
 public class SessionsStats {
diff --git a/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java b/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java
index b4e0b567d31..6adb7bb8c10 100644
--- a/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java
+++ b/src/main/java/org/olat/admin/sysinfo/model/UserSessionView.java
@@ -1,3 +1,22 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.admin.sysinfo.model;
 
 import java.util.Date;
diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
index 75940b27c1b..6ed1263a5f8 100644
--- a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
@@ -60,6 +60,7 @@ rating.explanation=Klicken Sie um zu bewerten
 save=Speichern
 savesas=Speichern unter
 search=Suchen
+extsearch=Erweiterte Suche
 select=Ausw\u00E4hlen
 server.no.response.title=Kommunikationsfehler
 server.no.response=Die Aktion konnte nicht ausgeführt werden da der Server nicht antwortet oder überlastet ist. Versuchen Sie die Aktion erneut durchzuführen oder laden Sie die Seite neu.
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
index f01d4df4c63..70e8f3f9999 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
@@ -68,7 +68,6 @@ import org.olat.core.gui.components.form.flexible.impl.elements.TextBoxListEleme
 import org.olat.core.gui.components.form.flexible.impl.elements.TextElementImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.richText.RichTextElementImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataSource;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableElementImpl;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.tree.TreeModel;
@@ -905,22 +904,22 @@ public class FormUIFactory {
 	 * @param formLayout
 	 * @return
 	 */
-	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel, FormItemContainer formLayout) {
+	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel, FormItemContainer formLayout) {
 		FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name,tableModel);
 		formLayout.add(fte);
 		return fte;
 	}
 	
-	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel,
+	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel,
 			Translator translator, FormItemContainer formLayout) {
 		FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel);
 		formLayout.add(fte);
 		return fte;
 	}
 	
-	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel tableModel,
-			int pageSize, boolean search, Translator translator, FormItemContainer formLayout) {
-		FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel, pageSize, search);
+	public FlexiTableElement addTableElement(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel,
+			int pageSize, Translator translator, FormItemContainer formLayout) {
+		FlexiTableElementImpl fte = new FlexiTableElementImpl(ureq, wControl, name, translator, tableModel, pageSize);
 		formLayout.add(fte);
 		return fte;
 	}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
index ab00a811fa1..d404e767608 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
@@ -28,6 +28,7 @@ package org.olat.core.gui.components.form.flexible.elements;
 import java.util.Set;
 
 import org.olat.core.gui.components.form.flexible.FormItem;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.ExtendedFlexiTableSearchController;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType;
 
 /**
@@ -95,6 +96,18 @@ public interface FlexiTableElement extends FormItem {
 	 */
 	public boolean isSearchEnabled();
 	
+	/**
+	 * Enable the search field
+	 * @param enable
+	 */
+	public void setSearchEnabled(boolean enable);
+	
+	/**
+	 * 
+	 * @param callout
+	 */
+	public void setExtendedSearchCallout(ExtendedFlexiTableSearchController callout);
+	
 	
 	/**
 	 * Return the page size
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
index f6e7ab9750e..1d96ca79008 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
@@ -32,7 +32,6 @@ import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.FormUIFactory;
-import org.olat.core.gui.components.form.flexible.elements.InlineElement;
 import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Disposable;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
index ee208995892..5ab27eec916 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java
@@ -75,6 +75,9 @@ public abstract class AbstractFlexiTableRenderer implements ComponentRenderer {
 			renderFormItem(renderer, sb, ftE.getSearchElement(), ubu, translator, renderResult, args);
 			renderFormItem(renderer, sb, ftE.getSearchButton(), ubu, translator, renderResult, args);
 		}
+		if(ftE.getExtendedSearchButton() != null) {
+			renderFormItem(renderer, sb, ftE.getExtendedSearchButton(), ubu, translator, renderResult, args);
+		}
 		renderFormItem(renderer, sb, ftE.getCustomButton(), ubu, translator, renderResult, args);
 	}
 	
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java
index 26d8e1451f6..1b335279832 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiTableDataSourceModel.java
@@ -129,6 +129,14 @@ public abstract class DefaultFlexiTableDataSourceModel<U> implements FlexiTableD
 		return rows != null && row >= 0 && row < rows.size();
 	}
 
+	@Override
+	public void clear() {
+		rowCount = 0;
+		if(rows != null) {
+			rows.clear();
+		}
+	}
+
 	@Override
 	public ResultInfos<U> load(final int firstResult, final int maxResults, SortKey... orderBy) {
 		return loadDatas(null, null, false, firstResult, maxResults, orderBy);
@@ -177,7 +185,7 @@ public abstract class DefaultFlexiTableDataSourceModel<U> implements FlexiTableD
 
 		int correctedFirstResult = firstResult;
 		int correctMaxResults = maxResults;
-		
+
 		if(!force && rows.size() > 0) {
 			correctMaxResults = maxResults <= 0 ? rowCount : maxResults;
 			int maxRowsResults = maxResults <= 0 ? rows.size() : maxResults;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java
new file mode 100644
index 00000000000..d5d4e45d9a6
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/ExtendedFlexiTableSearchController.java
@@ -0,0 +1,36 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.gui.components.form.flexible.impl.elements.table;
+
+import java.util.List;
+
+import org.olat.core.gui.control.Controller;
+
+/**
+ * 
+ * Initial date: 03.05.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface ExtendedFlexiTableSearchController extends Controller {
+	
+	public List<String> getConditionalQueries();
+
+}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java
index 4d5f4df67d5..194b8e16fd7 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiDataTablesRenderer.java
@@ -79,7 +79,7 @@ class FlexiDataTablesRenderer extends AbstractFlexiTableRenderer implements Comp
       .append("		'bScrollInfinite': true,\n")
       .append("		'bScrollCollapse': true,\n")
       .append("		'bFilter': false,\n")
-      .append("		'sScrollY': '200px',\n")
+      .append("		'sScrollY': '1px',\n")
       .append("		'bProcessing': true,\n")
       .append("		'bServerSide': true,\n")
       .append("		'iDisplayLength': ").append(ftE.getPageSize()).append(",\n")
@@ -115,7 +115,17 @@ class FlexiDataTablesRenderer extends AbstractFlexiTableRenderer implements Comp
 			  	.append("', bSortable: ").append(col.isSortable()).append(" }\n");
 			}
 		}
-    target.append("		]\n")
+    target.append("		],\n")
+      .append("	  fnInitComplete: function (oSettings, json) {\n")
+      .append("     if(selectedIndex < 0) return;\n")
+      .append("     var scrollTo = 0;\n")
+      .append("     jQuery('#").append(id).append(" tbody tr').each(function(index, el) { ")
+      .append("	    	if(index < selectedIndex) {\n")
+      .append("         scrollTo += jQuery(el).outerHeight();\n")
+      .append("       }\n")
+      .append("	    });\n")
+      .append("     jQuery('#").append(id).append("').parent().scrollTop(scrollTo - 40);\n")
+      .append("	  }\n")
       .append("	});\n")
       //clic rows
       .append("	jQuery('#").append(id).append(" tbody').click(function(event, ui) {\n")
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java
index e570e68fa48..f7d129fbe00 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataSource.java
@@ -32,6 +32,10 @@ import org.olat.core.commons.persistence.SortKey;
  */
 public interface FlexiTableDataSource<U> extends FlexiTableDataModel<U> {
 	
+	/**
+	 * Remove all elements of the model
+	 */
+	public void clear();
 	
 	/**
 	 * Load the rows needed for paging
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
index 55dda2c90e0..e1244189002 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
@@ -74,12 +74,13 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 	private int currentPage;
 	private int currentFirstResult;
 	private int pageSize;
-	private boolean searchField;
+	private boolean searchEnabled;
 	private boolean selectAllEnabled;
 
 	private FormLink customButton;
-	private FormLink searchButton;
+	private FormLink searchButton, extendedSearchButton;
 	private TextElement searchFieldEl;
+	private ExtendedFlexiTableSearchController extendedSearchCtrl;
 	
 	private final FlexiTableDataModel<?> dataModel;
 	private FlexiTableDataSource<?> dataSource;
@@ -95,15 +96,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 	private Map<String,FormItem> components = new HashMap<String,FormItem>();
 	
 	public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, FlexiTableDataModel<?> tableModel) {
-		this(ureq, wControl, name, null, tableModel, -1, false);
+		this(ureq, wControl, name, null, tableModel, -1);
 	}
 	
 	public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, Translator translator, FlexiTableDataModel<?> tableModel) {
-		this(ureq, wControl, name, translator, tableModel, -1, false);
+		this(ureq, wControl, name, translator, tableModel, -1);
 	}
 	
 	public FlexiTableElementImpl(UserRequest ureq, WindowControl wControl, String name, Translator translator,
-			FlexiTableDataModel<?> tableModel, int pageSize, boolean searchField) {
+			FlexiTableDataModel<?> tableModel, int pageSize) {
 		super(name);
 		this.wControl = wControl;
 		this.dataModel = tableModel;
@@ -121,17 +122,6 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		mapperUrl = mapper.register(ureq.getUserSession(), new FlexiTableModelMapper(component));
 
 		String dispatchId = component.getDispatchID();
-		this.searchField = searchField;
-		if(searchField) {
-			searchFieldEl = new TextElementImpl(dispatchId + "_searchField", "search", "");
-			searchFieldEl.showLabel(false);
-			components.put("rSearch", searchFieldEl);
-			searchButton = new FormLinkImpl(dispatchId + "_searchButton", "rSearchButton", "search", Link.BUTTON);
-			searchButton.setTranslator(translator);
-			searchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button");
-			components.put("rSearchB", searchButton);
-		}
-		
 		customButton = new FormLinkImpl(dispatchId + "_customButton", "rCustomButton", "search", Link.BUTTON);
 		customButton.setTranslator(translator);
 		customButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only b_table_prefs");
@@ -168,7 +158,47 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 
 	@Override
 	public boolean isSearchEnabled() {
-		return searchField;
+		return searchEnabled;
+	}
+	
+	public void setSearchEnabled(boolean enable) {
+		this.searchEnabled = enable;
+		if(searchEnabled) {
+			String dispatchId = component.getDispatchID();
+			searchFieldEl = new TextElementImpl(dispatchId + "_searchField", "search", "");
+			searchFieldEl.showLabel(false);
+			components.put("rSearch", searchFieldEl);
+			searchButton = new FormLinkImpl(dispatchId + "_searchButton", "rSearchButton", "search", Link.BUTTON);
+			searchButton.setTranslator(translator);
+			searchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button");
+			components.put("rSearchB", searchButton);
+			rootFormAvailable(searchFieldEl);
+			rootFormAvailable(searchButton);
+		} else {
+			components.remove("rSearch");
+			components.remove("rSearchB");
+			searchFieldEl = null;
+			searchButton = null;
+		}
+	}
+	
+	public FormLink getExtendedSearchButton() {
+		return extendedSearchButton;
+	}
+	
+	@Override
+	public void setExtendedSearchCallout(ExtendedFlexiTableSearchController callout) {
+		extendedSearchCtrl = callout;
+		if(extendedSearchCtrl != null) {
+			extendedSearchCtrl.addControllerListener(this);
+			
+			String dispatchId = component.getDispatchID();
+			extendedSearchButton = new FormLinkImpl(dispatchId + "_extSearchButton", "rExtSearchButton", "extsearch", Link.BUTTON);
+			extendedSearchButton.setTranslator(translator);
+			//extendedSearchButton.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only o_fulltext_search_button");
+			components.put("rExtSearchB", extendedSearchButton);
+			rootFormAvailable(extendedSearchButton);
+		}
 	}
 	
 	@Override
@@ -287,6 +317,9 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		} else if(searchButton != null
 				&& searchButton.getFormDispatchId().equals(dispatchuri)) {
 			evalSearchRequest(ureq);
+		}  else if(extendedSearchButton != null
+				&& extendedSearchButton.getFormDispatchId().equals(dispatchuri)) {
+			openExtendedSearch(ureq);
 		} else if(dispatchuri != null && select != null && select.equals("checkall")) {
 			doSelectAll();
 		} else if(dispatchuri != null && select != null && select.equals("uncheckall")) {
@@ -313,6 +346,12 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 	public void dispatchEvent(UserRequest ureq, Controller source, Event event) {
 		if(source == callout) {
 			//System.out.println("dispatchEvent (Controller): " + source);
+		} else if(source == extendedSearchCtrl) {
+			if(event == Event.CANCELLED_EVENT) {
+				callout.deactivate();
+			} else if(event == Event.DONE_EVENT) {
+				evalExtendedSearch(ureq);
+			}
 		}
 	}
 	
@@ -324,6 +363,13 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 			callout.deactivate();
 		}
 	}
+	
+	protected void openExtendedSearch(UserRequest ureq) {
+		callout = new CloseableCalloutWindowController(ureq, wControl, extendedSearchCtrl.getInitialComponent(),
+				extendedSearchButton, "Search", true, "o_sel_flexi_search_callout");
+		callout.activate();
+		callout.addControllerListener(this);
+	}
 
 	protected void customizeCallout(UserRequest ureq) {
 		Choice choice = getColumnListAndTheirVisibility();
@@ -362,12 +408,22 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		return choice;
 	}
 
+	protected void evalExtendedSearch(UserRequest ureq) {
+		String search = null;
+		if(searchFieldEl != null) {
+			searchFieldEl.evalFormRequest(ureq);
+			search = searchFieldEl.getValue();
+		}
+		List<String> condQueries = extendedSearchCtrl.getConditionalQueries();
+		doSearch(ureq, search, condQueries);
+	}
+
 	protected void evalSearchRequest(UserRequest ureq) {
 		if(searchFieldEl == null) return;//this a default behavior which can occur without the search configured
 		searchFieldEl.evalFormRequest(ureq);
 		String search = searchFieldEl.getValue();
 		if(StringHelper.containsNonWhitespace(search)) {
-			doSearch(ureq, search);
+			doSearch(ureq, search, null);
 		} else {
 			doResetSearch(ureq);
 		}
@@ -395,16 +451,18 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		getRootForm().fireFormEvent(ureq, new SelectionEvent(action, index, this, FormEvent.ONCLICK));
 	}
 	
-	protected void doSearch(UserRequest ureq, String search) {
+	protected void doSearch(UserRequest ureq, String search, List<String> condQueries) {
 		if(dataSource != null) {
 			resetInternComponents();
-			dataSource.search(search, null, 0, getPageSize());
+			dataSource.clear();
+			dataSource.search(search, condQueries, 0, getPageSize());
 		}
 	}
 	
 	protected void doResetSearch(UserRequest ureq) {
 		if(dataSource != null) {
 			resetInternComponents();
+			dataSource.clear();
 			dataSource.load(0, getPageSize());
 		}
 	}
@@ -463,6 +521,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		if(searchFieldEl != null) searchFieldEl.validate(validationResults);
 		if(searchButton != null) searchButton.validate(validationResults);
 		if(customButton != null) customButton.validate(validationResults);
+		if(extendedSearchButton != null) extendedSearchButton.validate(validationResults);
 	}
 
 	@Override
@@ -497,6 +556,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		rootFormAvailable(searchFieldEl);
 		rootFormAvailable(searchButton);
 		rootFormAvailable(customButton);
+		rootFormAvailable(extendedSearchButton);
 	}
 	
 	private final void rootFormAvailable(FormItem item) {
diff --git a/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java b/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java
index dd81c03664e..56f232b0b34 100644
--- a/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java
+++ b/src/main/java/org/olat/core/gui/control/generic/modal/ButtonClickedEvent.java
@@ -57,7 +57,9 @@ import org.olat.core.gui.control.Event;
  * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com
  */
 public class ButtonClickedEvent extends Event {
-	int position;
+
+	private static final long serialVersionUID = -2308172939734041300L;
+	private int position;
 	
 	/**
 	 * Constructor
diff --git a/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java b/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java
index 1689977d0c6..f8e93dcba98 100644
--- a/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/modal/DialogBoxController.java
@@ -94,7 +94,7 @@ public class DialogBoxController extends BasicController {
 		// add content to velocity
 		dialogBoxVC.contextPut("text", text);
 		// add optional buttons to velocity
-		List buttons = new ArrayList();
+		List<String> buttons = new ArrayList<String>();
 		if (buttonLabels != null) {
 			for (int i = 0; i < buttonLabels.size(); i++) {
 				String buttonText = buttonLabels.get(i);
diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java
index 7bcf754f3db..ad4a04f03d5 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDocumentFactory.java
@@ -64,6 +64,9 @@ public class QuestionItemDocumentFactory {
 	@Autowired
 	private QPoolService qpoolService;
 
+	public String getResourceUrl(Long itemKey) {
+		return "[QuestionItem:" + itemKey + "]";
+	}
 
 	public Document createDocument(SearchResourceContext searchResourceContext, Long itemKey) {
 		QuestionItemFull item = questionItemDao.loadById(itemKey);
@@ -80,7 +83,7 @@ public class QuestionItemDocumentFactory {
 		oDocument.setLastChange(item.getLastModified());
 		oDocument.setTitle(item.getTitle());
 		oDocument.setDescription(item.getDescription());
-		oDocument.setResourceUrl("[QuestionItem:" + item.getKey() + "]");
+		oDocument.setResourceUrl(getResourceUrl(item.getKey()));
 		oDocument.setDocumentType(QItemDocument.TYPE);
 		oDocument.setCssIcon("o_qitem_icon");
 		oDocument.setParentContextType(searchResourceContext.getParentContextType());
@@ -173,7 +176,7 @@ public class QuestionItemDocumentFactory {
 		if(StringHelper.containsNonWhitespace(path)) {
 			for(StringTokenizer tokenizer = new StringTokenizer(path, "/"); tokenizer.hasMoreTokens(); ) {
 				String nextToken = tokenizer.nextToken();
-				document.add(new TextField(QItemDocument.STUDY_FIELD, nextToken, Field.Store.NO));
+				document.add(new TextField(QItemDocument.TAXONOMIC_PATH_FIELD, nextToken, Field.Store.NO));
 			}
 		}
 		return document;
diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java b/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java
index 2a695dc747f..ba841009d76 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QuestionPoolServiceImpl.java
@@ -38,7 +38,6 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.StringHelper;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
@@ -119,6 +118,10 @@ public class QuestionPoolServiceImpl implements QPoolService {
 		collectionDao.deleteItemFromCollections(items);
 		//TODO unmark
 		questionItemDao.delete(items);
+		
+		for(QuestionItemShort item:items) {
+			lifeIndexer.deleteDocument(QItemDocument.TYPE, item.getKey());
+		}
 	}
 
 	@Override
@@ -378,10 +381,13 @@ public class QuestionPoolServiceImpl implements QPoolService {
 	}
 
 	private ResultInfos<QuestionItemView> getItemsByPool(SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) {
-		if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) {
+		if(searchParams.isFulltextSearch()) {
 			try {
 				String queryString = searchParams.getSearchString();
 				List<String> condQueries = new ArrayList<String>();
+				if(searchParams.getCondQueries() != null) {
+					condQueries.addAll(searchParams.getCondQueries());
+				}
 				condQueries.add("pool:" + searchParams.getPoolKey());
 				List<Long> results = searchClient.doSearch(queryString, condQueries,
 						searchParams.getIdentity(), searchParams.getRoles(), firstResult, 10000, orderBy);
@@ -406,10 +412,13 @@ public class QuestionPoolServiceImpl implements QPoolService {
 
 	private ResultInfos<QuestionItemView> searchByAuthor(SearchQuestionItemParams searchParams, int firstResult, int maxResults, SortKey... orderBy) {
 		Identity author = searchParams.getAuthor();
-		if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) {
+		if(searchParams.isFulltextSearch()) {
 			try {
 				String queryString = searchParams.getSearchString();
 				List<String> condQueries = new ArrayList<String>();
+				if(searchParams.getCondQueries() != null) {
+					condQueries.addAll(searchParams.getCondQueries());
+				}
 				condQueries.add(QItemDocument.OWNER_FIELD + ":" + author.getKey());
 				List<Long> results = searchClient.doSearch(queryString, condQueries,
 						searchParams.getIdentity(), searchParams.getRoles(), firstResult, 10000, orderBy);
@@ -443,13 +452,16 @@ public class QuestionPoolServiceImpl implements QPoolService {
 	 */
 	private ResultInfos<QuestionItemView> searchFavorits(SearchQuestionItemParams searchParams,
 			int firstResult, int maxResults, SortKey... orderBy) {
-		if(StringHelper.containsNonWhitespace(searchParams.getSearchString())) {
+		if(searchParams.isFulltextSearch()) {
 			try {
 				//filter with all favorits
 				List<Long> favoritKeys = questionItemDao.getFavoritKeys(searchParams.getIdentity());
 
 				String queryString = searchParams.getSearchString();
 				List<String> condQueries = new ArrayList<String>();
+				if(searchParams.getCondQueries() != null) {
+					condQueries.addAll(searchParams.getCondQueries());
+				}
 				condQueries.add(getDbKeyConditionalQuery(favoritKeys));
 				List<Long> results = searchClient.doSearch(queryString, condQueries,
 						searchParams.getIdentity(), searchParams.getRoles(), firstResult, maxResults * 5, orderBy);
@@ -514,10 +526,13 @@ public class QuestionPoolServiceImpl implements QPoolService {
 	public ResultInfos<QuestionItemView> getSharedItemByResource(OLATResource resource, SearchQuestionItemParams searchParams,
 			int firstResult, int maxResults, SortKey... orderBy) {
 		
-		if(searchParams != null && StringHelper.containsNonWhitespace(searchParams.getSearchString())) {
+		if(searchParams != null && searchParams.isFulltextSearch()) {
 			try {
 				String queryString = searchParams.getSearchString();
 				List<String> condQueries = new ArrayList<String>();
+				if(searchParams.getCondQueries() != null) {
+					condQueries.addAll(searchParams.getCondQueries());
+				}
 				condQueries.add(QItemDocument.SHARE_FIELD + ":" + resource.getKey());
 				List<Long> results = searchClient.doSearch(queryString, condQueries,
 						searchParams.getIdentity(), searchParams.getRoles(), firstResult, maxResults * 5, orderBy);
@@ -590,12 +605,14 @@ public class QuestionPoolServiceImpl implements QPoolService {
 	public ResultInfos<QuestionItemView> getItemsOfCollection(QuestionItemCollection collection, SearchQuestionItemParams searchParams,
 			int firstResult, int maxResults, SortKey... orderBy) {
 		
-		if(searchParams != null && StringHelper.containsNonWhitespace(searchParams.getSearchString())) {
+		if(searchParams != null && searchParams.isFulltextSearch()) {
 			try {
 				List<Long> content = collectionDao.getItemKeysOfCollection(collection);
-
 				String queryString = searchParams.getSearchString();
 				List<String> condQueries = new ArrayList<String>();
+				if(searchParams.getCondQueries() != null) {
+					condQueries.addAll(searchParams.getCondQueries());
+				}
 				condQueries.add(getDbKeyConditionalQuery(content));
 				List<Long> results = searchClient.doSearch(queryString, condQueries, searchParams.getIdentity(), searchParams.getRoles(),
 						firstResult, maxResults * 5, orderBy);
@@ -716,8 +733,4 @@ public class QuestionPoolServiceImpl implements QPoolService {
 	public TaxonomyLevel updateTaxonomyLevel(String newField, TaxonomyLevel level) {
 		return taxonomyLevelDao.update(newField, level);
 	}
-	
-	
-	
-	
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/qpool/model/QItemDocument.java b/src/main/java/org/olat/modules/qpool/model/QItemDocument.java
index fd371b54c73..5ca10ac5227 100644
--- a/src/main/java/org/olat/modules/qpool/model/QItemDocument.java
+++ b/src/main/java/org/olat/modules/qpool/model/QItemDocument.java
@@ -35,7 +35,7 @@ public class QItemDocument extends OlatDocument {
 	public static final String OWNER_FIELD = "owner";
 	public static final String SHARE_FIELD = "share";
 	public static final String POOL_FIELD = "pool";
-	public static final String STUDY_FIELD = "field";
+	public static final String TAXONOMIC_PATH_FIELD = "taxonomy";
 	
 
 	public static final String IDENTIFIER_FIELD = "identifier";
diff --git a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java
index 815d305ded9..5da87f79a78 100644
--- a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java
+++ b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java
@@ -19,10 +19,13 @@
  */
 package org.olat.modules.qpool.model;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
+import org.olat.core.util.StringHelper;
 
 /**
  * 
@@ -36,6 +39,8 @@ public class SearchQuestionItemParams {
 	private Collection<Long> itemKeys;
 	private String format;
 	private String searchString;
+	private List<String> condQueries;
+	
 	private boolean favoritOnly;
 	private Identity author;
 	
@@ -86,6 +91,11 @@ public class SearchQuestionItemParams {
 	public void setAuthor(Identity author) {
 		this.author = author;
 	}
+	
+	public boolean isFulltextSearch() {
+		return StringHelper.containsNonWhitespace(searchString) ||
+				condQueries != null && condQueries.size() > 0;
+	}
 
 	public String getSearchString() {
 		return searchString;
@@ -95,6 +105,17 @@ public class SearchQuestionItemParams {
 		this.searchString = searchString;
 	}
 
+	public List<String> getCondQueries() {
+		if(condQueries == null) {
+			return new ArrayList<String>(1);
+		}
+		return new ArrayList<String>(condQueries);
+	}
+
+	public void setCondQueries(List<String> condQueries) {
+		this.condQueries = condQueries;
+	}
+
 	public Identity getIdentity() {
 		return identity;
 	}
@@ -109,6 +130,7 @@ public class SearchQuestionItemParams {
 		clone.poolKey = poolKey;
 		clone.format = format;
 		clone.searchString = searchString;
+		clone.condQueries = getCondQueries();
 		clone.favoritOnly = favoritOnly;
 		clone.author = author;
 		return clone;
diff --git a/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java b/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java
index 10f4f66d1a3..b817bd0b9df 100644
--- a/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/AbstractItemListController.java
@@ -61,6 +61,7 @@ import org.olat.modules.qpool.QuestionItemView;
 import org.olat.modules.qpool.ui.QuestionItemDataModel.Cols;
 import org.olat.modules.qpool.ui.events.QItemMarkedEvent;
 import org.olat.modules.qpool.ui.events.QItemViewEvent;
+import org.olat.modules.qpool.ui.metadata.ExtendedSearchController;
 
 /**
  * 
@@ -73,13 +74,15 @@ public abstract class AbstractItemListController extends FormBasicController
 	private FlexiTableElement itemsTable;
 	private QuestionItemDataModel model;
 	
+	private ExtendedSearchController extendedSearchCtrl;
+	
 	private final MarkManager markManager;
 	private final QPoolService qpoolService;
 	
 	private EventBus eventBus;
 	private QuestionItemsSource source;
 	
-	public AbstractItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) {
+	public AbstractItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) {
 		super(ureq, wControl, "item_list");
 
 		this.source = source;
@@ -89,6 +92,9 @@ public abstract class AbstractItemListController extends FormBasicController
 		eventBus = ureq.getUserSession().getSingleUserEventCenter();
 		eventBus.registerFor(this, getIdentity(), QuestionPoolMainEditorController.QITEM_MARKED);
 		
+		extendedSearchCtrl = new ExtendedSearchController(ureq, getWindowControl(), key);
+		listenTo(extendedSearchCtrl);
+		
 		initForm(ureq);
 	}
 
@@ -123,11 +129,15 @@ public abstract class AbstractItemListController extends FormBasicController
 		columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("details", translate("details"), "select-item"));
 		
 		model = new QuestionItemDataModel(columnsModel, this, getTranslator());
-		itemsTable = uifactory.addTableElement(ureq, getWindowControl(), "items", model, 50, true, getTranslator(), formLayout);
+		itemsTable = uifactory.addTableElement(ureq, getWindowControl(), "items", model, 50, getTranslator(), formLayout);
 		itemsTable.setSelectAllEnable(true);
 		itemsTable.setMultiSelect(true);
+		itemsTable.setSearchEnabled(true);
+		itemsTable.setExtendedSearchCallout(extendedSearchCtrl);
 		itemsTable.setRendererType(FlexiTableRendererType.dataTables);
 		
+
+		
 		initButtons(formLayout);
 	}
 	
@@ -195,7 +205,7 @@ public abstract class AbstractItemListController extends FormBasicController
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
-	
+
 	@Override
 	public void event(Event event) {
 		if(event instanceof QItemMarkedEvent) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java b/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java
index 9610edb3c00..b1ccc3fc2a6 100644
--- a/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/CollectionQuestionsController.java
@@ -56,7 +56,7 @@ public class CollectionQuestionsController extends QuestionsController {
 	private final QPoolService qpoolService;
 
 	public CollectionQuestionsController(UserRequest ureq, WindowControl wControl, CollectionOfItemsSource source) {
-		super(ureq, wControl, source);
+		super(ureq, wControl, source, "coll-" + source.getCollection().getKey());
 		this.collection = source.getCollection();
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java
index fbb0b09b312..0b594c3a87f 100644
--- a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java
@@ -43,7 +43,7 @@ public class ItemListController extends AbstractItemListController {
 	private FormLink selectLink;
 	
 	public ItemListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) {
-		super(ureq, wControl, source);
+		super(ureq, wControl, source, "select");
 		
 		initForm(ureq);
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/PoolsController.java b/src/main/java/org/olat/modules/qpool/ui/PoolsController.java
index 591907c0cd8..4d746b0704f 100644
--- a/src/main/java/org/olat/modules/qpool/ui/PoolsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/PoolsController.java
@@ -49,6 +49,7 @@ import org.olat.core.util.Util;
 import org.olat.modules.qpool.Pool;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.ui.events.QPoolSelectionEvent;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
index 8ffc3d3dc4b..e82950b52b8 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
@@ -52,6 +52,7 @@ import org.olat.modules.qpool.QuestionPoolModule;
 import org.olat.modules.qpool.manager.ExportQItemResource;
 import org.olat.modules.qpool.ui.events.QItemEvent;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
index 35b93710d2e..337017b7a8e 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java
@@ -53,10 +53,10 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemShort;
 import org.olat.modules.qpool.model.QItemList;
-import org.olat.modules.qpool.ui.edit.MetadataBulkChangeController;
 import org.olat.modules.qpool.ui.events.QItemEvent;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 import org.olat.modules.qpool.ui.events.QPoolSelectionEvent;
+import org.olat.modules.qpool.ui.metadata.MetadataBulkChangeController;
 import org.olat.modules.qpool.ui.wizard.Export_1_TypeStep;
 import org.olat.modules.qpool.ui.wizard.ImportAuthor_1_ChooseMemberStep;
 import org.olat.repository.RepositoryEntry;
@@ -99,8 +99,8 @@ public class QuestionListController extends AbstractItemListController implement
 	private final QPoolService qpoolService;
 	private final RepositoryManager repositoryManager;
 	
-	public QuestionListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) {
-		super(ureq, wControl, source);
+	public QuestionListController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) {
+		super(ureq, wControl, source, key);
 
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
 		repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java
index 5cc4458e787..a1ae9161a32 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java
@@ -349,7 +349,7 @@ public class QuestionPoolMainEditorController extends BasicController implements
 		source.getDefaultParams().setAuthor(getIdentity());
 		if(myQuestionsCtrl == null) {
 			WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("My"), null);
-			myQuestionsCtrl = new QuestionsController(ureq, swControl, source);
+			myQuestionsCtrl = new QuestionsController(ureq, swControl, source, "my");
 			myQuestionsCtrl.setStackedController(stackPanel);
 			listenTo(myQuestionsCtrl);
 		} else {
@@ -364,7 +364,7 @@ public class QuestionPoolMainEditorController extends BasicController implements
 		source.getDefaultParams().setFavoritOnly(true);
 		if(markedQuestionsCtrl == null) {
 			WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Marked"), null);
-			markedQuestionsCtrl = new QuestionsController(ureq, swControl, source);
+			markedQuestionsCtrl = new QuestionsController(ureq, swControl, source, "favorit");
 			markedQuestionsCtrl.setStackedController(stackPanel);
 			listenTo(markedQuestionsCtrl);
 		} else {
@@ -383,7 +383,7 @@ public class QuestionPoolMainEditorController extends BasicController implements
 		source.getDefaultParams().setPoolKey(pool.getKey());
 		if(selectedPoolCtrl == null) {
 			WindowControl swControl = addToHistory(ureq, pool, null);
-			selectedPoolCtrl = new QuestionsController(ureq, swControl, source);
+			selectedPoolCtrl = new QuestionsController(ureq, swControl, source, "poll-" + pool.getKey());
 			selectedPoolCtrl.setStackedController(stackPanel);
 			listenTo(selectedPoolCtrl);
 			cNode.setController(selectedPoolCtrl);
@@ -397,15 +397,16 @@ public class QuestionPoolMainEditorController extends BasicController implements
 	private void doSelectGroup(UserRequest ureq, BusinessGroup group, TreeNode node, List<ContextEntry> entries, StateEntry state) {
 		ControlledTreeNode cNode = (ControlledTreeNode)node;
 		QuestionsController sharedItemsCtrl = cNode.getController();
+		SharedItemsSource source = new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles());
 
 		if(sharedItemsCtrl == null) {
 			WindowControl swControl = addToHistory(ureq, group, null);
-			sharedItemsCtrl = new QuestionsController(ureq, swControl, new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles()));
+			sharedItemsCtrl = new QuestionsController(ureq, swControl, source, "share-" + group.getKey());
 			sharedItemsCtrl.setStackedController(stackPanel);
 			listenTo(sharedItemsCtrl);
 			cNode.setController(sharedItemsCtrl);
 		} else {
-			sharedItemsCtrl.updateSource(ureq, new SharedItemsSource(group, getIdentity(), ureq.getUserSession().getRoles()));
+			sharedItemsCtrl.updateSource(ureq, source);
 		}
 		currentCtrl = sharedItemsCtrl;
 		setContent(ureq, sharedItemsCtrl, entries, state);
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java
index 2b6e90bf07e..9518d096b0c 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java
@@ -68,13 +68,13 @@ public class QuestionsController extends BasicController implements Activateable
 	private final QPoolService qpoolService;
 	private QuestionItemsSource source;
 	
-	public QuestionsController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source) {
+	public QuestionsController(UserRequest ureq, WindowControl wControl, QuestionItemsSource source, String key) {
 		super(ureq, wControl);
 		
 		this.source = source;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
 
-		listCtrl = new QuestionListController(ureq, wControl, source);
+		listCtrl = new QuestionListController(ureq, wControl, source, key);
 		listenTo(listCtrl);
 		detailsCtrl = new QuestionItemSummaryController(ureq, wControl);
 		listenTo(detailsCtrl);
diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/items.html b/src/main/java/org/olat/modules/qpool/ui/_content/items.html
index ace95529640..a0752c58cd1 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_content/items.html
+++ b/src/main/java/org/olat/modules/qpool/ui/_content/items.html
@@ -24,6 +24,7 @@ jQuery(function() {
 	var headerHeight = jQuery('#b_header').height() + jQuery('#b_nav_main').height();
 	var footerHeight = jQuery('#b_footer').height() + jQuery('#qbuttons').height();
 	var maxHeight = winHeight - headerHeight - footerHeight - 50;
+	var panePadding = 130;
 
 	jQuery('#qpoolcontainer').width(width).height(maxHeight).layout({
 		north: { size: '50%' },
@@ -33,8 +34,8 @@ jQuery(function() {
 			jQuery('#$tableId').each(function(index, el) {
 				var table = jQuery(el).dataTable();
 				var oSettings = table.fnSettings();
-				oSettings.oScroll.sY = (paneHeight - 130) + "px";
-				table.fnDraw();
+				oSettings.oScroll.sY = (paneHeight - panePadding) + "px";
+				jQuery('div.dataTables_scrollBody', jQuery('#qitems')).height(paneHeight - panePadding);
 			});
 		},
 		west: { size: '50%' },
@@ -45,8 +46,8 @@ jQuery(function() {
 		var paneHeight = jQuery('#qitems').height();
 		var table = jQuery(el).dataTable();
 		var oSettings = table.fnSettings();
-		oSettings.oScroll.sY = (paneHeight - 130) + "px";
-		table.fnDraw();
+		oSettings.oScroll.sY = (paneHeight - panePadding) + "px";
+		jQuery('div.dataTables_scrollBody', jQuery('#qitems')).height(paneHeight - panePadding);
 	});
 });
 </script>
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
index 43330760116..09ed7e5a57b 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
@@ -2,6 +2,8 @@
 create.list=Liste erstellen
 create.test=Test erstellen
 add.to.list=Zur Liste hinzufügen
+add=+
+remove=-
 topnav.qpool=Q-Pool
 topnav.qpool.alt=Question pools
 create.collection.description=Geben Sie eine Name zu Ihre Liste.
@@ -17,7 +19,7 @@ details=Detailansicht
 rename.collection=Liste rename
 next=Next
 previous=Previous
-confirm.delete=Wollen Sie wirklich diese Frage löschen?
+confirm.delete=Wollen Sie wirklich diese Frage löschen? Sie wird von allen Gruppen, alle Pools und alle Liste gelöscht.
 confirm.delete.source=Wollen Sie wirklich diese Liste löschen?
 confirm.unshare=Wollen Sie wirklich diese Frage von "{0}" entfernen?
 menu.admin=Administration
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java
index 8bb6332552f..0915c248226 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolEditController.java
@@ -33,7 +33,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.Pool;
 import org.olat.modules.qpool.QPoolService;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
index 9e947484573..0ac311a58b9 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
@@ -56,8 +56,8 @@ import org.olat.core.util.Util;
 import org.olat.modules.qpool.Pool;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.PoolImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java
index 6aeb31d67cd..8059bddc61b 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextEditController.java
@@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QEducationalContext;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
index c0be45ad68a..6d412f3feaa 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
@@ -58,7 +58,7 @@ import org.olat.core.util.i18n.ui.TranslationToolI18nItemEditCrumbController;
 import org.olat.core.util.prefs.Preferences;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QEducationalContext;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java
index 81c60369ea1..f63d207493f 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypeEditController.java
@@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QItemType;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
index 8d4d6dcce3b..0b019e423cd 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
@@ -58,7 +58,7 @@ import org.olat.core.util.i18n.ui.TranslationToolI18nItemEditCrumbController;
 import org.olat.core.util.prefs.Preferences;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QItemType;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java
index f7113724866..db36527e496 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QLicenseEditController.java
@@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QLicense;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
index 87aa6d1cab4..16e3e1d879a 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
@@ -51,7 +51,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.QLicense;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java
index 852c7c5aa55..c12bde17aa2 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyAdminController.java
@@ -35,7 +35,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
 import org.olat.core.util.Util;
 import org.olat.core.util.tree.TreeHelper;
 import org.olat.modules.qpool.TaxonomyLevel;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java
index 8215c4f5c12..da0a4ee0de0 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelController.java
@@ -34,7 +34,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.TaxonomyLevel;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java
index e4b8ae53cb3..5168c346b4d 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/TaxonomyLevelEditController.java
@@ -32,7 +32,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.TaxonomyLevel;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java
index feb3b5e4a82..a0238a783c4 100644
--- a/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java
+++ b/src/main/java/org/olat/modules/qpool/ui/datasource/CollectionOfItemsSource.java
@@ -98,6 +98,7 @@ public class CollectionOfItemsSource implements QuestionItemsSource {
 	public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) {
 		SearchQuestionItemParams params = new SearchQuestionItemParams(identity, roles);
 		params.setSearchString(query);
+		params.setCondQueries(condQueries);
 		return qpoolService.getItemsOfCollection(collection, params, firstResult, maxResults, orderBy);
 	}
 }
diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java
index 49c3469e3cd..67dfd00bde4 100644
--- a/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java
+++ b/src/main/java/org/olat/modules/qpool/ui/datasource/DefaultItemsSource.java
@@ -103,6 +103,7 @@ public class DefaultItemsSource implements QuestionItemsSource {
 	public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) {
 		SearchQuestionItemParams params = defaultParams.clone();
 		params.setSearchString(query);
+		params.setCondQueries(condQueries);
 		return doSearch(params, firstResult, maxResults, orderBy);
 	}
 	
diff --git a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
index ae02fb3b977..16ebb755dec 100644
--- a/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
+++ b/src/main/java/org/olat/modules/qpool/ui/datasource/SharedItemsSource.java
@@ -97,6 +97,7 @@ public class SharedItemsSource implements QuestionItemsSource {
 	public ResultInfos<QuestionItemView> getItems(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) {
 		SearchQuestionItemParams params = new SearchQuestionItemParams(identity, roles);
 		params.setSearchString(query);
+		params.setCondQueries(condQueries);
 		return qpoolService.getSharedItemByResource(resource, params, firstResult, maxResults, orderBy);
 	}
 }
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java b/src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java
similarity index 96%
rename from src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java
rename to src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java
index 6d7d8d121c1..7f88f222c62 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/QItemEdited.java
+++ b/src/main/java/org/olat/modules/qpool/ui/events/QItemEdited.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.events;
 
 import org.olat.core.gui.control.Event;
 import org.olat.modules.qpool.QuestionItem;
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java
similarity index 95%
rename from src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java
index b0dba9f74a3..e4b2034f855 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -35,7 +35,7 @@ import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.manager.MetadataConverterHelper;
 import org.olat.modules.qpool.model.LOMDuration;
 import org.olat.modules.qpool.model.QEducationalContext;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -53,7 +53,7 @@ public class EducationalMetadataController extends FormBasicController {
 
 	public EducationalMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		this.edit = edit;
 		initForm(ureq);
 		setItem(item);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java
similarity index 95%
rename from src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java
index 382475be941..9baa930e0eb 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/EducationalMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/EducationalMetadataEditController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import java.util.List;
 
@@ -38,7 +38,8 @@ import org.olat.modules.qpool.manager.MetadataConverterHelper;
 import org.olat.modules.qpool.model.LOMDuration;
 import org.olat.modules.qpool.model.QEducationalContext;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
 
 /**
  * 
@@ -57,7 +58,7 @@ public class EducationalMetadataEditController extends FormBasicController {
 
 	public EducationalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java
new file mode 100644
index 00000000000..7c69474af60
--- /dev/null
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java
@@ -0,0 +1,538 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.qpool.ui.metadata;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItem;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.FormLink;
+import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
+import org.olat.core.gui.components.form.flexible.elements.TextElement;
+import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.FormEvent;
+import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.ExtendedFlexiTableSearchController;
+import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.tree.GenericTreeNode;
+import org.olat.core.gui.components.tree.TreeNode;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.util.CodeHelper;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
+import org.olat.modules.qpool.QPoolService;
+import org.olat.modules.qpool.TaxonomyLevel;
+import org.olat.modules.qpool.model.QItemDocument;
+import org.olat.modules.qpool.model.QLicense;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel;
+import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues;
+import org.olat.search.model.AbstractOlatDocument;
+
+/**
+ * 
+ * Initial date: 03.05.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ExtendedSearchController extends FormBasicController implements ExtendedFlexiTableSearchController {
+	
+	private FormLink searchButton;
+	
+	private final SearchAttributes searchAttributes = new SearchAttributes();
+	private final List<ConditionalQuery> uiQueries = new ArrayList<ConditionalQuery>();
+	private final List<String> condQueries = new ArrayList<String>();
+	
+	private final String prefsKey;
+	private ExtendedSearchPrefs prefs;
+	
+	private final QPoolService qpoolService;
+
+	public ExtendedSearchController(UserRequest ureq, WindowControl wControl, String prefsKey) {
+		super(ureq, wControl, "extended_search");
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
+		
+		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
+
+		
+		
+		this.prefsKey = prefsKey;
+		prefs = (ExtendedSearchPrefs) ureq.getUserSession().getGuiPreferences()
+				.get(ExtendedFlexiTableSearchController.class, prefsKey);
+		
+		if(prefs != null && prefs.getCondQueries().size() > 0) {
+			for(ExtendedSearchPref pref:prefs.getCondQueries()) {
+				uiQueries.add(new ConditionalQuery(pref));
+			}
+
+		} else {
+			uiQueries.add(new ConditionalQuery());
+		}
+		
+		
+		initForm(ureq);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		if(formLayout instanceof FormLayoutContainer) {
+			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
+			layoutCont.contextPut("uiQueries", uiQueries);
+		}
+		
+		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
+		buttonsCont.setRootForm(mainForm);
+		formLayout.add(buttonsCont);
+		searchButton = uifactory.addFormLink("search", buttonsCont, Link.BUTTON);
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		doSearch(ureq);
+	}
+
+	@Override
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
+		if(source == searchButton) {
+			doSearch(ureq);
+		} else if (source instanceof SingleSelection) {
+			SingleSelection attrEl = (SingleSelection)source;
+			if(attrEl.isOneSelected()) {
+				ConditionalQuery query = (ConditionalQuery)attrEl.getUserObject();
+				query.selectAttributeType(attrEl.getSelectedKey(), null);
+			}
+		} else if(source instanceof FormLink) {
+			FormLink button = (FormLink)source;
+			ConditionalQuery query = (ConditionalQuery)button.getUserObject();
+			if(button.getCmd().startsWith("add")) {
+				addParameter(ureq, query);
+			} else if(button.getCmd().startsWith("remove")) {
+				removeParameter(ureq, query);
+			}
+		}
+		super.formInnerEvent(ureq, source, event);
+	}
+	
+	private void addParameter(UserRequest ureq, ConditionalQuery query) {
+		int index = uiQueries.indexOf(query);
+		ConditionalQuery newQuery = new ConditionalQuery();
+		if(index < 0 || (index + 1) > uiQueries.size()) {
+			uiQueries.add(newQuery);
+		} else {
+			uiQueries.add(index+1, newQuery);
+		}
+	}
+	
+	private void removeParameter(UserRequest ureq, ConditionalQuery query) {
+		if(uiQueries.size() > 1 && uiQueries.remove(query)) {
+			flc.setDirty(true);
+		}
+	}
+	
+	private void doSearch(UserRequest ureq) {
+		condQueries.clear();
+		
+		List<ExtendedSearchPref> params = new ArrayList<ExtendedSearchPref>();
+		for(ConditionalQuery uiQuery:uiQueries) {
+			String query = uiQuery.getQuery();
+			if(StringHelper.containsNonWhitespace(query)) {
+				condQueries.add(query);
+				
+				params.add(new ExtendedSearchPref(uiQuery.getAttribute(), uiQuery.getValue()));
+			}
+		}
+		
+		if (prefs == null){
+			prefs = new ExtendedSearchPrefs();
+		}
+		prefs.setCondQueries(params);
+		ureq.getUserSession().getGuiPreferences().putAndSave(ExtendedFlexiTableSearchController.class, prefsKey, prefs);
+		fireEvent(ureq, Event.DONE_EVENT);
+	}
+
+	/**
+	 * Append 'AND' operation if buf is not empty.
+	 * @param buf
+	 */
+	private String append(String... strings) {
+		StringBuilder query = new StringBuilder();
+		for(String string:strings) {
+			query.append(string);
+		}
+		return query.toString();
+	}
+	
+	@Override
+	public List<String> getConditionalQueries() {
+		return condQueries;
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+	
+	public class ConditionalQuery {
+		
+		private SingleSelection attributeChoice;
+		private FormItem parameter;
+		private QueryParameterFactory parameterFactory;
+		private FormLink addButton;
+		private FormLink removeButton;
+
+		public ConditionalQuery() {
+			this(null);
+		}
+		
+		public ConditionalQuery(ExtendedSearchPref pref) {
+			long id = CodeHelper.getRAMUniqueID();
+
+			String[] attrKeys = searchAttributes.getKeys();
+			String[] attrValues = new String[attrKeys.length];
+			for(int i=attrValues.length; i-->0; ) {
+				attrValues[i] = translate(attrKeys[i]);
+			}
+
+			attributeChoice = uifactory.addDropdownSingleselect("attr-" + id, flc, attrKeys, attrValues, null);
+			attributeChoice.select(attrKeys[0], true);
+			if(pref == null) {
+				selectAttributeType(attrKeys[0], null);
+			} else {
+				selectAttributeType(pref.getAttribute(), pref.getValue());
+			}
+			attributeChoice.addActionListener(ExtendedSearchController.this, FormEvent.ONCHANGE);
+			attributeChoice.setUserObject(this);
+			flc.add(attributeChoice.getName(), attributeChoice);
+			addButton = uifactory.addFormLink("add-" + id, "add", null, flc, Link.BUTTON);
+			addButton.setUserObject(this);
+			flc.add(addButton.getComponent().getComponentName(), addButton);
+			removeButton = uifactory.addFormLink("remove-"+ id, "remove", null, flc, Link.BUTTON);
+			removeButton.setUserObject(this);
+			flc.add(removeButton.getComponent().getComponentName(), removeButton);
+		}
+		
+		public String getAttribute() {
+			return attributeChoice.isOneSelected() ? attributeChoice.getSelectedKey() : null;
+		}
+		
+		public String getValue() {
+			return "test";
+		}
+		
+		public SingleSelection getAttributChoice() {
+			return attributeChoice;
+		}
+		
+		public FormItem getParameterItem() {
+			return parameter;
+		}
+		
+		public FormLink getAddButton() {
+			return addButton;
+		}
+
+		public FormLink getRemoveButton() {
+			return removeButton;
+		}
+
+		public void selectAttributeType(String type, String value) {
+			parameterFactory = searchAttributes.getQueryParameterFactory(type);
+			if(parameterFactory != null) {
+				parameter = parameterFactory.createItem(value);
+			}
+		}
+		
+		public String getQuery() {
+			if(parameterFactory != null && parameter != null) {
+				return parameterFactory.getQuery(parameter);
+			}
+			return null;
+		}
+	}
+
+	public static interface QueryParameterFactory {
+		public String getValue(FormItem item);
+		
+		public FormItem createItem(String startValue);
+		
+		public String getQuery(FormItem item);
+	}
+	
+	private class SearchAttributes {
+		private List<SearchAttribute> attributes = new ArrayList<SearchAttribute>();
+		
+		public SearchAttributes() {
+			//general
+			attributes.add(new SearchAttribute("general.title", new StringQueryParameter(AbstractOlatDocument.TITLE_FIELD_NAME)));
+			attributes.add(new SearchAttribute("general.keywords", new StringQueryParameter(QItemDocument.KEYWORDS_FIELD)));
+			attributes.add(new SearchAttribute("general.coverage", new StringQueryParameter(QItemDocument.COVERAGE_FIELD)));
+			attributes.add(new SearchAttribute("general.additional.informations", new StringQueryParameter(QItemDocument.ADD_INFOS_FIELD)));
+			attributes.add(new SearchAttribute("general.language", new StringQueryParameter(QItemDocument.LANGUAGE_FIELD)));
+			attributes.add(new SearchAttribute("classification.taxonomic.path", new TaxonomicPathQueryParameter()));
+			//educational
+			attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter()));
+			//question
+			attributes.add(new SearchAttribute("question.type", new TypeQueryParameter()));
+			attributes.add(new SearchAttribute("question.assessmentType", new AssessmentQueryParameter()));
+			//lifecycle
+			attributes.add(new SearchAttribute("lifecycle.status", new StatusQueryParameter()));
+			//technical
+			attributes.add(new SearchAttribute("technical.editor", new StringQueryParameter(QItemDocument.EDITOR_FIELD)));
+			attributes.add(new SearchAttribute("technical.format", new FormatQueryParameter()));
+			//rights
+			attributes.add(new SearchAttribute("rights.copyright", new LicenseQueryParameter()));	
+		}
+		
+		public QueryParameterFactory getQueryParameterFactory(String type) {
+			for(SearchAttribute attribute:attributes) {
+				if(type.equals(attribute.getI18nKey())) {
+					return attribute.getFactory();
+				}
+			}
+			return null;
+		}
+		
+		public String[] getKeys() {
+			String[] keys = new String[attributes.size()];
+			for(int i=keys.length; i-->0; ) {
+				keys[i] = attributes.get(i).getI18nKey();
+			}
+			return keys;
+		}
+	}
+	
+	public class StringQueryParameter implements QueryParameterFactory {
+		private final String docAttribute;
+		
+		public StringQueryParameter(String docAttribute) {
+			this.docAttribute = docAttribute;
+		}
+
+		@Override
+		public String getValue(FormItem item) {
+			if(item instanceof TextElement) {
+				return ((TextElement)item).getValue();
+			}
+			return null;
+		}
+
+		@Override
+		public FormItem createItem(String startValue) {
+			return uifactory.addTextElement("type-" + CodeHelper.getRAMUniqueID(), null, 50, startValue, flc);
+		}
+
+		@Override
+		public String getQuery(FormItem item) {
+			String val = getValue(item);
+			if(StringHelper.containsNonWhitespace(val)) {
+				return append(docAttribute, ":(", val, ") ");
+			}
+			return null;
+		}
+	}
+	
+	public class TaxonomicPathQueryParameter extends SingleChoiceQueryParameter {
+		
+		public TaxonomicPathQueryParameter() {
+			super(QItemDocument.TAXONOMIC_PATH_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			TaxonomyTreeModel treeModel = new TaxonomyTreeModel();
+			List<String> keys = new ArrayList<String>();
+			List<String> values = new ArrayList<String>();
+			flatTree(treeModel.getRootNode(), "", keys, values);
+
+			String[] keysArr = keys.toArray(new String[keys.size()]);
+			String[] valuesArr = values.toArray(new String[values.size()]);
+			return createItem(keysArr, valuesArr, startValue);
+		}
+		
+		private void flatTree(TreeNode node, String path, List<String> keys, List<String> values) {
+			for(int i=0; i<node.getChildCount(); i++) {
+				INode child = node.getChildAt(i);
+				if(child instanceof GenericTreeNode) {
+					GenericTreeNode gChild = (GenericTreeNode)child;
+					TaxonomyLevel level = (TaxonomyLevel)gChild.getUserObject();
+					String field = level.getField();
+					keys.add(field);
+					values.add(path + "" + field);
+					flatTree(gChild, path + "\u00A0\u00A0\u00A0\u00A0", keys, values);
+				}
+			}
+		}
+	}
+	
+	public class LicenseQueryParameter extends SingleChoiceQueryParameter {
+		
+		public LicenseQueryParameter() {
+			super(QItemDocument.COPYRIGHT_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			List<QLicense> allLicenses = qpoolService.getAllLicenses();
+			List<QLicense> licenses = new ArrayList<QLicense>(allLicenses);
+			for(Iterator<QLicense> it=licenses.iterator(); it.hasNext(); ) {
+				String key = it.next().getLicenseKey();
+				if(key != null && key.startsWith("perso-")) {
+					it.remove();
+				}
+			}
+
+			String[] keys = new String[licenses.size()];
+			int count = 0;
+			for(QLicense license:licenses) {
+				keys[count++] = license.getLicenseKey();
+			}
+			return createItem(keys, keys, startValue);
+		}
+	}
+	
+	public class TypeQueryParameter extends SingleChoiceQueryParameter {
+		
+		public TypeQueryParameter() {
+			super(QItemDocument.ITEM_TYPE_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			KeyValues types = MetaUIFactory.getQItemTypeKeyValues(getTranslator(), qpoolService);
+			return createItem(types.getKeys(), types.getValues(), startValue);
+		}
+	}
+	
+	public class FormatQueryParameter extends SingleChoiceQueryParameter {
+		
+		public FormatQueryParameter() {
+			super(QItemDocument.FORMAT_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			KeyValues formats = MetaUIFactory.getFormats();
+			return createItem(formats.getKeys(), formats.getValues(), startValue);
+		}
+	}
+	
+	public class ContextQueryParameter extends SingleChoiceQueryParameter {
+		
+		public ContextQueryParameter() {
+			super(QItemDocument.EDU_CONTEXT_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			KeyValues contexts = MetaUIFactory.getContextKeyValues(getTranslator(), qpoolService);
+			return createItem(contexts.getKeys(), contexts.getValues(), startValue);
+		}
+	}
+	
+	public class AssessmentQueryParameter extends SingleChoiceQueryParameter {
+		
+		public AssessmentQueryParameter() {
+			super(QItemDocument.ASSESSMENT_TYPE_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			KeyValues types = MetaUIFactory.getAssessmentTypes(getTranslator());
+			return createItem(types.getKeys(), types.getValues(), startValue);
+		}
+	}
+	
+	public class StatusQueryParameter extends SingleChoiceQueryParameter {
+		public StatusQueryParameter() {
+			super(QItemDocument.ITEM_STATUS_FIELD);
+		}
+		
+		@Override
+		public FormItem createItem(String startValue) {
+			KeyValues types = MetaUIFactory.getStatus(getTranslator());
+			return createItem(types.getKeys(), types.getValues(), startValue);
+		}
+	}
+	
+	public abstract class SingleChoiceQueryParameter implements QueryParameterFactory {
+		private final String docAttribute;
+		
+		public SingleChoiceQueryParameter(String docAttribute) {
+			this.docAttribute = docAttribute;
+		}
+
+		@Override
+		public String getValue(FormItem item) {
+			if(item instanceof SingleSelection && ((SingleSelection)item).isOneSelected()) {
+				return ((SingleSelection)item).getSelectedKey();
+			}
+			return null;
+		}
+
+		protected FormItem createItem(String[] keys, String[] values, String startValue) {
+			SingleSelection choice = uifactory.addDropdownSingleselect(docAttribute + "-" + CodeHelper.getRAMUniqueID(),  flc,
+					keys, values, null);
+			
+			if(startValue != null) {
+				for(String key:keys) {
+					if(key.equals(startValue)) {
+						choice.select(key, true);
+						
+					}
+				}	
+			}
+			return choice;
+		}
+		
+		@Override
+		public String getQuery(FormItem item) {
+			String val = getValue(item);
+			if(StringHelper.containsNonWhitespace(val)) {
+				return append(docAttribute, ":(", val, ") ");	
+			}
+			return null;
+		}
+	}
+	
+	private static class SearchAttribute {
+		private final String i18nKey;
+		private final QueryParameterFactory factory;
+		
+		public SearchAttribute(String i18nKey, QueryParameterFactory factory) {
+			this.i18nKey = i18nKey;
+			this.factory = factory;
+		}
+
+		public String getI18nKey() {
+			return i18nKey;
+		}
+
+		public QueryParameterFactory getFactory() {
+			return factory;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java
new file mode 100644
index 00000000000..48c89589da9
--- /dev/null
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPref.java
@@ -0,0 +1,62 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.qpool.ui.metadata;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * Initial date: 03.05.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ExtendedSearchPref implements Serializable {
+
+	private static final long serialVersionUID = -5102715838988265773L;
+	private String attribute;
+	private String value;
+	
+	public ExtendedSearchPref() {
+		//
+	}
+
+	public ExtendedSearchPref(String attribute, String value) {
+		this.attribute = attribute;
+		this.value = value;
+	}
+
+	public String getAttribute() {
+		return attribute;
+	}
+
+	public void setAttribute(String attribute) {
+		this.attribute = attribute;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	
+}
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java
new file mode 100644
index 00000000000..9e2ab20ec28
--- /dev/null
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchPrefs.java
@@ -0,0 +1,44 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.qpool.ui.metadata;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 
+ * Initial date: 03.05.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ExtendedSearchPrefs implements Serializable {
+
+	private static final long serialVersionUID = -1531232270649506181L;
+	private List<ExtendedSearchPref> condQueries = new ArrayList<ExtendedSearchPref>();
+
+	public List<ExtendedSearchPref> getCondQueries() {
+		return condQueries;
+	}
+
+	public void setCondQueries(List<ExtendedSearchPref> condQueries) {
+		this.condQueries = condQueries;
+	}
+}
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java
similarity index 95%
rename from src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java
index c46a542847a..d910978efbb 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -32,7 +32,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QuestionItem;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -50,7 +50,7 @@ public class GeneralMetadataController extends FormBasicController {
 	
 	public GeneralMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		this.edit = edit;
 		initForm(ureq);
 		setItem(item);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
similarity index 96%
rename from src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
index 1a86d041e1a..94470fd99d6 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/GeneralMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
@@ -17,10 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
-
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic;
+package org.olat.modules.qpool.ui.metadata;
 
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
@@ -49,8 +48,9 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.TaxonomyLevel;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel;
+import org.olat.modules.qpool.ui.events.QItemEdited;
 /**
  * 
  * Initial date: 05.03.2013<br>
@@ -74,7 +74,7 @@ public class GeneralMetadataEditController extends FormBasicController {
 	
 	public GeneralMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java
similarity index 94%
rename from src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java
index ff9c118a7dd..98539b43089 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -33,7 +33,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionStatus;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -51,7 +51,7 @@ public class LifecycleMetadataController extends FormBasicController  {
 	
 	public LifecycleMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.edit = edit;
 		initForm(ureq);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java
similarity index 90%
rename from src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java
index 2253334cfa1..3526c72082f 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/LifecycleMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/LifecycleMetadataEditController.java
@@ -17,10 +17,10 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
@@ -37,7 +37,8 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionStatus;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
 
 /**
  * 
@@ -55,7 +56,7 @@ public class LifecycleMetadataEditController extends FormBasicController {
 
 	public LifecycleMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java
similarity index 65%
rename from src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java
index bedd431fe67..634060c3631 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/MetaUIFactory.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetaUIFactory.java
@@ -1,4 +1,23 @@
-package org.olat.modules.qpool.ui.edit;
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.qpool.ui.metadata;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -9,7 +28,10 @@ import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.StringHelper;
+import org.olat.ims.qti.QTIConstants;
 import org.olat.modules.qpool.QPoolService;
+import org.olat.modules.qpool.QuestionStatus;
+import org.olat.modules.qpool.model.QEducationalContext;
 import org.olat.modules.qpool.model.QItemType;
 import org.olat.modules.qpool.model.QLicense;
 
@@ -21,6 +43,47 @@ import org.olat.modules.qpool.model.QLicense;
  */
 public class MetaUIFactory {
 	
+	protected static KeyValues getFormats() {
+		String[] formatKeys = new String[]{ QTIConstants.QTI_12_FORMAT };
+		
+		return new KeyValues(formatKeys, formatKeys);
+	}
+
+	protected static KeyValues getAssessmentTypes(Translator translator) {
+		String[] assessmentTypeKeys = new String[]{ "summative", "formative", "both"};
+		String[] assessmentTypeValues = new String[]{
+				translator.translate("question.assessmentType.summative"),
+				translator.translate("question.assessmentType.formative"),
+				translator.translate("question.assessmentType.both"),	
+		};
+		return new KeyValues(assessmentTypeKeys, assessmentTypeValues);
+	}
+	
+	protected static KeyValues getStatus(Translator translator) {
+		String[] statusTypeKeys = QuestionStatus.valueString();
+		String[] statusTypeValues = new String[statusTypeKeys.length];
+		for(int i=statusTypeKeys.length; i-->0; ) {
+			statusTypeValues[i] = translator.translate("lifecycle.status." + statusTypeKeys[i]);
+		}
+		return new KeyValues(statusTypeKeys, statusTypeValues);
+	}
+	
+	protected static KeyValues getContextKeyValues(Translator translator, QPoolService qpoolService) {
+		List<QEducationalContext> levels = qpoolService.getAllEducationlContexts();
+		String[] contextKeys = new String[ levels.size() ];
+		String[] contextValues = new String[ levels.size() ];
+		int count = 0;
+		for(QEducationalContext level:levels) {
+			contextKeys[count] = level.getLevel();
+			String translation = translator.translate("item.level." + level.getLevel().toLowerCase());
+			if(translation.length() > 128) {
+				translation = level.getLevel();
+			}
+			contextValues[count++] = translation;
+		}
+		return new KeyValues(contextKeys, contextValues);
+	}
+	
 	protected static KeyValues getQLicenseKeyValues(QPoolService qpoolService) {
 		List<QLicense> allLicenses = qpoolService.getAllLicenses();
 		List<QLicense> licenses = new ArrayList<QLicense>(allLicenses);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
similarity index 90%
rename from src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
index 1b990bb7f16..6f11b8d954d 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/MetadataBulkChangeController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
@@ -17,16 +17,16 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.getQItemTypeKeyValues;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.getQLicenseKeyValues;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.toBigDecimal;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.toInt;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateBigDecimal;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateRights;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQItemTypeKeyValues;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQLicenseKeyValues;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toBigDecimal;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toInt;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateBigDecimal;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateRights;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -56,18 +56,16 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.util.Util;
-import org.olat.ims.qti.QTIConstants;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemShort;
-import org.olat.modules.qpool.QuestionStatus;
 import org.olat.modules.qpool.TaxonomyLevel;
 import org.olat.modules.qpool.manager.MetadataConverterHelper;
 import org.olat.modules.qpool.model.QEducationalContext;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.admin.TaxonomyTreeModel;
-import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues;
+import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues;
 
 /**
  * 
@@ -115,7 +113,7 @@ public class MetadataBulkChangeController extends FormBasicController {
 	
 	public MetadataBulkChangeController(UserRequest ureq, WindowControl wControl, List<QuestionItemShort> items) {
 		super(ureq, wControl, "bulk_change");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.items = items;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
@@ -193,19 +191,9 @@ public class MetadataBulkChangeController extends FormBasicController {
 		learningTimeSecondElement = uifactory.addIntegerElement("learningTime.second", "", 0, learningTimeContainer);
 		learningTimeSecondElement.setDisplaySize(3);
 
-		List<QEducationalContext> levels = qpoolService.getAllEducationlContexts();
-		String[] contextKeys = new String[ levels.size() ];
-		String[] contextValues = new String[ levels.size() ];
-		int count = 0;
-		for(QEducationalContext level:levels) {
-			contextKeys[count] = level.getLevel();
-			String translation = translate("item.level." + level.getLevel().toLowerCase());
-			if(translation.length() > 128) {
-				translation = level.getLevel();
-			}
-			contextValues[count++] = translation;
-		}
-		contextEl = uifactory.addDropdownSingleselect("educational.context", "educational.context", eduCont, contextKeys, contextValues, null);
+		KeyValues contexts = MetaUIFactory.getContextKeyValues(getTranslator(), qpoolService);
+		contextEl = uifactory.addDropdownSingleselect("educational.context", "educational.context", eduCont,
+				contexts.getKeys(), contexts.getValues(), null);
 		decorate(contextEl, eduCont, listener);
 	}
 	
@@ -237,13 +225,9 @@ public class MetadataBulkChangeController extends FormBasicController {
 		numAnswerAltEl.setDisplaySize(4);
 		decorate(numAnswerAltEl, questionCont, listener);
 		
-		String[] assessmentTypeKeys = new String[]{ "summative", "formative", "both"};
-		String[] assessmentTypeValues = new String[]{
-			translate("question.assessmentType.summative"), translate("question.assessmentType.formative"),
-			translate("question.assessmentType.both"),	
-		};
+		KeyValues types = MetaUIFactory.getAssessmentTypes(getTranslator());
 		assessmentTypeEl = uifactory.addDropdownSingleselect("question.assessmentType", "question.assessmentType", questionCont,
-				assessmentTypeKeys, assessmentTypeValues, null);
+				types.getKeys(), types.getValues(), null);
 		decorate(assessmentTypeEl, questionCont, listener);
 	}
 	
@@ -255,13 +239,9 @@ public class MetadataBulkChangeController extends FormBasicController {
 		versionEl = uifactory.addTextElement("lifecycle.version", "lifecycle.version", 50, null, lifecycleCont);
 		decorate(versionEl, lifecycleCont, listener);
 		
-		String[] statusTypeKeys = QuestionStatus.valueString();
-		String[] statusTypeValues = new String[statusTypeKeys.length];
-		for(int i=statusTypeKeys.length; i-->0; ) {
-			statusTypeValues[i] = translate("lifecycle.status." + statusTypeKeys[i]);
-		}
+		KeyValues status = MetaUIFactory.getStatus(getTranslator());
 		statusEl = uifactory.addDropdownSingleselect("lifecycle.status", "lifecycle.status", lifecycleCont,
-				statusTypeKeys, statusTypeValues, null);
+				status.getKeys(), status.getValues(), null);
 		decorate(statusEl, lifecycleCont, listener);	
 	}
 
@@ -274,9 +254,9 @@ public class MetadataBulkChangeController extends FormBasicController {
 		decorate(editorEl, technicalCont, listener);
 		editorVersionEl = uifactory.addTextElement("technical.editorVersion", "technical.editorVersion", 50, null, technicalCont);
 		decorate(editorVersionEl, technicalCont, listener);
-		String[] formatKeys = new String[]{ QTIConstants.QTI_12_FORMAT };
+		KeyValues formats = MetaUIFactory.getFormats();
 		formatEl = uifactory.addDropdownSingleselect("technical.format", "technical.format", technicalCont,
-				formatKeys, formatKeys, null);
+				formats.getKeys(), formats.getValues(), null);
 		decorate(formatEl, technicalCont, listener);
 	}
 	
diff --git a/src/main/java/org/olat/modules/qpool/ui/MetadatasController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
similarity index 90%
rename from src/main/java/org/olat/modules/qpool/ui/MetadatasController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
index 35d38d64ca3..d1ec2d76cca 100644
--- a/src/main/java/org/olat/modules/qpool/ui/MetadatasController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui;
+package org.olat.modules.qpool.ui.metadata;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
@@ -28,23 +28,12 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.edit.EducationalMetadataController;
-import org.olat.modules.qpool.ui.edit.EducationalMetadataEditController;
-import org.olat.modules.qpool.ui.edit.GeneralMetadataController;
-import org.olat.modules.qpool.ui.edit.GeneralMetadataEditController;
-import org.olat.modules.qpool.ui.edit.LifecycleMetadataController;
-import org.olat.modules.qpool.ui.edit.LifecycleMetadataEditController;
-import org.olat.modules.qpool.ui.edit.QItemEdited;
-import org.olat.modules.qpool.ui.edit.QuestionMetadataController;
-import org.olat.modules.qpool.ui.edit.QuestionMetadataEditController;
-import org.olat.modules.qpool.ui.edit.RightsMetadataController;
-import org.olat.modules.qpool.ui.edit.RightsMetadataEditController;
-import org.olat.modules.qpool.ui.edit.SharingController;
-import org.olat.modules.qpool.ui.edit.TechnicalMetadataController;
-import org.olat.modules.qpool.ui.edit.TechnicalMetadataEditController;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -77,6 +66,8 @@ public class MetadatasController extends BasicController {
 	
 	public MetadatasController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean canEdit) {
 		super(ureq, wControl);
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
+		
 		this.item = item;
 		this.canEdit = canEdit;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
@@ -243,7 +234,7 @@ public class MetadatasController extends BasicController {
 		mainVC.put("details_rights", rightsCtrl.getInitialComponent());
 	}
 	
-	protected QuestionItem updateVersionNumber() {
+	public QuestionItem updateVersionNumber() {
 		if(item instanceof QuestionItemImpl && StringHelper.containsNonWhitespace(item.getItemVersion())) {
 			String version = item.getItemVersion();
 			int lastPoint = version.lastIndexOf('.');
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java
similarity index 95%
rename from src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java
index ca61918afb9..d5373a82e63 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import java.math.BigDecimal;
 
@@ -35,7 +35,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.model.QItemType;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -53,7 +53,7 @@ public class QuestionMetadataController extends FormBasicController  {
 	
 	public QuestionMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 	
 		this.edit = edit;
 		initForm(ureq);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
similarity index 89%
rename from src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
index 561853bc3f6..54603462fcc 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/QuestionMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
@@ -17,9 +17,14 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.*;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.bigDToString;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.getQItemTypeKeyValues;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toBigDecimal;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toInt;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateBigDecimal;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection;
 
 import java.math.BigDecimal;
 
@@ -38,8 +43,9 @@ import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
-import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
+import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues;
 
 /**
  * 
@@ -57,7 +63,7 @@ public class QuestionMetadataEditController extends FormBasicController {
 
 	public QuestionMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java
similarity index 96%
rename from src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java
index ba299b83733..ce54de2d565 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -41,7 +41,7 @@ import org.olat.core.util.Util;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.model.QLicense;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 import org.olat.user.UserManager;
 
@@ -65,7 +65,7 @@ public class RightsMetadataController extends FormBasicController  {
 	
 	public RightsMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
 		userManager = CoreSpringFactory.getImpl(UserManager.class);
 		this.edit = edit;
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
similarity index 96%
rename from src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
index 5d56f6375f1..686023cb5a1 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/RightsMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -50,8 +50,9 @@ import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemShort;
 import org.olat.modules.qpool.model.QLicense;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
-import org.olat.modules.qpool.ui.edit.MetaUIFactory.KeyValues;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
+import org.olat.modules.qpool.ui.metadata.MetaUIFactory.KeyValues;
 import org.olat.user.UserManager;
 
 /**
@@ -77,7 +78,7 @@ public class RightsMetadataEditController extends FormBasicController {
 
 	public RightsMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java
similarity index 97%
rename from src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java
index 858c1803569..5948082992c 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/SharingController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/SharingController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import java.util.List;
 
@@ -41,7 +41,7 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItem2Pool;
 import org.olat.modules.qpool.QuestionItem2Resource;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.user.UserManager;
 
 /**
@@ -63,7 +63,7 @@ public class SharingController extends FormBasicController {
 
 	public SharingController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl, "sharing");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
 		initForm(ureq);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java
similarity index 95%
rename from src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java
index e5e94325088..0ac2a68c491 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataController.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -33,7 +33,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.QuestionItem;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
 
 /**
@@ -51,7 +51,7 @@ public class TechnicalMetadataController extends FormBasicController  {
 
 	public TechnicalMetadataController(UserRequest ureq, WindowControl wControl, QuestionItem item, boolean edit) {
 		super(ureq, wControl, "view");
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.edit = edit;
 		initForm(ureq);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
similarity index 91%
rename from src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java
rename to src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
index c4c982c24cf..7010a5ff089 100644
--- a/src/main/java/org/olat/modules/qpool/ui/edit/TechnicalMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
@@ -17,10 +17,10 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.qpool.ui.edit;
+package org.olat.modules.qpool.ui.metadata;
 
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateElementLogic;
-import static org.olat.modules.qpool.ui.edit.MetaUIFactory.validateSelection;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
@@ -38,7 +38,8 @@ import org.olat.ims.qti.QTIConstants;
 import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.model.QuestionItemImpl;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
 
 /**
  * 
@@ -56,7 +57,7 @@ public class TechnicalMetadataEditController extends FormBasicController {
 
 	public TechnicalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item) {
 		super(ureq, wControl);
-		setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
 		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/author_list.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/author_list.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/author_list.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/author_list.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/bulk_change.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/bulk_change.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/bulk_change.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/bulk_change.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/edit_edu_context.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/edit_edu_context.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/edit_edu_context.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/edit_edu_context.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html
new file mode 100644
index 00000000000..76a3714158f
--- /dev/null
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/extended_search.html
@@ -0,0 +1,11 @@
+<div class="b_clearfix"><table><tbody>
+#foreach($query in $uiQueries)
+	<tr>
+		<td>$r.render($query.attributChoice.name)</td>
+		<td>$r.render($query.parameterItem.name)</td>
+		<td>$r.render($query.addButton.component.componentName)</td>
+		<td>$r.render($query.removeButton.component.componentName)</td>
+	</tr>
+#end
+</tbody></table></div>
+$r.render("buttons")
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/item_metadatas.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/_content/item_metadatas.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/learning_time.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/learning_time.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/learning_time.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/learning_time.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/sharing.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/sharing.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/sharing.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/sharing.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/edit/_content/view.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/view.html
similarity index 100%
rename from src/main/java/org/olat/modules/qpool/ui/edit/_content/view.html
rename to src/main/java/org/olat/modules/qpool/ui/metadata/_content/view.html
diff --git a/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java b/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java
index cbfecc7dee6..3272a7acc44 100644
--- a/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/wizard/ExportOverviewController.java
@@ -40,7 +40,7 @@ import org.olat.modules.qpool.ExportFormatOptions;
 import org.olat.modules.qpool.QPoolSPI;
 import org.olat.modules.qpool.QuestionItemShort;
 import org.olat.modules.qpool.QuestionPoolModule;
-import org.olat.modules.qpool.ui.MetadatasController;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
 
 /**
  * 
diff --git a/src/main/java/org/olat/search/service/SearchServiceImpl.java b/src/main/java/org/olat/search/service/SearchServiceImpl.java
index 35e0b0df8b6..a6111521861 100644
--- a/src/main/java/org/olat/search/service/SearchServiceImpl.java
+++ b/src/main/java/org/olat/search/service/SearchServiceImpl.java
@@ -109,7 +109,7 @@ public class SearchServiceImpl implements SearchService {
 			AbstractOlatDocument.TITLE_FIELD_NAME, AbstractOlatDocument.DESCRIPTION_FIELD_NAME,
 			AbstractOlatDocument.CONTENT_FIELD_NAME, AbstractOlatDocument.AUTHOR_FIELD_NAME,
 			AbstractOlatDocument.DOCUMENTTYPE_FIELD_NAME, AbstractOlatDocument.FILETYPE_FIELD_NAME,
-			QItemDocument.STUDY_FIELD, QItemDocument.IDENTIFIER_FIELD,
+			QItemDocument.TAXONOMIC_PATH_FIELD, QItemDocument.IDENTIFIER_FIELD,
 			QItemDocument.MASTER_IDENTIFIER_FIELD, QItemDocument.KEYWORDS_FIELD,
 			QItemDocument.COVERAGE_FIELD, QItemDocument.ADD_INFOS_FIELD,
 			QItemDocument.LANGUAGE_FIELD, QItemDocument.EDU_CONTEXT_FIELD,
diff --git a/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java b/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java
index 257e89cd85f..1af85e6d449 100644
--- a/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java
+++ b/src/main/java/org/olat/search/service/indexer/JmsIndexWork.java
@@ -31,14 +31,19 @@ public class JmsIndexWork implements Serializable {
 
 	private static final long serialVersionUID = 8790611181901676640L;
 	
+	public static final String INDEX = "index";
+	public static final String DELETE = "delete";
+	
 	private String indexType;
 	private Long key;
+	private String action;
 	
 	public JmsIndexWork() {
 		//
 	}
 	
-	public JmsIndexWork(String indexType, Long key) {
+	public JmsIndexWork(String action, String indexType, Long key) {
+		this.action = action;
 		this.indexType = indexType;
 		this.key = key;
 	}
@@ -58,7 +63,12 @@ public class JmsIndexWork implements Serializable {
 	public void setKey(Long key) {
 		this.key = key;
 	}
-	
-	
 
+	public String getAction() {
+		return action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
 }
diff --git a/src/main/java/org/olat/search/service/indexer/JmsIndexer.java b/src/main/java/org/olat/search/service/indexer/JmsIndexer.java
index 538ccbc886b..a521c2f6038 100644
--- a/src/main/java/org/olat/search/service/indexer/JmsIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/JmsIndexer.java
@@ -245,7 +245,7 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer {
 		QueueSender sender;
 		QueueSession session;
 		try {
-			JmsIndexWork workUnit = new JmsIndexWork(type, key);
+			JmsIndexWork workUnit = new JmsIndexWork(JmsIndexWork.INDEX, type, key);
 			session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE );
 			ObjectMessage message = session.createObjectMessage();
 			message.setObject(workUnit);
@@ -257,14 +257,36 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer {
 			log.error("", e );
 		}
 	}
-	
+
+	@Override
+	public void deleteDocument(String type, Long key) {
+		QueueSender sender;
+		QueueSession session;
+		try {
+			JmsIndexWork workUnit = new JmsIndexWork(JmsIndexWork.DELETE, type, key);
+			session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE );
+			ObjectMessage message = session.createObjectMessage();
+			message.setObject(workUnit);
+
+			sender = session.createSender(getJmsQueue());
+			sender.send( message );
+			session.close();
+		} catch (JMSException e) {
+			log.error("", e );
+		}
+	}
+
 	@Override
 	public void onMessage(Message message) {
 		if(message instanceof ObjectMessage) {
 			try {
 				ObjectMessage objMsg = (ObjectMessage)message;
 				JmsIndexWork workUnit = (JmsIndexWork)objMsg.getObject();
-				doIndex(workUnit);
+				if(JmsIndexWork.INDEX.equals(workUnit.getAction())) {
+					doIndex(workUnit);
+				} else if(JmsIndexWork.DELETE.equals(workUnit.getAction())) {
+					doDelete(workUnit);
+				}
 				message.acknowledge();
 			} catch (JMSException e) {
 				log.error("", e);
@@ -282,6 +304,16 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer {
 		}
 	}
 	
+	private void doDelete(JmsIndexWork workUnit) {
+		if(searchService instanceof SearchServiceImpl) {
+			String type = workUnit.getIndexType();
+			List<LifeIndexer> indexers = getIndexerByType(type);
+			for(LifeIndexer indexer:indexers) {
+				indexer.deleteDocument(workUnit.getKey(), this);
+			}
+		}
+	}
+	
 	private DirectoryReader getReader() throws IOException {
 		DirectoryReader newReader = DirectoryReader.openIfChanged(reader);
 		if(newReader != null) {
@@ -289,14 +321,30 @@ public class JmsIndexer implements MessageListener, LifeFullIndexer {
 		}
 		return reader;
 	}
-	
+
+	@Override
 	public IndexWriter getAndLockWriter() throws IOException {
 		return permanentIndexWriter.getAndLock();
 	}
-	
+
+	@Override
 	public void releaseWriter(IndexWriter writer) {
 		permanentIndexWriter.release(writer);
 	}
+
+	@Override
+	public void deleteDocument(String resourceUrl) {
+		IndexWriter writer = null;
+		try {
+			Term uuidTerm = new Term(AbstractOlatDocument.RESOURCEURL_FIELD_NAME, resourceUrl);
+	    writer = permanentIndexWriter.getAndLock();
+			writer.deleteDocuments(uuidTerm);
+		} catch (IOException e) {
+			log.error("", e);
+		} finally {
+			permanentIndexWriter.release(writer);
+		}
+	}
 	
 	/**
 	 * Add or update a lucene document in the permanent index.
diff --git a/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java b/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java
index b37fa162c6d..d4da3c1b1cf 100644
--- a/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/LifeFullIndexer.java
@@ -46,6 +46,13 @@ public interface LifeFullIndexer {
 	 */
 	public void indexDocument(String type, Long key);
 	
+	/**
+	 * Delete a document
+	 * @param type
+	 * @param key
+	 */
+	public void deleteDocument(String type, Long key);
+	
 	/**
 	 * Return the index writer, don't forget to release it.
 	 * @return
@@ -71,5 +78,11 @@ public interface LifeFullIndexer {
 	 * @param writer
 	 */
 	public void addDocument(Document doc, IndexWriter writer);
+	
+	/**
+	 * 
+	 * @param resourceUrl
+	 */
+	public void deleteDocument(String resourceUrl);
 
 }
diff --git a/src/main/java/org/olat/search/service/indexer/LifeIndexer.java b/src/main/java/org/olat/search/service/indexer/LifeIndexer.java
index 38bbcaae8bb..d38ec126505 100644
--- a/src/main/java/org/olat/search/service/indexer/LifeIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/LifeIndexer.java
@@ -41,4 +41,6 @@ public interface LifeIndexer {
 	 */
 	public void indexDocument(Long key, LifeFullIndexer indexWriter);
 	
+	public void deleteDocument(Long key, LifeFullIndexer indexWriter);
+	
 }
diff --git a/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java b/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java
index 137a9a01a22..8865fb36a7f 100644
--- a/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/QuestionItemIndexer.java
@@ -56,6 +56,13 @@ public class QuestionItemIndexer implements LifeIndexer {
 		indexWriter.addDocument(doc);	
 	}
 
+	@Override
+	public void deleteDocument(Long key, LifeFullIndexer indexWriter) {
+		QuestionItemDocumentFactory docFactory = CoreSpringFactory.getImpl(QuestionItemDocumentFactory.class);
+		String resourceUrl = docFactory.getResourceUrl(key);
+		indexWriter.deleteDocument(resourceUrl);	
+	}
+
 	@Override
 	public void fullIndex(LifeFullIndexer indexWriter) {
 		QPoolService qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
diff --git a/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss b/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss
index 2474b05fff6..4efcb12c960 100644
--- a/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss
+++ b/src/main/webapp/static/themes/openolat/all/modules/_dialogs.scss
@@ -142,7 +142,8 @@ div.b_msg_dialog {
 /* sticky info (admins can create stick-messages that will show for all users) */
 #b_msg_sticky { 
 	clear:both; padding: 10px 10px 10px 50px;
-	min-height: 32px; background: #FFB651 url(../openolat/images/icon_warning_32.png) no-repeat 10px 10px; 
+	min-height: 32px;
+	background: #FFB651 url(../openolat/images/icon_warning_32.png) no-repeat 10px 10px; 
 	border:none;
 }
 
diff --git a/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java b/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java
index 79fbbb69756..8bec5307b96 100644
--- a/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java
+++ b/src/test/java/org/olat/util/browser/arquillian/DroneStudentExtension.java
@@ -1,3 +1,22 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.util.browser.arquillian;
 
 import org.jboss.arquillian.core.spi.LoadableExtension;
diff --git a/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java b/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java
index 36cf4bc0eee..0a189076773 100644
--- a/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java
+++ b/src/test/java/org/olat/util/browser/arquillian/StudentConfiguration.java
@@ -1,3 +1,22 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.util.browser.arquillian;
 
 import java.lang.annotation.Annotation;
diff --git a/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java b/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java
index 9fd474b62f6..67f9b3e3c41 100644
--- a/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java
+++ b/src/test/java/org/olat/util/browser/arquillian/StudentFactory.java
@@ -1,13 +1,29 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
 package org.olat.util.browser.arquillian;
 
 import java.lang.annotation.Annotation;
-import java.util.List;
 
 import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
-import org.jboss.arquillian.drone.selenium.configuration.SeleniumConfiguration;
 import org.jboss.arquillian.drone.spi.Configurator;
 import org.jboss.arquillian.drone.spi.Destructor;
-import org.jboss.arquillian.drone.spi.DroneConfiguration;
 import org.jboss.arquillian.drone.spi.Instantiator;
 
 import com.thoughtworks.selenium.DefaultSelenium;
-- 
GitLab