diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
index 7de30f3a0458c79f9dea116db48ce90dc107003a..92c36759464166d47b4082091de8bd1ff496424f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
@@ -37,16 +37,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.MatchingEntityModel.MatchingEntityColumnKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SearchableEntity;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
@@ -55,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
@@ -95,15 +97,23 @@ public final class MatchingEntitiesPanel extends TypedTableGrid<MatchingEntity>
 
         updateDefaultRefreshButton();
 
-        registerLinkClickListenerFor(MatchingEntityColumnKind.IDENTIFIER.id(),
-                new ICellListener<TableModelRowWithObject<MatchingEntity>>()
+        ICellListenerAndLinkGenerator<MatchingEntity> listenerLinkGenerator =
+                new ICellListenerAndLinkGenerator<MatchingEntity>()
                     {
                         public void handle(TableModelRowWithObject<MatchingEntity> rowItem,
-                                boolean keyPressed)
+                                boolean specialKeyPressed)
                         {
-                            showEntityViewer(rowItem, false, keyPressed);
+                            showEntityViewer(rowItem, false, specialKeyPressed);
                         }
-                    });
+
+                        public String tryGetLink(MatchingEntity entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return LinkExtractor.tryExtract(entity);
+                        }
+                    };
+        registerListenerAndLinkGenerator(MatchingEntitiesPanelColumnIDs.IDENTIFIER,
+                listenerLinkGenerator);
         extendBottomToolbar();
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java
deleted file mode 100644
index e7c4d5d25ccdff6fe3be07249527c7ece0c848d2..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.model;
-
-import com.extjs.gxt.ui.client.data.ModelData;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
-
-/**
- * A {@link ModelData} implementation for {@link MatchingEntity}.
- * 
- * @author Christian Ribeaud
- */
-public final class MatchingEntityModel extends BaseEntityModel<MatchingEntity>
-{
-    private static final long serialVersionUID = 1L;
-
-    public MatchingEntityModel(final GridRowModel<MatchingEntity> entity)
-    {
-        super(entity, getStaticColumnsDefinition());
-
-        // override registrator column adding a link
-        Person registratorOrNull = entity.getOriginalObject().getRegistrator();
-        if (registratorOrNull != null)
-        {
-            String person = PersonRenderer.createPersonAnchor(registratorOrNull);
-            set(MatchingEntityColumnKind.REGISTRATOR.id(), person);
-        }
-    }
-
-    public static IColumnDefinitionKind<MatchingEntity>[] getStaticColumnsDefinition()
-    {
-        return MatchingEntityColumnKind.values();
-    }
-
-    public enum MatchingEntityColumnKind implements IColumnDefinitionKind<MatchingEntity>
-    {
-        ENTITY_KIND(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.ENTITY_KIND)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return entity.getEntityKind().getDescription();
-                }
-            }),
-
-        ENTITY_TYPE(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.ENTITY_TYPE)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return entity.getEntityType().getCode();
-                }
-            }),
-
-        IDENTIFIER(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.IDENTIFIER, 140, false)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return entity.getIdentifier();
-                }
-            }),
-
-        REGISTRATOR(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.REGISTRATOR)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return renderRegistratorPerson(entity.getRegistrator());
-                }
-            }),
-
-        MATCHING_FIELD(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.MATCHING_FIELD, 140,
-                false)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return entity.getFieldDescription();
-                }
-            }),
-
-        MATCHING_TEXT(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.MATCHING_TEXT, 200,
-                false)
-            {
-                @Override
-                public String tryGetValue(MatchingEntity entity)
-                {
-                    return entity.getTextFragment();
-                }
-            });
-
-        private final AbstractColumnDefinitionKind<MatchingEntity> columnDefinitionKind;
-
-        private MatchingEntityColumnKind(
-                AbstractColumnDefinitionKind<MatchingEntity> columnDefinitionKind)
-        {
-            this.columnDefinitionKind = columnDefinitionKind;
-        }
-
-        public String id()
-        {
-            return name();
-        }
-
-        public AbstractColumnDefinitionKind<MatchingEntity> getDescriptor()
-        {
-            return columnDefinitionKind;
-        }
-    }
-
-}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
index 8e79435c3f8f87190d6d818e6f49c0daa814b34a..6db9328febe779e31e19f943cbf2e9161b93e718 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.MatchingEntityModel.MatchingEntityColumnKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.CommonExternalDataColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.RelatedDataSetGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.CheckTableCommand;
@@ -181,7 +181,7 @@ public class SearchTest extends AbstractGWTTestCase
 
     private static Row createMatchingEntityRowWithIdentifier(String identifier)
     {
-        return new Row().withCell(MatchingEntityColumnKind.IDENTIFIER.id(), identifier);
+        return new Row().withCell(MatchingEntitiesPanelColumnIDs.IDENTIFIER, identifier);
     }
 
     private static Row createRelatedDatasetRowWithLocation(String location)