diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
index 632f15aa57934a7d4c6478b5181ac8de3d8bb720..4379abf373f987110cce8537204f73c962bcf6d1 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
@@ -208,9 +208,9 @@ public class CertificateAndEfficiencyStatementListController extends FormBasicCo
 		//artefact
 		if(assessedIdentity.equals(getIdentity())) {
 			if(portfolioV2Module.isEnabled()) {
-				tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.artefact",
-						Cols.efficiencyStatement.ordinal(), CMD_MEDIA,
-						new StaticFlexiCellRenderer(CMD_MEDIA, new AsArtefactCellRenderer())));
+				DefaultFlexiColumnModel portfolioColumn = new DefaultFlexiColumnModel( Cols.artefact, CMD_MEDIA,
+						new BooleanCellRenderer(new StaticFlexiCellRenderer(CMD_MEDIA, new AsArtefactCellRenderer()), null));
+				tableColumnModel.addFlexiColumnModel(portfolioColumn);
 			} else {
 				EPArtefactHandler<?> artHandler = portfolioModule.getArtefactHandler(EfficiencyStatementArtefact.ARTEFACT_TYPE);
 				if(portfolioModule.isEnabled() && artHandler != null && artHandler.isEnabled() && assessedIdentity.equals(getIdentity())) {
@@ -399,7 +399,7 @@ public class CertificateAndEfficiencyStatementListController extends FormBasicCo
 		if(collectorCtrl != null) return;
 		
 		EfficiencyStatement fullStatement = esm.getUserEfficiencyStatementByKey(efficiencyStatementKey);
-		collectorCtrl = new CollectArtefactController(ureq, getWindowControl(), fullStatement, mediaHandler, "");
+		collectorCtrl = new CollectArtefactController(ureq, getWindowControl(), fullStatement, mediaHandler, null);
 		listenTo(collectorCtrl);
 		
 		cmc = new CloseableModalController(getWindowControl(), null, collectorCtrl.getInitialComponent(), true, title, true);
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
index b523b164398d369793c6089b31b3ce2471cccf9e..25d248a800c5f7efa15dbe1a4f59368edaebaa98 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
@@ -85,7 +85,8 @@ public class CertificateAndEfficiencyStatementListModel extends DefaultFlexiTabl
 				return null;
 			}
 			case efficiencyStatement: return statement.getEfficiencyStatementKey();
-			case deleteEfficiencyStatement: return statement.getEfficiencyStatementKey() != null;
+			case deleteEfficiencyStatement:
+			case artefact: return statement.getEfficiencyStatementKey() != null;
 		}
 		return null;
 	}
@@ -100,7 +101,8 @@ public class CertificateAndEfficiencyStatementListModel extends DefaultFlexiTabl
 		efficiencyStatement("table.header.certificate", true),
 		certificate("table.header.certificate", true),
 		recertification("table.header.recertification", true),
-		deleteEfficiencyStatement("table.action.delete", false);
+		deleteEfficiencyStatement("table.action.delete", false),
+		artefact("table.header.artefact", false);
 		
 		private final String i18n;
 		private final boolean sortable;
