diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java
index 3c543a8abfc64ccee438c0e9808df8a6a4e74e12..ed476520e9d8b826c8e602d454e2d4ce6b95b71a 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java
@@ -19,6 +19,8 @@
  */
 package org.olat.modules.adobeconnect.manager;
 
+import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault;
+
 import java.net.URI;
 import java.util.List;
 
@@ -88,8 +90,8 @@ public class AdobeConnect9Provider extends AbstractAdobeConnectProvider {
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder
 			.queryParam("action", "principal-update")
-			.queryParam("first-name", identity.getUser().getFirstName())
-			.queryParam("last-name", identity.getUser().getLastName());
+			.queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John"))
+			.queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe"));
 		if(!adobeConnectModule.isLoginCompatibilityMode()) {
 			builder
 				.queryParam("email", identity.getUser().getEmail());
diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java
index 86ff21c7baaf3fa8ef12ce4ba2cba3537b025374..e1bb7d3d0f666db418a2b1d1f3cbc1561cac868f 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java
@@ -220,6 +220,10 @@ public class AdobeConnectUtils {
 		}
 	}
 	
+	protected static String orDefault(String val, String defaultValue) {
+		return StringHelper.containsNonWhitespace(val) ? val : defaultValue;
+	}
+	
 	protected static void print(Document document) {
 		if(log.isDebugEnabled()) {
 		    try(StringWriter writer = new StringWriter()) {
diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
index 21d9f3ceae60e56f3dbcfc7fee863e3293568ca4..28e72595220b9911ef1636b28a1696d60850201d 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
@@ -19,6 +19,9 @@
  */
 package org.olat.modules.adobeconnect.manager;
 
+import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault;
+
+
 import java.util.List;
 
 import javax.ws.rs.core.UriBuilder;
@@ -39,7 +42,6 @@ import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal;
 import org.olat.modules.adobeconnect.model.AdobeConnectSco;
 import org.olat.modules.adobeconnect.model.BreezeSession;
 import org.springframework.stereotype.Service;
-
 /**
  * 
  * Initial date: 17 avr. 2019<br>
@@ -92,8 +94,8 @@ public class DFNprovider extends AbstractAdobeConnectProvider {
 		builder
 			.queryParam("action", "lms-user-create")
 			.queryParam("login", identity.getUser().getEmail())
-			.queryParam("first-name", identity.getUser().getFirstName())
-			.queryParam("last-name", identity.getUser().getLastName());
+			.queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John"))
+			.queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe"));
 
 		HttpGet get = createAdminMethod(builder, errors);
 		List<AdobeConnectPrincipal> users = null;
diff --git a/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java b/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java
index e0fa376ee41ab873a7cfd37f4b93a67b9e4586af..da8ac85911e370abb6c5dadb2c43d9524a220c1d 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java
@@ -300,6 +300,19 @@ public class QItemQueriesDAO {
 			sb.and();
 			PersistenceHelper.appendFuzzyLike(sb, "item.topic", "topic", dbInstance.getDbVendor());
 		}
+		if(StringHelper.containsNonWhitespace(params.getOwner())) {
+			sb.and()
+			  .append(" exists (select mship.key from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as mship ")
+		      .append("  inner join mship.identity as oIdent")
+		      .append("  inner join oIdent.user as oUser")
+	          .append("  where mship.securityGroup.key=item.ownerGroup.key and (");
+			PersistenceHelper.appendFuzzyLike(sb, "oUser.firstName", "owner", dbInstance.getDbVendor());
+			sb.append(" or ");
+			PersistenceHelper.appendFuzzyLike(sb, "oUser.lastName", "owner", dbInstance.getDbVendor());
+			sb.append(" or ");
+			PersistenceHelper.appendFuzzyLike(sb, "oIdent.name", "owner", dbInstance.getDbVendor());
+			sb.append(" ))");
+		}
 		if(StringHelper.containsNonWhitespace(params.getKeywords())) {
 			sb.and();
 			PersistenceHelper.appendFuzzyLike(sb, "item.keywords", "keywords", dbInstance.getDbVendor());
@@ -427,6 +440,10 @@ public class QItemQueriesDAO {
 			String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getTopic());
 			query.setParameter("topic", fuzzySearch);
 		}
+		if(StringHelper.containsNonWhitespace(params.getOwner())) {
+			String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getOwner());
+			query.setParameter("owner", fuzzySearch);
+		}
 		if(StringHelper.containsNonWhitespace(params.getKeywords())) {
 			String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getKeywords());
 			query.setParameter("keywords", fuzzySearch);
diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
index 5b3d2922c2cb80bc2c24693bbfa2f48f2bf4352a..c4739b487afe8230b27b2c482febfd15c16449fd 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
@@ -29,6 +29,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.LockModeType;
 import javax.persistence.TypedQuery;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.SecurityGroupMembershipImpl;
@@ -36,6 +37,7 @@ import org.olat.basesecurity.manager.SecurityGroupDAO;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.mark.impl.MarkImpl;
 import org.olat.core.id.Identity;
+import org.olat.core.logging.Tracing;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItem2Resource;
@@ -60,6 +62,8 @@ import org.springframework.stereotype.Service;
 @Service("questionDao")
 public class QuestionItemDAO {
 	
+	private static final Logger log = Tracing.createLoggerFor(QuestionItemDAO.class);
+	
 	@Autowired
 	private DB dbInstance;
 	@Autowired
@@ -177,6 +181,8 @@ public class QuestionItemDAO {
 		for(Identity author:authors) {
 			if(!securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) {
 				securityGroupDao.addIdentityToSecurityGroup(author, secGroup);
+				log.info(Tracing.M_AUDIT, "Added owner identity '{}' to item with key {} ({}, {})",
+						author.getKey(), item.getKey(), item.getTitle(), item.getTopic());
 			}
 		}
 		dbInstance.commit();
@@ -190,6 +196,8 @@ public class QuestionItemDAO {
 		for(Identity author:authors) {
 			if(securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) {
 				securityGroupDao.removeIdentityFromSecurityGroup(author, secGroup);
+				log.info(Tracing.M_AUDIT, "Removed owner identity '{}' from item with key {} ({}, {})",
+						author.getKey(), item.getKey(), item.getTitle(), item.getTopic());
 			}
 		}
 		dbInstance.commit();
@@ -261,6 +269,7 @@ public class QuestionItemDAO {
 		for(QuestionItemShort item:items) {
 			QuestionItem refItem = loadLazyReferenceId(item.getKey());
 			if(refItem != null) {
+				log.info(Tracing.M_AUDIT, "Delete question item {} ({}, {})", item.getKey(), item.getTitle(), item.getTopic());
 				em.remove(refItem);
 			}
 		}
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 367c6eadea40d468cd52d9dd8287e18d72f7b639..0f49b80eec6b90f2f47eaea833e029ff4fecd263 100644
--- a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java
+++ b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java
@@ -48,6 +48,7 @@ public class SearchQuestionItemParams implements Cloneable {
 	private Identity author;
 	private String title;
 	private String topic;
+	private String owner;
 	private String keywords;
 	private String coverage;
 	private String informations;
@@ -146,6 +147,14 @@ public class SearchQuestionItemParams implements Cloneable {
 		this.topic = topic;
 	}
 
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
 	public String getKeywords() {
 		return keywords;
 	}
@@ -345,6 +354,9 @@ public class SearchQuestionItemParams implements Cloneable {
 		if(StringHelper.containsNonWhitespace(searchString)) {
 			clone.searchString = searchString;
 		}
+		if(StringHelper.containsNonWhitespace(owner)) {
+			clone.owner = owner;
+		}
 		if(favoritOnly) {
 			clone.favoritOnly = favoritOnly;
 		}
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 4cba538728e884aac7e2c49dc7c1d7cb9e8e1dc9..8e44b5825b0c92b5a044a715a9619167f0fba8ce 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
@@ -201,6 +201,7 @@ my.share=Meine Shares
 new.item=Frage erstellen
 next=N\u00E4chste
 numberOfRatings=Anzahl Bewertungen
+owner=Autor
 pool.add.to.source=Fragen zum Pool "{0}" hinzuf\u00FCgen
 pool.key=ID
 pool.name=Name
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
index f514b7bec39f10095e546d8bb10222334f9ed640..4443009f18c55e82932b52a787ed582a7867e1d6 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
@@ -201,6 +201,7 @@ my.share=My shares
 new.item=Create question
 next=Next
 numberOfRatings=Number of ratings
+owner=Author
 pool.add.to.source=Add questions to pool "{0}"
 pool.key=ID
 pool.name=Name
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
index 2ec0a4a4f6e0e9ed8cde0d534bb973a1cf844fd1..2b25b5efa67c3f6c172abfc7b5f8693d7cdc5919 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java
@@ -334,6 +334,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext
 				attributes.add(new SearchAttribute("classification.taxonomy.level", new TaxonomicFieldQueryParameter()));
 				attributes.add(new SearchAttribute("classification.taxonomic.path.incl", new TaxonomicPathQueryParameter()));
 			}
+			attributes.add(new SearchAttribute("owner", new StringQueryParameter(AbstractOlatDocument.AUTHOR_FIELD_NAME)));
 			//educational
 			if (qPoolSecurityCallback.canUseEducationalContext()) {
 				attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter()));
@@ -400,6 +401,8 @@ public class ExtendedSearchController extends FormBasicController implements Ext
 					searchParams.setTopic(val);
 				} else if(QItemDocument.KEYWORDS_FIELD.equals(docAttribute)) {
 					searchParams.setKeywords(val);
+				} else if(AbstractOlatDocument.AUTHOR_FIELD_NAME.equals(docAttribute)) {
+					searchParams.setOwner(val);
 				} else if(QItemDocument.COVERAGE_FIELD.equals(docAttribute)) {
 					searchParams.setCoverage(val);
 				} else if(QItemDocument.ADD_INFOS_FIELD.equals(docAttribute)) {
@@ -461,7 +464,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext
 		private final LicenseSelectionConfig config;
 		
 		public LicenseQueryParameter() {
-			super(QItemDocument.LICENSE_TYPE_FIELD_NAME);
+			super(AbstractOlatDocument.LICENSE_TYPE_FIELD_NAME);
 			config = LicenseUIFactory.createLicenseSelectionConfig(licenseHandler);
 		}
 		
diff --git a/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java b/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4d1d4768d2b67163f78b10c228329ff6faaaee3
--- /dev/null
+++ b/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java
@@ -0,0 +1,45 @@
+/**
+ * <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.adobeconnect.manager;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * 
+ * Initial date: 12 mars 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class AdobeConnectUtilsTest {
+	
+	@Test
+	public void orDefault() {
+		String val = AdobeConnectUtils.orDefault("my-value", "a-default-value");
+		Assert.assertEquals("my-value", val);
+	}
+	
+	@Test
+	public void orDefault_default() {
+		String val = AdobeConnectUtils.orDefault(null, "a-default-value");
+		Assert.assertEquals("a-default-value", val);
+	}
+
+}
diff --git a/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java b/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java
index d546edd606ad0d3db78e2ee8171d041d7e9ed3d2..b76b547a23851f14bd9b97a68b623ac1d04fe317 100644
--- a/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java
+++ b/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java
@@ -327,6 +327,41 @@ public class QItemQueriesDAOTest extends OlatTestCase  {
 		}
 	}
 	
+	@Test
+	public void getItemsByOwner() {
+		//create an author with 2 items
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwner-and-only-2-");
+		QuestionItem item = questionDao.createAndPersist(id, "NGC 7837", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType);
+		dbInstance.commitAndCloseSession();
+
+		SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH);
+		params.setOwner("Owner-and-only");
+		
+		SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true);
+		List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc);
+		Assert.assertNotNull(views);
+		Assert.assertFalse(views.isEmpty());	
+		boolean match = views.stream().anyMatch(view -> item.getKey().equals(view.getKey()));
+		Assert.assertTrue(match);
+	}
+	
+	@Test
+	public void getItemsByOwner_negativeTest() {
+		//create an author with 2 items
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwn-29-");
+		QuestionItem item = questionDao.createAndPersist(id, "NGC 7838", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(item);
+
+		SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH);
+		params.setOwner(UUID.randomUUID().toString());
+		
+		SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true);
+		List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc);
+		Assert.assertNotNull(views);
+		Assert.assertTrue(views.isEmpty());
+	}
+	
 	@Test
 	public void getItemsOfPool() {
 		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Poolman-");
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index a7e62c4b13987bb40a10b076a2a9af69e4ed3151..b0b4b39db45157831ff786c7cac501d549841a82 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -204,6 +204,7 @@ import org.junit.runners.Suite;
 	org.olat.modules.adobeconnect.manager.AdobeConnectProviderTest.class,
 	org.olat.modules.adobeconnect.manager.AdobeConnectUserDAOTest.class,
 	org.olat.modules.adobeconnect.manager.AdobeConnectMeetingDAOTest.class,
+	org.olat.modules.adobeconnect.manager.AdobeConnectUtilsTest.class,
 	org.olat.modules.iq.IQManagerTest.class,
 	org.olat.modules.fo.ForumManagerTest.class,//fail
 	org.olat.modules.wiki.WikiUnitTest.class,