diff --git a/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java b/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
index 86b8ea90a67123df5eac74dda554f62d6789ada9..49fd6aaa2ae1fb7a2fdeb4848405fa3ea9cf901d 100644
--- a/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
@@ -79,7 +79,7 @@ public class MediaImpl implements Persistable, CreateInfo, Media  {
 	private String content;
 	@Column(name="p_signature", nullable=false, insertable=true, updatable=true)
 	private int signature;
-	@Column(name="p_business_path", nullable=false, insertable=true, updatable=true)
+	@Column(name="p_business_path", nullable=true, insertable=true, updatable=true)
 	private String businessPath;
 	@Column(name="p_reference_id", nullable=true, insertable=true, updatable=true)
 	private String referenceId;
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
index 212c0aadcf42fe7af6275dfff0909fcfcff73fd6..925ac3ddf7803f9a47c2bd2b8f3a9a7975028cb7 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
@@ -73,7 +73,8 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class MediaDetailsController extends FormBasicController implements Activateable2, TooledController {
 
-	private Link editLink, deleteLink;
+	private Link editLink;
+	private Link deleteLink;
 	private Link gotoOriginalLink;
 	private final TooledStackedPanel stackPanel;
 
@@ -154,7 +155,7 @@ public class MediaDetailsController extends FormBasicController implements Activ
 				metaCont.contextPut("collectionDate", collectionDate);
 			}
 			
-			if (media.getBusinessPath() != null) {
+			if (StringHelper.containsNonWhitespace(media.getBusinessPath())) {
 				gotoOriginalLink = LinkFactory.createLink("goto.original", metaCont.getFormItemComponent(), this);
 			}
 			
@@ -164,9 +165,9 @@ public class MediaDetailsController extends FormBasicController implements Activ
 			}
 			
 			List<Category> categories = portfolioService.getCategories(media);
-			if(categories != null && categories.size() > 0) {
+			if(categories != null && !categories.isEmpty()) {
 				Map<String,String> categoriesMap = categories.stream()
-						.collect(Collectors.toMap(c -> c.getName(), c -> c.getName()));
+						.collect(Collectors.toMap(Category::getName, Category::getName));
 				TextBoxListElement categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categoriesMap, metaCont, getTranslator());
 				categoriesEl.setHelpText(translate("categories.hint"));
 				categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
diff --git a/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
index e28525c283e2551e811ed567d64e1400d3430a55..cc7068f13c78ae5d821bb0d221cc494d8cfbf2c4 100644
--- a/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
@@ -74,3 +74,5 @@ alter table o_lecture_block_audit_log add column fk_absence_notice bigint defaul
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
 
+-- portfolio
+alter table o_pf_media modify p_business_path varchar(255) default null;
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 7b42b582f15fe826461eabe859b23a7dc1a61cd6..b336a3d42f25f978b42afd0f7ebe62e94c88508e 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1896,7 +1896,7 @@ create table o_pf_media (
    p_content mediumtext,
    p_signature bigint not null default 0,
    p_reference_id varchar(255) default null,
-   p_business_path varchar(255) not null,
+   p_business_path varchar(255) default null,
    p_creators varchar(1024) default null,
    p_place varchar(255) default null,
    p_publisher varchar(255) default null,
diff --git a/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
index 377a470873bcd351ef747d25ce9bff6b8ac70a97..ac81a9d7c64718095a11e4703110519266865972 100644
--- a/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
@@ -77,3 +77,6 @@ alter table o_lecture_block_audit_log add fk_absence_notice number(20) default n
 
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
+
+-- portfolio
+alter table o_pf_media modify (p_business_path null);
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 50ded488485e2e243a089ba6c84eff4b68d67ff5..61951af46808e818b693efb4ad52f6c0fe49cc95 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1815,7 +1815,7 @@ create table o_pf_media (
    p_content CLOB,
    p_signature number(20) default 0 not null,
    p_reference_id varchar2(255 char) default null,
-   p_business_path varchar2(255 char) not null,
+   p_business_path varchar2(255 char) default null,
    p_creators varchar2(1024 char) default null,
    p_place varchar2(255 char) default null,
    p_publisher varchar2(255 char) default null,
diff --git a/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
index 4807801ab0256fa16eef8ed82ae3de15e9bfd4c6..00b610c62f6b9c5708f0622138e8d829857a2fb6 100644
--- a/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
@@ -77,5 +77,6 @@ alter table o_lecture_block_audit_log add column fk_absence_notice int8 default
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
 
-
+-- portfolio
+alter table o_pf_media alter column p_business_path drop not null;
 
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 0a3137138a9aa418cad30bc40d8efe48406679fe..ffd419096d0d21126448566bb9d7d9367fc262e8 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1804,7 +1804,7 @@ create table o_pf_media (
    p_content text,
    p_signature int8 not null default 0,
    p_reference_id varchar(255) default null,
-   p_business_path varchar(255) not null,
+   p_business_path varchar(255) default null,
    p_creators varchar(1024) default null,
    p_place varchar(255) default null,
    p_publisher varchar(255) default null,
diff --git a/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java b/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
index a9f27630357c1864b26370dbffeb83c1adb9e295..2528d5975fed777b660a29e7cd3e14d3b888978c 100644
--- a/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
+++ b/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
@@ -80,6 +80,27 @@ public class MediaDAOTest extends OlatTestCase {
 		Assert.assertEquals(id, reloadedMedia.getAuthor());
 	}
 	
+	@Test
+	public void createMedia_withoutBusinessPath() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("pf-media-1null");
+		Media media = mediaDao.createMedia("Media", null, null, "Forum", null, null, 10, id);
+		dbInstance.commit();
+		
+		Assert.assertNotNull(media);
+		Assert.assertNotNull(media.getKey());
+		Assert.assertNotNull(media.getCreationDate());
+		Assert.assertNotNull(media.getCollectionDate());
+		Assert.assertEquals(id, media.getAuthor());
+		
+		Media reloadedMedia = mediaDao.loadByKey(media.getKey());
+		Assert.assertNotNull(reloadedMedia);
+		Assert.assertEquals(media, reloadedMedia);
+		Assert.assertEquals(id, reloadedMedia.getAuthor());
+		Assert.assertEquals("Media", reloadedMedia.getTitle());
+		Assert.assertNull(reloadedMedia.getBusinessPath());
+		Assert.assertEquals(id, reloadedMedia.getAuthor());
+	}
+	
 	@Test
 	public void searchByAuthor() {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("pf-media-2");