From bafb2f349064f4b9ea9c3267a198da5d34b9abb8 Mon Sep 17 00:00:00 2001
From: lotte <lotte_hofstede@hotmail.com>
Date: Mon, 14 Oct 2019 16:27:08 +0200
Subject: [PATCH] fixed existing tests and added linkType

---
 .../item-metadata.component.spec.ts           |   6 +-
 .../edit-relationship.component.spec.ts       |   3 +-
 .../modify-item-overview.component.spec.ts    |   2 +-
 ...item-page-abstract-field.component.spec.ts |   2 +-
 .../item-page-author-field.component.spec.ts  |   2 +-
 .../item-page-date-field.component.spec.ts    |   2 +-
 .../generic-item-page-field.component.spec.ts |   2 +-
 .../item-page-field.component.spec.ts         |   5 +-
 .../item-page-title-field.component.spec.ts   |   2 +-
 .../uri/item-page-uri-field.component.spec.ts |   2 +-
 .../publication/publication.component.spec.ts |   5 +-
 .../item-types/shared/item.component.spec.ts  |  10 +-
 ...data-representation-list.component.spec.ts |   2 +-
 .../related-entities-search.component.spec.ts |   2 +-
 .../+my-dspace-page/my-dspace-page.module.ts  |   4 +-
 .../search-results.component.html             |   1 +
 .../search-results.component.ts               |   3 +
 .../journal-issue-grid-element.component.html |   2 +-
 ...urnal-issue-grid-element.component.spec.ts |  65 +++++--
 ...journal-volume-grid-element.component.html |   2 +-
 ...rnal-volume-grid-element.component.spec.ts |  67 +++++--
 .../journal-grid-element.component.html       |   2 +-
 .../journal-grid-element.component.spec.ts    |  64 +++++--
 ...-search-result-grid-element.component.html |  14 +-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 ...-search-result-grid-element.component.html |  14 +-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 ...-search-result-grid-element.component.html |  20 +-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 .../journal-issue-list-element.component.html |   2 +-
 ...urnal-issue-list-element.component.spec.ts | 111 ++++-------
 ...journal-volume-list-element.component.html |   2 +-
 ...rnal-volume-list-element.component.spec.ts | 112 ++++--------
 .../journal-list-element.component.html       |   2 +-
 .../journal-list-element.component.spec.ts    |  88 ++++-----
 ...-search-result-list-element.component.html |   5 +-
 ...arch-result-list-element.component.spec.ts |   2 +-
 ...-search-result-list-element.component.html |   5 +-
 ...arch-result-list-element.component.spec.ts |   2 +-
 ...-search-result-list-element.component.html |   5 +-
 ...arch-result-list-element.component.spec.ts |   2 +-
 .../journal-issue.component.html              |   2 +-
 .../journal-volume.component.html             |   2 +-
 .../item-pages/journal/journal.component.html |   2 +-
 .../journal/journal.component.spec.ts         |   5 +-
 .../orgunit-grid-element.component.html       |   2 +-
 .../orgunit-grid-element.component.spec.ts    |  65 +++++--
 .../person/person-grid-element.component.html |   2 +-
 .../person-grid-element.component.spec.ts     |  65 +++++--
 .../project-grid-element.component.html       |   2 +-
 .../project-grid-element.component.spec.ts    |  64 +++++--
 ...-search-result-grid-element.component.html |  26 ++-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 ...-search-result-grid-element.component.html |  21 ++-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 ...-search-result-grid-element.component.html |  16 +-
 ...arch-result-grid-element.component.spec.ts |   2 +-
 ...unit-item-page-list-element.component.html |  10 +-
 ...rgunit-item-page-list-element.component.ts |   6 +-
 .../orgunit-list-element.component.html       |   2 +-
 .../orgunit-list-element.component.spec.ts    |  89 ++++-----
 ...rson-item-page-list-element.component.html |  10 +-
 ...person-item-page-list-element.component.ts |   5 +-
 .../person/person-list-element.component.html |   2 +-
 .../person-list-element.component.spec.ts     |  86 ++++-----
 .../project-list-element.component.html       |   2 +-
 .../project-list-element.component.spec.ts    |  97 ++++------
 ...-search-result-list-element.component.html |   9 +-
 ...arch-result-list-element.component.spec.ts |   2 +-
 ...-search-result-list-element.component.html |   9 +-
 ...arch-result-list-element.component.spec.ts |   2 +-
 ...-search-result-list-element.component.html |  35 ++--
 ...arch-result-list-element.component.spec.ts |   2 +-
 .../item-pages/orgunit/orgunit.component.html |   2 +-
 .../item-pages/person/person.component.html   |  18 +-
 .../item-pages/project/project.component.html |   2 +-
 .../dso-input-suggestions.component.html      |   6 +-
 .../dso-input-suggestions.component.ts        |   2 +
 .../input-suggestions.component.scss          |  10 -
 .../collection-element-link.type.ts           |   3 +
 .../object-collection.component.html          |   3 +
 .../object-collection.component.ts            |   8 +-
 ...-object-component-loader.component.spec.ts |  90 ---------
 ...table-object-component-loader.component.ts |   3 +
 .../listable-object.decorator.ts              |   2 -
 .../abstract-listable-element.component.ts    |   6 +-
 ...ch-result-detail-element.component.spec.ts |   9 +-
 .../item-detail-preview.component.html        |   2 +-
 .../item-detail-preview.component.spec.ts     |   2 +-
 ...ch-result-detail-element.component.spec.ts |   6 +-
 ...earch-result-detail-element.component.html |   0
 ...ch-result-detail-element.component.spec.ts |   6 +-
 ...-search-result-detail-element.component.ts |   0
 ...ch-result-detail-element.component.spec.ts |   5 +-
 ...earch-result-detail-element.component.html |   0
 ...earch-result-detail-element.component.scss |   0
 ...ch-result-detail-element.component.spec.ts |   5 +-
 ...-search-result-detail-element.component.ts |   0
 .../object-detail/object-detail.component.ts  |   2 +
 .../collection-grid-element.component.html    |  11 +-
 .../community-grid-element.component.html     |  11 +-
 .../publication-grid-element.component.html   |   2 +-
 ...publication-grid-element.component.spec.ts |  74 ++------
 .../object-grid/object-grid.component.html    |   2 +-
 .../object-grid/object-grid.component.ts      |   2 +
 ...-search-result-grid-element.component.html |  10 +-
 ...-search-result-grid-element.component.html |  11 +-
 ...-search-result-grid-element.component.html |  23 ++-
 ...arch-result-grid-element.component.spec.ts |   4 +-
 .../browse-entry-list-element.component.html  |  13 +-
 .../collection-list-element.component.html    |   5 +-
 .../community-list-element.component.html     |   5 +-
 .../publication-list-element.component.html   |   2 +-
 ...publication-list-element.component.spec.ts | 173 +++++-------------
 .../item-type-badge.component.spec.ts         |   8 +-
 ...em-metadata-list-element.component.spec.ts |   1 +
 .../item-metadata-list-element.component.ts   |   3 +-
 ...a-representation-list-element.component.ts |   3 -
 ...xt-metadata-list-element.component.spec.ts |   1 +
 ...in-text-metadata-list-element.component.ts |   5 +-
 ...arch-result-list-element.component.spec.ts |  10 +-
 ...-list-element-submission.component.spec.ts |   4 +-
 ...arch-result-list-element.component.spec.ts |   9 +-
 ...arch-result-list-element.component.spec.ts |  11 +-
 ...arch-result-list-element.component.spec.ts |   9 +-
 .../object-list/object-list.component.html    |   2 +-
 .../object-list/object-list.component.ts      |   2 +
 ...-search-result-list-element.component.html |   3 +-
 ...arch-result-list-element.component.spec.ts |   4 +-
 ...-search-result-list-element.component.html |   3 +-
 ...arch-result-list-element.component.spec.ts |   3 +-
 ...-search-result-list-element.component.html |   8 +-
 ...arch-result-list-element.component.spec.ts | 105 ++++++-----
 133 files changed, 942 insertions(+), 1089 deletions(-)
 create mode 100644 src/app/shared/object-collection/collection-element-link.type.ts
 delete mode 100644 src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.html (100%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.spec.ts (93%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.ts (100%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.html (100%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.scss (100%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.spec.ts (93%)
 rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.ts (100%)

diff --git a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts
index b9a793eddd..0c164b7bc2 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts
@@ -216,9 +216,9 @@ describe('ItemMetadataComponent', () => {
     });
 
     it('it should call reinstateFieldUpdates on the objectUpdatesService with the correct url and metadata', () => {
-      expect(objectUpdatesService.getUpdatedFields).toHaveBeenCalledWith(url, comp.object.metadataAsList);
-      expect(itemService.update).toHaveBeenCalledWith(Object.assign(comp.object, { metadata: Metadata.toMetadataMap(comp.object.metadataAsList) }));
-      expect(objectUpdatesService.getFieldUpdates).toHaveBeenCalledWith(url, comp.object.metadataAsList);
+      expect(objectUpdatesService.getUpdatedFields).toHaveBeenCalledWith(url, comp.item.metadataAsList);
+      expect(itemService.update).toHaveBeenCalledWith(Object.assign(comp.item, { metadata: Metadata.toMetadataMap(comp.item.metadataAsList) }));
+      expect(objectUpdatesService.getFieldUpdates).toHaveBeenCalledWith(url, comp.item.metadataAsList);
     });
   });
 
diff --git a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
index 55f97000e7..b90543d6ca 100644
--- a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
@@ -5,7 +5,6 @@ import { ObjectUpdatesService } from '../../../../core/data/object-updates/objec
 import { NO_ERRORS_SCHEMA } from '@angular/core';
 import { EditRelationshipComponent } from './edit-relationship.component';
 import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
-import { ResourceType } from '../../../../core/shared/resource-type';
 import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
 import { RemoteData } from '../../../../core/data/remote-data';
 import { Item } from '../../../../core/shared/item.model';
@@ -113,7 +112,7 @@ describe('EditRelationshipComponent', () => {
 
     comp.url = url;
     comp.fieldUpdate = fieldUpdate1;
-    comp.object = item;
+    comp.item = item;
 
     fixture.detectChanges();
   });
diff --git a/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts b/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts
index d0c875d2d3..07ad9a347c 100644
--- a/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts
@@ -32,7 +32,7 @@ describe('ModifyItemOverviewComponent', () => {
   beforeEach(() => {
     fixture = TestBed.createComponent(ModifyItemOverviewComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItem;
+    comp.item = mockItem;
 
     fixture.detectChanges();
   });
diff --git a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts
index 219da338eb..9461ee0950 100644
--- a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts
@@ -31,7 +31,7 @@ describe('ItemPageAbstractFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemPageAbstractFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     fixture.detectChanges();
   }));
 
diff --git a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts
index 5647c7cc11..d865caff8a 100644
--- a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts
@@ -32,7 +32,7 @@ describe('ItemPageAuthorFieldComponent', () => {
     beforeEach(async(() => {
       fixture = TestBed.createComponent(ItemPageAuthorFieldComponent);
       comp = fixture.componentInstance;
-      comp.object = mockItemWithMetadataFieldAndValue(field, mockValue);
+      comp.item = mockItemWithMetadataFieldAndValue(field, mockValue);
       fixture.detectChanges();
     }));
 
diff --git a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts
index 760398e1f5..2adada582b 100644
--- a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts
@@ -31,7 +31,7 @@ describe('ItemPageDateFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemPageDateFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     fixture.detectChanges();
   }));
 
diff --git a/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts
index 2bfff14dd6..d8abd39cf3 100644
--- a/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts
@@ -33,7 +33,7 @@ describe('GenericItemPageFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(GenericItemPageFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     comp.fields = mockFields;
     comp.label = mockLabel;
     fixture.detectChanges();
diff --git a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
index 4db4e06ce6..6e5ed2c535 100644
--- a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts
@@ -4,12 +4,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 import { Item } from '../../../../core/shared/item.model';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
-import { Observable } from 'rxjs';
 import { PageInfo } from '../../../../core/shared/page-info.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { ItemPageFieldComponent } from './item-page-field.component';
 import { MetadataValuesComponent } from '../../../field-components/metadata-values/metadata-values.component';
-import { of as observableOf } from 'rxjs';
 import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 
@@ -40,7 +37,7 @@ describe('ItemPageFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemPageFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     comp.fields = mockFields;
     comp.label = mockLabel;
     fixture.detectChanges();
diff --git a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts
index 17ce39dd18..cb1ba6a4bc 100644
--- a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts
@@ -31,7 +31,7 @@ describe('ItemPageTitleFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemPageTitleFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     fixture.detectChanges();
   }));
 
diff --git a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts
index 60d2f5c97c..4511f16aae 100644
--- a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts
+++ b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts
@@ -31,7 +31,7 @@ describe('ItemPageUriFieldComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemPageUriFieldComponent);
     comp = fixture.componentInstance;
-    comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue);
+    comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue);
     fixture.detectChanges();
   }));
 
diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
index db2c07c63a..5b17f7bbd4 100644
--- a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
+++ b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts
@@ -3,19 +3,16 @@ import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
 import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
 import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { ItemDataService } from '../../../../core/data/item-data.service';
 import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { Item } from '../../../../core/shared/item.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
 import { By } from '@angular/platform-browser';
 import { createRelationshipsObservable } from '../shared/item.component.spec';
 import { PublicationComponent } from './publication.component';
-import { of as observableOf } from 'rxjs';
 import { MetadataMap } from '../../../../core/shared/metadata.models';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 
@@ -45,7 +42,6 @@ describe('PublicationComponent', () => {
       })],
       declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe],
       providers: [
-        {provide: ITEM, useValue: mockItem},
         {provide: ItemDataService, useValue: {}},
         {provide: SearchFixedFilterService, useValue: searchFixedFilterServiceStub},
         {provide: TruncatableService, useValue: {}}
@@ -60,6 +56,7 @@ describe('PublicationComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(PublicationComponent);
     comp = fixture.componentInstance;
+    comp.object = mockItem;
     fixture.detectChanges();
   }));
 
diff --git a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
index e6880c3c90..f436b2f767 100644
--- a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
+++ b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
@@ -7,17 +7,14 @@ import { ItemDataService } from '../../../../core/data/item-data.service';
 import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
 import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
 import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
 import { isNotEmpty } from '../../../../shared/empty.util';
 import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service';
 import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
 import { PaginatedList } from '../../../../core/data/paginated-list';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
 import { PageInfo } from '../../../../core/shared/page-info.model';
 import { ItemComponent } from './item.component';
-import { of as observableOf } from 'rxjs';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { VarDirective } from '../../../../shared/utils/var.directive';
 import { Observable } from 'rxjs/internal/Observable';
@@ -56,7 +53,6 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
         })],
         declarations: [component, GenericItemPageFieldComponent, TruncatePipe],
         providers: [
-          {provide: ITEM, useValue: mockItem},
           {provide: ItemDataService, useValue: {}},
           {provide: SearchFixedFilterService, useValue: searchFixedFilterServiceStub},
           {provide: TruncatableService, useValue: {}}
@@ -71,6 +67,7 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
     beforeEach(async(() => {
       fixture = TestBed.createComponent(component);
       comp = fixture.componentInstance;
+      comp.object = mockItem;
       fixture.detectChanges();
     }));
 
@@ -386,10 +383,6 @@ describe('ItemComponent', () => {
           }
         }), BrowserAnimationsModule],
         declarations: [ItemComponent, VarDirective],
-        providers: [
-          {provide: ITEM, useValue: mockItem}
-        ],
-
         schemas: [NO_ERRORS_SCHEMA]
       }).overrideComponent(ItemComponent, {
         set: {changeDetection: ChangeDetectionStrategy.Default}
@@ -399,6 +392,7 @@ describe('ItemComponent', () => {
     beforeEach(async(() => {
       fixture = TestBed.createComponent(ItemComponent);
       comp = fixture.componentInstance;
+      comp.object = mockItem;
       fixture.detectChanges();
       representations = comp.buildRepresentations('bogus', metadataField);
     }));
diff --git a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
index dcdfc1ccea..6795e36440 100644
--- a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
+++ b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
@@ -33,7 +33,7 @@ describe('MetadataRepresentationListComponent', () => {
   }));
 
   it(`should load ${representations.length} item-type-switcher components`, () => {
-    const fields = fixture.debugElement.queryAll(By.css('ds-listable-object-component-loader'));
+    const fields = fixture.debugElement.queryAll(By.css('ds-metadata-representation-loader'));
     expect(fields.length).toBe(representations.length);
   });
 
diff --git a/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts
index bc2571f6f9..711e1b9d3d 100644
--- a/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts
+++ b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts
@@ -38,7 +38,7 @@ describe('RelatedEntitiesSearchComponent', () => {
     comp = fixture.componentInstance;
     fixedFilterService = (comp as any).fixedFilterService;
     comp.relationType = mockRelationType;
-    comp.object = mockItem;
+    comp.item = mockItem;
     comp.relationEntityType = mockRelationEntityType;
     fixture.detectChanges();
   });
diff --git a/src/app/+my-dspace-page/my-dspace-page.module.ts b/src/app/+my-dspace-page/my-dspace-page.module.ts
index 685f1155be..be14aebdea 100644
--- a/src/app/+my-dspace-page/my-dspace-page.module.ts
+++ b/src/app/+my-dspace-page/my-dspace-page.module.ts
@@ -12,7 +12,7 @@ import { ClaimedSearchResultListElementComponent } from '../shared/object-list/m
 import { PoolSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component';
 import { MyDSpaceNewSubmissionComponent } from './my-dspace-new-submission/my-dspace-new-submission.component';
 import { ItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component';
-import { WorkspaceItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component';
+import { WorkspaceItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component';
 import { WorkflowItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component';
 import { ClaimedTaskSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component';
 import { MyDSpaceGuard } from './my-dspace.guard';
@@ -20,7 +20,7 @@ import { MyDSpaceConfigurationService } from './my-dspace-configuration.service'
 import { SearchResultListElementComponent } from '../shared/object-list/search-result-list-element/search-result-list-element.component';
 import { ItemSearchResultListElementSubmissionComponent } from '../shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component';
 import { WorkflowItemSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component';
-import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component';
+import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component';
 
 @NgModule({
   imports: [
diff --git a/src/app/+search-page/search-results/search-results.component.html b/src/app/+search-page/search-results/search-results.component.html
index 5a1e89858b..c08a4f023f 100644
--- a/src/app/+search-page/search-results/search-results.component.html
+++ b/src/app/+search-page/search-results/search-results.component.html
@@ -4,6 +4,7 @@
   [config]="searchConfig.pagination"
   [sortConfig]="searchConfig.sort"
   [objects]="searchResults"
+  [linkType]="linkType"
   [hideGear]="true">
 </ds-viewable-collection></div>
 <ds-loading *ngIf="hasNoValue(searchResults) || hasNoValue(searchResults.payload) || searchResults.isLoading" message="{{'loading.search-results' | translate}}"></ds-loading>
diff --git a/src/app/+search-page/search-results/search-results.component.ts b/src/app/+search-page/search-results/search-results.component.ts
index 8ec7b1cae4..46d15d97d9 100644
--- a/src/app/+search-page/search-results/search-results.component.ts
+++ b/src/app/+search-page/search-results/search-results.component.ts
@@ -8,6 +8,7 @@ import { PaginatedList } from '../../core/data/paginated-list';
 import { hasNoValue, isNotEmpty } from '../../shared/empty.util';
 import { SortOptions } from '../../core/cache/models/sort-options.model';
 import { ViewMode } from '../../core/shared/view-mode.model';
+import { CollectionElementLinkType } from '../../shared/object-collection/collection-element-link.type';
 
 @Component({
   selector: 'ds-search-results',
@@ -24,6 +25,8 @@ import { ViewMode } from '../../core/shared/view-mode.model';
 export class SearchResultsComponent {
   hasNoValue = hasNoValue;
 
+  @Input() linkType: CollectionElementLinkType;
+
   /**
    * The actual search result objects
    */
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html
index fab0cf5c07..fb69ed92f5 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html
@@ -1 +1 @@
-<ds-journal-issue-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-issue-search-result-grid-element>
\ No newline at end of file
+<ds-journal-issue-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-issue-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts
index d13feda406..4ad7770e1e 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts
@@ -1,15 +1,19 @@
 import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model';
 import { Item } from '../../../../core/shared/item.model';
-import { of as observableOf } from 'rxjs/internal/observable/of';
 import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec';
 import { JournalIssueGridElementComponent } from './journal-issue-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { of as observableOf } from 'rxjs';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -33,18 +37,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('JournalIssueGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [JournalIssueGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalIssueGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalIssueGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+      describe(`when the journal issue is rendered`, () => {
+        beforeEach(() => {
+          comp.object = mockItem;
+          fixture.detectChanges();
+        });
+
+        it(`should contain a JournalIssueSearchResultGridElementComponent`, () => {
+          const journalIssueGridElement = fixture.debugElement.query(By.css(`ds-journal-issue-search-result-grid-element`));
+          expect(journalIssueGridElement).not.toBeNull();
+        });
+      });
 
-describe('JournalIssueGridElementComponent', getEntityGridElementTestComponent(JournalIssueGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title']));
+  });
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html
index 06bcb10c4d..53713b47ee 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html
@@ -1 +1 @@
-<ds-journal-volume-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-volume-search-result-grid-element>
\ No newline at end of file
+<ds-journal-volume-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-volume-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts
index 8c854aeb77..427f1db3cd 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts
@@ -1,15 +1,19 @@
 import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model';
 import { Item } from '../../../../core/shared/item.model';
-import { of as observableOf } from 'rxjs/internal/observable/of';
-import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec';
 import { JournalVolumeGridElementComponent } from './journal-volume-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { of as observableOf } from 'rxjs';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { JournalIssueGridElementComponent } from '../journal-issue/journal-issue-grid-element.component';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -33,18 +37,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('JournalVolumeGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [JournalVolumeGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalVolumeGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalVolumeGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the journal volume is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a JournalVolumeSearchResultGridElementComponent`, () => {
+        const journalVolumeGridElement = fixture.debugElement.query(By.css(`ds-journal-volume-search-result-grid-element`));
+        expect(journalVolumeGridElement).not.toBeNull();
+      });
+    });
 
-describe('JournalVolumeGridElementComponent', getEntityGridElementTestComponent(JournalVolumeGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description']));
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html
index 1a7a6f5da8..594a0e0dc1 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html
@@ -1 +1 @@
-<ds-journal-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-search-result-grid-element>
\ No newline at end of file
+<ds-journal-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts
index 0d0f77842a..d0f3753840 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts
@@ -1,15 +1,18 @@
 import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model';
 import { Item } from '../../../../core/shared/item.model';
 import { of as observableOf } from 'rxjs/internal/observable/of';
-import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec';
 import { JournalGridElementComponent } from './journal-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -39,18 +42,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('JournalGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [JournalGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the journal is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a JournalGridElementComponent`, () => {
+        const journalGridElement = fixture.debugElement.query(By.css(`ds-journal-search-result-grid-element`));
+        expect(journalGridElement).not.toBeNull();
+      });
+    });
 
-describe('JournalGridElementComponent', getEntityGridElementTestComponent(JournalGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description']));
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html
index 23cc3ae285..18ff77bf23 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html
@@ -1,15 +1,21 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
             <div>
                 <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+            <div>
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                </ds-grid-thumbnail>
+            </div>
+        </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4>
             </ds-truncatable-part>
             <p *ngIf="dso.hasMetadata('creativework.datePublished')" class="item-date card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="1">
@@ -21,8 +27,8 @@
                     <span [innerHTML]="firstMetadataValue('journal.title')"></span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                    class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts
index 6619694f88..3cca9071b0 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts
@@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('JournalIssueGridElementComponent', getEntityGridElementTestComponent(JournalIssueSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title']));
+describe('JournalIssueSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalIssueSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title']));
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html
index f9ee1c51b7..07e50eb6fb 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html
@@ -1,11 +1,17 @@
     <ds-truncatable [id]="dso.id">
         <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-            <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+            <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
                 <div>
-                    <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async">
+                    <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                     </ds-grid-thumbnail>
                 </div>
             </a>
+            <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+                <div>
+                    <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                    </ds-grid-thumbnail>
+                </div>
+            </span>
             <div class="card-body">
                 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
                 <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
@@ -21,8 +27,8 @@
                         <span [innerHTML]="firstMetadataValue('dc.description')"></span>
                     </ds-truncatable-part>
                 </p>
-                <div class="text-center">
-                    <a [routerLink]="['/items/' + dso.id]"
+                <div *ngIf="linkType != linkTypes.None" class="text-center">
+                    <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                        class="lead btn btn-primary viewButton">View</a>
                 </div>
             </div>
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts
index bcdde289e0..8923b15ccb 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts
@@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('JournalVolumeGridElementComponent', getEntityGridElementTestComponent(JournalVolumeSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description']));
+describe('JournalVolumeSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalVolumeSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description']));
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html
index 72faf6a864..394e5241e1 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html
@@ -1,23 +1,29 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
             <div>
-                <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async">
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+            <div>
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                </ds-grid-thumbnail>
+            </div>
+        </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4>
             </ds-truncatable-part>
             <p *ngIf="dso.hasMetadata('creativework.editor')"
                class="item-publisher card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="1">
-                    <span class="item-editor">{{dso.firstMetadataValue('creativework.editor')}}</span>
+                    <span class="item-editor">{{firstMetadataValue('creativework.editor')}}</span>
                     <span *ngIf="dso.hasMetadata('creativework.publisher')" class="item-publisher">
             <span>, </span>
-                        {{dso.firstMetadataValue('creativework.publisher')}}
+                        {{firstMetadataValue('creativework.publisher')}}
           </span>
                 </ds-truncatable-part>
             </p>
@@ -26,8 +32,8 @@
                     <span [innerHTML]="firstMetadataValue('dc.description')"></span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                    class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts
index 1ce0aa2436..5712b211ff 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts
@@ -52,4 +52,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('JournalGridElementComponent', getEntityGridElementTestComponent(JournalSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description']));
+describe('JournalSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description']));
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html
index 1e418ba7c2..398feea260 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html
@@ -1 +1 @@
-<ds-journal-issue-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-issue-search-result-list-element>
\ No newline at end of file
+<ds-journal-issue-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-issue-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts
index d1cf67a07e..1a06e9f29c 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts
@@ -1,4 +1,4 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
 import { JournalIssueListElementComponent } from './journal-issue-list-element.component';
@@ -7,10 +7,7 @@ import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
 
-let journalIssueListElementComponent: JournalIssueListElementComponent;
-let fixture: ComponentFixture<JournalIssueListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -33,83 +30,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('JournalIssueListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ JournalIssueListElementComponent , TruncatePipe],
-      providers: [
-        { provide: TruncatableService, useValue: {} }
-      ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(JournalIssueListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+describe('JournalIssueListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(JournalIssueListElementComponent);
-    journalIssueListElementComponent = fixture.componentInstance;
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-  }));
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [JournalIssueListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalIssueListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  describe('When the item has a journal identifier', () => {
-    beforeEach(() => {
-      journalIssueListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the journal issues span', () => {
-      const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-issues'));
-      expect(journalIdentifierField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no journal identifier', () => {
-    beforeEach(() => {
-      journalIssueListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the journal issues span', () => {
-      const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-issues'));
-      expect(journalIdentifierField).toBeNull();
-    });
-  });
-
-  describe('When the item has a journal number', () => {
-    beforeEach(() => {
-      journalIssueListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalIssueListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-    it('should show the journal issue numbers span', () => {
-      const journalNumberField = fixture.debugElement.query(By.css('span.item-list-journal-issue-numbers'));
-      expect(journalNumberField).not.toBeNull();
-    });
-  });
+    describe(`when the journal issue is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-  describe('When the item has no journal number', () => {
-    beforeEach(() => {
-      journalIssueListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
+      it(`should contain a JournalIssueListElementComponent`, () => {
+        const journalIssueListElement = fixture.debugElement.query(By.css(`ds-journal-issue-search-result-list-element`));
+        expect(journalIssueListElement).not.toBeNull();
+      });
     });
 
-    it('should not show the journal issue numbers span', () => {
-      const journalNumberField = fixture.debugElement.query(By.css('span.item-list-journal-issue-numbers'));
-      expect(journalNumberField).toBeNull();
-    });
-  });
-});
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html
index c00de1c33d..bf967e6e78 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html
@@ -1 +1 @@
-<ds-journal-volume-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-volume-search-result-list-element>
\ No newline at end of file
+<ds-journal-volume-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-volume-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts
index 2ab4c1eaed..0d1401068b 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts
@@ -1,4 +1,4 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
 import { JournalVolumeListElementComponent } from './journal-volume-list-element.component';
@@ -7,10 +7,7 @@ import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
 
-let journalVolumeListElementComponent: JournalVolumeListElementComponent;
-let fixture: ComponentFixture<JournalVolumeListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -33,83 +30,42 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('JournalVolumeListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ JournalVolumeListElementComponent , TruncatePipe],
-      providers: [
-        { provide: TruncatableService, useValue: {} }
-      ],
+describe('JournalVolumeListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(JournalVolumeListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(JournalVolumeListElementComponent);
-    journalVolumeListElementComponent = fixture.componentInstance;
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [JournalVolumeListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalVolumeListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  }));
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalVolumeListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-  describe('When the item has a journal title', () => {
-    beforeEach(() => {
-      journalVolumeListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
+    describe(`when the journal volume is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-    it('should show the journal title span', () => {
-      const journalTitleField = fixture.debugElement.query(By.css('span.item-list-journal-volumes'));
-      expect(journalTitleField).not.toBeNull();
+      it(`should contain a JournalVolumeListElementComponent`, () => {
+        const journalVolumeListElement = fixture.debugElement.query(By.css(`ds-journal-volume-search-result-list-element`));
+        expect(journalVolumeListElement).not.toBeNull();
+      });
     });
-  });
 
-  describe('When the item has no journal title', () => {
-    beforeEach(() => {
-      journalVolumeListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the journal title span', () => {
-      const journalTitleField = fixture.debugElement.query(By.css('span.item-list-journal-volumes'));
-      expect(journalTitleField).toBeNull();
-    });
-  });
-
-  describe('When the item has a journal identifier', () => {
-    beforeEach(() => {
-      journalVolumeListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the journal identifiers span', () => {
-      const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-volume-identifiers'));
-      expect(journalIdentifierField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no journal identifier', () => {
-    beforeEach(() => {
-      journalVolumeListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the journal identifiers span', () => {
-      const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-volume-identifiers'));
-      expect(journalIdentifierField).toBeNull();
-    });
-  });
-});
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html
index 3df361e7f9..3e4dfb0b48 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html
@@ -1 +1 @@
-<ds-journal-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-search-result-list-element>
\ No newline at end of file
+<ds-journal-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts
index c9567fc731..432f81c171 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts
@@ -1,17 +1,13 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
 import { JournalListElementComponent } from './journal-list-element.component';
 import { of as observableOf } from 'rxjs';
 import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
 
-let journalListElementComponent: JournalListElementComponent;
-let fixture: ComponentFixture<JournalListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -28,60 +24,44 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
 
-describe('JournalListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ JournalListElementComponent , TruncatePipe],
-      providers: [
-        { provide: ITEM, useValue: mockItemWithMetadata},
-        { provide: TruncatableService, useValue: {} }
-      ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(JournalListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+describe('JournalListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(JournalListElementComponent);
-    journalListElementComponent = fixture.componentInstance;
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-  }));
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [JournalListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(JournalListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  describe('When the item has an issn', () => {
-    beforeEach(() => {
-      journalListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(JournalListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-    it('should show the journals span', () => {
-      const issnField = fixture.debugElement.query(By.css('span.item-list-journals'));
-      expect(issnField).not.toBeNull();
-    });
-  });
+    describe(`when the journal is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-  describe('When the item has no issn', () => {
-    beforeEach(() => {
-      journalListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
+      it(`should contain a JournalListElementComponent`, () => {
+        const journalListElement = fixture.debugElement.query(By.css(`ds-journal-search-result-list-element`));
+        expect(journalListElement).not.toBeNull();
+      });
     });
 
-    it('should not show the journals span', () => {
-      const issnField = fixture.debugElement.query(By.css('span.item-list-journals'));
-      expect(issnField).toBeNull();
-    });
-  });
-});
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html
index 98a8472975..38094c5c79 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html
@@ -1,8 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 <ds-truncatable [id]="dso.id">
-    <a
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
             [routerLink]="['/items/' + dso.id]" class="lead"
             [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('dc.title')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="1">
             <span *ngIf="dso.allMetadata(['publicationvolume.volumeNumber']).length > 0"
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts
index a41105e11e..ab02ce244e 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts
@@ -55,7 +55,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
     })
   });
 
-describe('JournalIssueListElementComponent', () => {
+describe('JournalIssueSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [JournalIssueSearchResultListElementComponent, TruncatePipe],
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html
index 9af28297d8..460c4a2187 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html
@@ -1,8 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 <ds-truncatable [id]="dso.id">
-    <a
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
             [routerLink]="['/items/' + dso.id]" class="lead"
             [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('dc.title')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="1">
             <span *ngIf="dso.allMetadata(['journal.title']).length > 0"
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts
index 2a6c68ed60..4ac4e51439 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts
@@ -54,7 +54,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
     })
   });
 
-describe('JournalVolumeListElementComponent', () => {
+describe('JournalVolumeSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [JournalVolumeSearchResultListElementComponent, TruncatePipe],
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html
index 20b689327a..a43132d332 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html
@@ -1,8 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 <ds-truncatable [id]="dso.id">
-    <a
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
             [routerLink]="['/items/' + dso.id]" class="lead"
             [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('dc.title')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="1">
             <span *ngIf="dso.allMetadata(['creativeworkseries.issn']).length > 0"
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts
index f7eced8cde..46eeaa1fb2 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts
@@ -50,7 +50,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
   }
 );
 
-describe('JournalListElementComponent', () => {
+describe('JournalSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [JournalSearchResultListElementComponent, TruncatePipe],
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
index d49d80b15e..4b306b73f2 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
@@ -4,7 +4,7 @@
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail>
     </ds-metadata-field-wrapper>
     <ds-generic-item-page-field [item]="object"
       [fields]="['publicationvolume.volumeNumber']"
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
index d96bff9570..ec7cd94127 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
@@ -4,7 +4,7 @@
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail>
     </ds-metadata-field-wrapper>
     <ds-generic-item-page-field [item]="object"
       [fields]="['publicationvolume.volumeNumber']"
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
index 05d7ffc802..c2a5142ca9 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
@@ -4,7 +4,7 @@
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail>
     </ds-metadata-field-wrapper>
     <ds-generic-item-page-field class="item-page-fields" [item]="object"
       [fields]="['creativeworkseries.issn']"
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
index 29398befb5..10fdd3bf93 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
@@ -1,19 +1,16 @@
 import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
 import { ItemDataService } from '../../../../core/data/item-data.service';
 import { Item } from '../../../../core/shared/item.model';
 import { By } from '@angular/platform-browser';
 import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
 import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
 import { isNotEmpty } from '../../../../shared/empty.util';
 import { JournalComponent } from './journal.component';
-import { of as observableOf } from 'rxjs';
 import { GenericItemPageFieldComponent } from '../../../../+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 
@@ -55,7 +52,6 @@ describe('JournalComponent', () => {
       })],
       declarations: [JournalComponent, GenericItemPageFieldComponent, TruncatePipe],
       providers: [
-        {provide: ITEM, useValue: mockItem},
         {provide: ItemDataService, useValue: {}},
         {provide: TruncatableService, useValue: {}}
       ],
@@ -69,6 +65,7 @@ describe('JournalComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(JournalComponent);
     comp = fixture.componentInstance;
+    comp.object = mockItem;
     fixture.detectChanges();
   }));
 
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html
index 8ad7ce3590..f42ffb87e9 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html
@@ -1 +1 @@
-<ds-orgunit-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-orgunit-search-result-grid-element>
\ No newline at end of file
+<ds-orgunit-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-orgunit-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts
index 15c7b75bf5..1140f7d908 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts
@@ -1,15 +1,17 @@
-import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model';
 import { Item } from '../../../../core/shared/item.model';
 import { of as observableOf } from 'rxjs/internal/observable/of';
-import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec';
 import { OrgunitGridElementComponent } from './orgunit-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -39,18 +41,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('OrgunitGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [OrgunitGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(OrgunitGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(OrgunitGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the org unit is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a OrgunitGridElementComponent`, () => {
+        const orgunitGridElement = fixture.debugElement.query(By.css(`ds-orgunit-search-result-grid-element`));
+        expect(orgunitGridElement).not.toBeNull();
+      });
+    });
 
-describe('OrgunitGridElementComponent', getEntityGridElementTestComponent(OrgunitGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city']));
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html
index b837422121..a431f5979f 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html
@@ -1 +1 @@
-<ds-person-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-person-search-result-grid-element>
\ No newline at end of file
+<ds-person-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-person-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts
index 25268261e1..fdcc84d864 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts
@@ -1,15 +1,17 @@
-import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model';
 import { Item } from '../../../../core/shared/item.model';
 import { of as observableOf } from 'rxjs/internal/observable/of';
-import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec';
 import { PersonGridElementComponent } from './person-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -33,18 +35,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('PersonGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [PersonGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(PersonGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(PersonGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the person is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a PersonGridElementComponent`, () => {
+        const personGridElement = fixture.debugElement.query(By.css(`ds-person-search-result-grid-element`));
+        expect(personGridElement).not.toBeNull();
+      });
+    });
 
-describe('PersonGridElementComponent', getEntityGridElementTestComponent(PersonGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle']));
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html
index 094d109dde..0c87599399 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html
@@ -1 +1 @@
-<ds-project-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-project-search-result-grid-element>
\ No newline at end of file
+<ds-project-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-project-search-result-grid-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts
index 969912976c..701ca46a73 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts
@@ -6,10 +6,15 @@ import { ProjectGridElementComponent } from './project-grid-element.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
+import { async, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { PersonGridElementComponent } from '../person/person-grid-element.component';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
+import { By } from '@angular/platform-browser';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -27,18 +32,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('ProjectGridElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [NoopAnimationsModule],
+        declarations: [ProjectGridElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(ProjectGridElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(ProjectGridElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the project is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a ProjectGridElementComponent`, () => {
+        const projectGridElement = fixture.debugElement.query(By.css(`ds-project-search-result-grid-element`));
+        expect(projectGridElement).not.toBeNull();
+      });
+    });
 
-describe('ProjectGridElementComponent', getEntityGridElementTestComponent(ProjectGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description']));
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html
index 675044294a..5c42be2b24 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html
@@ -1,34 +1,40 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
             <div>
                 <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+            <div>
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                </ds-grid-thumbnail>
+            </div>
+        </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('organization.legalName')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('organization.legalName')"></h4>
             </ds-truncatable-part>
-            <p *ngIf="dso.hasMetadata('organization.foundingDate')" class="dso-date card-text text-muted">
+            <p *ngIf="dso.hasMetadata('organization.foundingDate')" class="item-date card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="1">
                     <span [innerHTML]="firstMetadataValue('organization.foundingDate')"></span>
                 </ds-truncatable-part>
             </p>
             <p *ngIf="dso.hasMetadata('organization.address.addressCountry')"
-               class="dso-location card-text">
+               class="item-location card-text">
                 <ds-truncatable-part [id]="dso.id" [minLines]="3">
-                    <span class="dso-country">{{dso.firstMetadataValue('organization.address.addressCountry')}}</span>
-                    <span *ngIf="dso.hasMetadata('organization.address.addressLocality')" class="dso-city">
+                    <span class="item-country">{{firstMetadataValue('organization.address.addressCountry')}}</span>
+                    <span *ngIf="dso.hasMetadata('organization.address.addressLocality')" class="item-city">
             <span>, </span>
-                        {{dso.firstMetadataValue('organization.address.addressLocality')}}
+                        {{firstMetadataValue('organization.address.addressLocality')}}
           </span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
-                   class="lead btn btn-primary viewButton">View</a>
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
+                  class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
     </div>
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts
index 579161f940..bb4cb93a70 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts
@@ -52,4 +52,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('OrgunitGridElementComponent', getEntityGridElementTestComponent(OrgunitSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city']));
+describe('OrgunitSearchResultGridElementComponent', getEntityGridElementTestComponent(OrgunitSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city']));
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html
index 378bf43ec2..b7eed7c8b4 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html
@@ -1,28 +1,35 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
+           class="card-img-top full-width">
             <div>
-                <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async">
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+            <div>
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                </ds-grid-thumbnail>
+            </div>
+        </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('person.familyName') + ', ' + dso.firstMetadataValue('person.givenName')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></h4>
             </ds-truncatable-part>
-            <p *ngIf="dso.hasMetadata('person.email')" class="dso-email card-text text-muted">
+            <p *ngIf="dso.hasMetadata('person.email')" class="item-email card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="1">
                     <span [innerHTML]="firstMetadataValue('person.email')"></span>
                 </ds-truncatable-part>
             </p>
-            <p *ngIf="dso.hasMetadata('person.jobTitle')" class="dso-jobtitle card-text">
+            <p *ngIf="dso.hasMetadata('person.jobTitle')" class="item-jobtitle card-text">
                 <ds-truncatable-part [id]="dso.id" [minLines]="3">
                     <span [innerHTML]="firstMetadataValue('person.jobTitle')"></span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                    class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts
index 6a5c79c770..05baa7a63f 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts
@@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('PersonGridElementComponent', getEntityGridElementTestComponent(PersonSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle']));
+describe('PersonSearchResultGridElementComponent', getEntityGridElementTestComponent(PersonSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle']));
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html
index 4e98f94fb9..f3a0dea81f 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html
@@ -1,23 +1,29 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
             <div>
                 <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+      <div>
+        <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+        </ds-grid-thumbnail>
+      </div>
+    </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4>
             </ds-truncatable-part>
-            <p *ngIf="dso.hasMetadata('dc.description')" class="dso-description card-text text-muted">
+            <p *ngIf="dso.hasMetadata('dc.description')" class="item-description card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="3">
                     <span [innerHTML]="firstMetadataValue('dc.description')"></span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                    class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts
index 64fedf155d..a9c0774c8c 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts
@@ -40,4 +40,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('ProjectGridElementComponent', getEntityGridElementTestComponent(ProjectSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description']));
+describe('ProjectSearchResultGridElementComponent', getEntityGridElementTestComponent(ProjectSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description']));
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html
index bacec900c0..bdeb37dcd8 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html
@@ -1,13 +1,13 @@
 <ng-template #descTemplate>
   <span class="text-muted">
-      <span *ngIf="object.allMetadata(['dc.description']).length > 0"
+      <span *ngIf="metadataRepresentation.allMetadata(['dc.description']).length > 0"
             class="item-list-job-title">
-        <span [innerHTML]="firstMetadataValue(['dc.description'])"></span>
+        <span [innerHTML]="metadataRepresentation.firstMetadataValue(['dc.description'])"></span>
       </span>
   </span>
 </ng-template>
-<ds-truncatable [id]="object.id">
-  <a [routerLink]="['/items/' + object.id]"
-     [innerHTML]="firstMetadataValue('organization.legalName')"
+<ds-truncatable [id]="metadataRepresentation.id">
+  <a [routerLink]="['/items/' + metadataRepresentation.id]"
+     [innerHTML]="metadataRepresentation.firstMetadataValue('organization.legalName')"
      [tooltip]="descTemplate"></a>
 </ds-truncatable>
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts
index 708139da95..2025faac75 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts
@@ -1,8 +1,7 @@
 import { Component } from '@angular/core';
-import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component';
-import { Item } from '../../../../core/shared/item.model';
 import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator';
 import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
+import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';
 
 @metadataRepresentationComponent('OrgUnit', MetadataRepresentationType.Item)
 @Component({
@@ -12,5 +11,6 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep
 /**
  * The component for displaying a list element for an item of the type OrgUnit
  */
-export class OrgunitItemPageListElementComponent extends AbstractListableElementComponent<Item> {
+export class OrgunitItemPageListElementComponent {
+  metadataRepresentation: ItemMetadataRepresentation;
 }
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html
index 246bac000c..ad0eec0313 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html
@@ -1 +1 @@
-<ds-orgunit-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-orgunit-search-result-list-element>
\ No newline at end of file
+<ds-orgunit-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-orgunit-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts
index f1ff6b1dce..d0254e675d 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts
@@ -1,17 +1,13 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
 import { OrgUnitListElementComponent } from './orgunit-list-element.component';
 import { of as observableOf } from 'rxjs';
 import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
 
-let orgUnitListElementComponent: OrgUnitListElementComponent;
-let fixture: ComponentFixture<OrgUnitListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -28,60 +24,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('OrgUnitListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ OrgUnitListElementComponent , TruncatePipe],
-      providers: [
-        { provide: ITEM, useValue: mockItemWithMetadata},
-        { provide: TruncatableService, useValue: {} }
-      ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(OrgUnitListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+describe('OrgunitListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(OrgUnitListElementComponent);
-    orgUnitListElementComponent = fixture.componentInstance;
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-  }));
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [OrgUnitListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(OrgUnitListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  describe('When the item has an orgunit description', () => {
-    beforeEach(() => {
-      orgUnitListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(OrgUnitListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-    it('should show the description span', () => {
-      const orgunitDescriptionField = fixture.debugElement.query(By.css('span.item-list-orgunit-description'));
-      expect(orgunitDescriptionField).not.toBeNull();
-    });
-  });
+    describe(`when the orgunit is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-  describe('When the item has no orgunit description', () => {
-    beforeEach(() => {
-      orgUnitListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
+      it(`should contain a OrgUnitListElementComponent`, () => {
+        const orgunitListElement = fixture.debugElement.query(By.css(`ds-orgunit-search-result-list-element`));
+        expect(orgunitListElement).not.toBeNull();
+      });
     });
 
-    it('should not show the description span', () => {
-      const orgunitDescriptionField = fixture.debugElement.query(By.css('span.item-list-orgunit-description'));
-      expect(orgunitDescriptionField).toBeNull();
-    });
-  });
-});
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html
index e9627b504e..fdc9dd8943 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html
@@ -1,15 +1,15 @@
 <ng-template #descTemplate>
   <span class="text-muted">
-      <span *ngIf="object.allMetadata(['person.jobTitle']).length > 0"
+      <span *ngIf="metadataRepresentation.allMetadata(['person.jobTitle']).length > 0"
             class="item-list-job-title">
-              <span *ngFor="let value of allMetadataValues(['person.jobTitle']); let last=last;">
+              <span *ngFor="let value of metadataRepresentation.allMetadataValues(['person.jobTitle']); let last=last;">
                   <span [innerHTML]="value"><span [innerHTML]="value"></span></span>
               </span>
       </span>
   </span>
 </ng-template>
-<ds-truncatable [id]="object.id">
-  <a [routerLink]="['/items/' + object.id]"
-     [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"
+<ds-truncatable [id]="metadataRepresentation.id">
+  <a [routerLink]="['/items/' + metadataRepresentation.id]"
+     [innerHTML]="metadataRepresentation.firstMetadataValue('person.familyName') + ', ' + metadataRepresentation.firstMetadataValue('person.givenName')"
      [tooltip]="descTemplate"></a>
 </ds-truncatable>
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts
index 696640dae5..6679852cdb 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts
@@ -3,6 +3,8 @@ import { AbstractListableElementComponent } from '../../../../shared/object-coll
 import { Item } from '../../../../core/shared/item.model';
 import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator';
 import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
+import { MetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component';
+import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';
 
 @metadataRepresentationComponent('Person', MetadataRepresentationType.Item)
 @Component({
@@ -12,5 +14,6 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep
 /**
  * The component for displaying a list element for an item of the type Person
  */
-export class PersonItemPageListElementComponent extends AbstractListableElementComponent<Item> {
+export class PersonItemPageListElementComponent {
+  metadataRepresentation: ItemMetadataRepresentation;
 }
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html
index 9df315824a..dbc3a42a05 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html
@@ -1 +1 @@
-<ds-person-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-person-search-result-list-element>
\ No newline at end of file
+<ds-person-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-person-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts
index 7d9eaf0d16..acc149c1df 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts
@@ -6,11 +6,9 @@ import { of as observableOf } from 'rxjs';
 import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { OrgUnitListElementComponent } from '../orgunit/orgunit-list-element.component';
 
-let personListElementComponent: PersonListElementComponent;
-let fixture: ComponentFixture<PersonListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -27,59 +25,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('PersonListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ PersonListElementComponent , TruncatePipe],
-      providers: [
-        { provide: TruncatableService, useValue: {} }
-      ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(PersonListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+describe('PersonListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(PersonListElementComponent);
-    personListElementComponent = fixture.componentInstance;
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-  }));
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [PersonListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(PersonListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  describe('When the item has a job title', () => {
-    beforeEach(() => {
-      personListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(PersonListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-    it('should show the job title span', () => {
-      const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title'));
-      expect(jobTitleField).not.toBeNull();
-    });
-  });
+    describe(`when the person is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-  describe('When the item has no job title', () => {
-    beforeEach(() => {
-      personListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
+      it(`should contain a PersonListElementComponent`, () => {
+        const personListElement = fixture.debugElement.query(By.css(`ds-person-search-result-list-element`));
+        expect(personListElement).not.toBeNull();
+      });
     });
 
-    it('should not show the job title span', () => {
-      const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title'));
-      expect(jobTitleField).toBeNull();
-    });
-  });
-});
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html
index 6d33c48fb4..8f74452eaa 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html
@@ -1 +1 @@
-<ds-project-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-project-search-result-list-element>
\ No newline at end of file
+<ds-project-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-project-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts
index 0c171ae9ba..5591a5b625 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts
@@ -1,17 +1,14 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
-import { ProjectListElementComponent } from './project-list-element.component';
 import { of as observableOf } from 'rxjs';
 import { Item } from '../../../../core/shared/item.model';
 import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
 import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { PersonListElementComponent } from '../person/person-list-element.component';
+import { ProjectListElementComponent } from './project-list-element.component';
 
-let projectListElementComponent: ProjectListElementComponent;
-let fixture: ComponentFixture<ProjectListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -28,60 +25,42 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     // ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
+describe('ProjectListElementComponent',
+  () => {
+    let comp;
+    let fixture;
 
-describe('ProjectListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ ProjectListElementComponent , TruncatePipe],
-      providers: [
-        { provide: ITEM, useValue: mockItemWithMetadata},
-        { provide: TruncatableService, useValue: {} }
-      ],
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(ProjectListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [ProjectListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(ProjectListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
 
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(ProjectListElementComponent);
-    projectListElementComponent = fixture.componentInstance;
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(ProjectListElementComponent);
+      comp = fixture.componentInstance;
+    }));
 
-  }));
+    describe(`when the project is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
 
-  // describe('When the item has a status', () => {
-  //   beforeEach(() => {
-  //     projectListElementComponent.item = mockItemWithMetadata;
-  //     fixture.detectChanges();
-  //   });
-  //
-  //   it('should show the status span', () => {
-  //     const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
-  //     expect(statusField).not.toBeNull();
-  //   });
-  // });
-  //
-  // describe('When the item has no status', () => {
-  //   beforeEach(() => {
-  //     projectListElementComponent.item = mockItemWithoutMetadata;
-  //     fixture.detectChanges();
-  //   });
-  //
-  //   it('should not show the status span', () => {
-  //     const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
-  //     expect(statusField).toBeNull();
-  //   });
-  // });
-});
+      it(`should contain a ProjectListElementComponent`, () => {
+        const projectListElement = fixture.debugElement.query(By.css(`ds-project-search-result-list-element`));
+        expect(projectListElement).not.toBeNull();
+      });
+    });
+
+  });
\ No newline at end of file
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html
index 4b32ac8278..39a7add763 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html
@@ -1,8 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 <ds-truncatable [id]="dso.id">
-    <a
-            [routerLink]="['/items/' + dso.id]" class="lead"
-            [innerHTML]="firstMetadataValue('organization.legalName')"></a>
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
+       [routerLink]="['/items/' + dso.id]" class="lead"
+       [innerHTML]="firstMetadataValue('organization.legalName')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('organization.legalName')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="3">
             <span *ngIf="dso.allMetadata(['dc.description']).length > 0"
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts
index 72e3f246a9..6093b5c680 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts
@@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
     })
   });
 
-describe('OrgUnitListElementComponent', () => {
+describe('OrgUnitSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [ OrgunitSearchResultListElementComponent , TruncatePipe],
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html
index c3a471c486..b2791c4891 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html
@@ -1,8 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 <ds-truncatable [id]="dso.id">
-    <a
-            [routerLink]="['/items/' + dso.id]" class="lead"
-            [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></a>
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
+       [routerLink]="['/items/' + dso.id]" class="lead"
+       [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="1">
             <span *ngIf="dso.allMetadata(['person.jobTitle']).length > 0"
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts
index dac5487164..a240d31bec 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts
@@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
     })
   });
 
-describe('PersonListElementComponent', () => {
+describe('PersonSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [PersonSearchResultListElementComponent, TruncatePipe],
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html
index df14563102..95bff99e7e 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html
@@ -1,16 +1,19 @@
-    <ds-truncatable [id]="dso.id">
-        <ds-item-type-badge [object]="dso"></ds-item-type-badge>
-        <a
-                [routerLink]="['/items/' + dso.id]" class="lead"
-                [innerHTML]="firstMetadataValue('dc.title')"></a>
-        <!--<span class="text-muted">-->
-        <!--<ds-truncatable-part [id]="dso.id" [minLines]="1">-->
-        <!--<span *ngIf="dso.allMetadata(['project.identifier.status']).length > 0"-->
-        <!--class="item-list-status">-->
-        <!--<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">-->
-        <!--<span [innerHTML]="value"><span [innerHTML]="value"></span></span>-->
-        <!--</span>-->
-        <!--</span>-->
-        <!--</ds-truncatable-part>-->
-        <!--</span>-->
-    </ds-truncatable>
+<ds-truncatable [id]="dso.id">
+    <ds-item-type-badge [object]="dso"></ds-item-type-badge>
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
+       [routerLink]="['/items/' + dso.id]" class="lead"
+       [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <span *ngIf="linkType == linkTypes.None"
+          class="lead"
+          [innerHTML]="firstMetadataValue('dc.title')"></span>
+    <!--<span class="text-muted">-->
+    <!--<ds-truncatable-part [id]="dso.id" [minLines]="1">-->
+    <!--<span *ngIf="dso.allMetadata(['project.identifier.status']).length > 0"-->
+    <!--class="item-list-status">-->
+    <!--<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">-->
+    <!--<span [innerHTML]="value"><span [innerHTML]="value"></span></span>-->
+    <!--</span>-->
+    <!--</span>-->
+    <!--</ds-truncatable-part>-->
+    <!--</span>-->
+</ds-truncatable>
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts
index e08e25eb69..128190a88b 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts
@@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(
     })
   });
 
-describe('ProjectListElementComponent', () => {
+describe('ProjectSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [ProjectSearchResultListElementComponent, TruncatePipe],
diff --git a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html
index 637e59b4fb..c88eb6d439 100644
--- a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html
@@ -4,7 +4,7 @@
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="object.getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail>
     </ds-metadata-field-wrapper>
     <ds-generic-item-page-field [item]="object"
       [fields]="['organization.foundingDate']"
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html
index 04d7b9e062..ad62b26a4b 100644
--- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html
@@ -1,12 +1,12 @@
 <h2 class="item-page-title-field">
-  {{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="[item?.firstMetadata('person.familyName'), item?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values>
+  {{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="[object?.firstMetadata('person.familyName'), object?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values>
 </h2>
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.item.getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail>
     </ds-metadata-field-wrapper>
-    <ds-generic-item-page-field [item]="item"
+    <ds-generic-item-page-field [item]="object"
       [fields]="['person.email']"
       [label]="'person.page.email'">
     </ds-generic-item-page-field>
@@ -14,7 +14,7 @@
       <!--[fields]="['person.identifier.orcid']"-->
       <!--[label]="'person.page.orcid'">-->
     <!--</ds-generic-item-page-field>-->
-    <ds-generic-item-page-field [item]="item"
+    <ds-generic-item-page-field [item]="object"
       [fields]="['person.birthDate']"
       [label]="'person.page.birthdate'">
     </ds-generic-item-page-field>
@@ -32,26 +32,26 @@
       [items]="orgUnits$ | async"
       [label]="'relationships.isOrgUnitOf' | translate">
     </ds-related-items>
-    <ds-generic-item-page-field [item]="item"
+    <ds-generic-item-page-field [item]="object"
       [fields]="['person.jobTitle']"
       [label]="'person.page.jobtitle'">
     </ds-generic-item-page-field>
-    <ds-generic-item-page-field [item]="item"
+    <ds-generic-item-page-field [item]="object"
       [fields]="['person.familyName']"
       [label]="'person.page.lastname'">
     </ds-generic-item-page-field>
-    <ds-generic-item-page-field [item]="item"
+    <ds-generic-item-page-field [item]="object"
       [fields]="['person.givenName']"
       [label]="'person.page.firstname'">
     </ds-generic-item-page-field>
     <div>
-      <a class="btn btn-outline-primary" [routerLink]="['/items/' + item.id + '/full']">
+      <a class="btn btn-outline-primary" [routerLink]="['/items/' + object.id + '/full']">
         {{"item.page.link.full" | translate}}
       </a>
     </div>
   </div>
   <div class="mt-5 w-100">
-    <ds-related-entities-search [item]="item"
+    <ds-related-entities-search [item]="object"
       [relationType]="'isAuthorOfPublication'">
     </ds-related-entities-search>
   </div>
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.html b/src/app/entity-groups/research-entities/item-pages/project/project.component.html
index f9596e7f0c..615cd3c6cb 100644
--- a/src/app/entity-groups/research-entities/item-pages/project/project.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.html
@@ -4,7 +4,7 @@
 <div class="row">
   <div class="col-xs-12 col-md-4">
     <ds-metadata-field-wrapper>
-      <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/project-placeholder.svg'"></ds-thumbnail>
+      <ds-thumbnail [thumbnail]="object.getThumbnail() | async" [defaultImage]="'assets/images/project-placeholder.svg'"></ds-thumbnail>
     </ds-metadata-field-wrapper>
     <!--<ds-generic-item-page-field [item]="item"-->
       <!--[fields]="['project.identifier.status']"-->
diff --git a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html
index 3e304d9eb3..7515b830b9 100644
--- a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html
+++ b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html
@@ -1,5 +1,5 @@
 <form #form="ngForm" (ngSubmit)="onSubmit(currentObject)"
-      [action]="action" (keydown)="onKeydown($event)"
+      [action]="action"
       (keydown.arrowdown)="shiftFocusDown($event)"
       (keydown.arrowup)="shiftFocusUp($event)" (keydown.esc)="close()"
       (dsClickOutside)="close();">
@@ -14,9 +14,7 @@
         <div class="dropdown-list">
             <div *ngFor="let suggestionOption of suggestions">
                 <button class="d-block dropdown-item"  (click)="onClickSuggestion(suggestionOption)" #suggestion>
-                    <div class="click-blocker">
-                    </div>
-                    <ds-listable-object-component-loader [object]="suggestionOption" [viewMode]="viewMode"></ds-listable-object-component-loader>
+                    <ds-listable-object-component-loader [object]="suggestionOption" [viewMode]="viewMode" [linkType]="linkTypes.None"></ds-listable-object-component-loader>
                 </button>
             </div>
         </div>
diff --git a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts
index e1e9d18c8f..92775f25c6 100644
--- a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts
+++ b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts
@@ -3,6 +3,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
 import { InputSuggestionsComponent } from '../input-suggestions.component';
 import { DSpaceObject } from '../../../core/shared/dspace-object.model';
 import { ViewMode } from '../../../core/shared/view-mode.model';
+import { CollectionElementLinkType } from '../../object-collection/collection-element-link.type';
 
 @Component({
   selector: 'ds-dso-input-suggestions',
@@ -24,6 +25,7 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
  */
 export class DsoInputSuggestionsComponent extends InputSuggestionsComponent {
   viewMode = ViewMode.ListElement;
+  linkTypes = CollectionElementLinkType;
   /**
    * The suggestions that should be shown
    */
diff --git a/src/app/shared/input-suggestions/input-suggestions.component.scss b/src/app/shared/input-suggestions/input-suggestions.component.scss
index eb0db5ed42..263c315d30 100644
--- a/src/app/shared/input-suggestions/input-suggestions.component.scss
+++ b/src/app/shared/input-suggestions/input-suggestions.component.scss
@@ -5,19 +5,9 @@
         white-space: normal;
         word-break: break-word;
         padding: $input-padding-y $input-padding-x;
-        position: relative;
-
         &:focus {
             outline: none;
         }
-
-        .click-blocker {
-            position: absolute;
-            top: 0;
-            left: 0;
-            right: 0;
-            bottom: 0;
-        }
     }
 }
 
diff --git a/src/app/shared/object-collection/collection-element-link.type.ts b/src/app/shared/object-collection/collection-element-link.type.ts
new file mode 100644
index 0000000000..7bef4cf393
--- /dev/null
+++ b/src/app/shared/object-collection/collection-element-link.type.ts
@@ -0,0 +1,3 @@
+export enum CollectionElementLinkType {
+  None, Link, ExternalLink
+}
\ No newline at end of file
diff --git a/src/app/shared/object-collection/object-collection.component.html b/src/app/shared/object-collection/object-collection.component.html
index cd845b5b47..199f6d0bcf 100644
--- a/src/app/shared/object-collection/object-collection.component.html
+++ b/src/app/shared/object-collection/object-collection.component.html
@@ -3,6 +3,7 @@
                 [objects]="objects"
                 [hasBorder]="hasBorder"
                 [hideGear]="hideGear"
+                [linkType]="linkType"
                 [context]="context"
                 (paginationChange)="onPaginationChange($event)"
                 (pageChange)="onPageChange($event)"
@@ -16,6 +17,7 @@
                 [sortConfig]="sortConfig"
                 [objects]="objects"
                 [hideGear]="hideGear"
+                [linkType]="linkType"
                 [context]="context"
                 (paginationChange)="onPaginationChange($event)"
                 (pageChange)="onPageChange($event)"
@@ -29,6 +31,7 @@
                   [sortConfig]="sortConfig"
                   [objects]="objects"
                   [hideGear]="hideGear"
+                  [linkType]="linkType"
                   [context]="context"
                   *ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement">
 </ds-object-detail>
diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts
index 175bd3ea53..2756d38639 100644
--- a/src/app/shared/object-collection/object-collection.component.ts
+++ b/src/app/shared/object-collection/object-collection.component.ts
@@ -11,6 +11,9 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options
 import { ListableObject } from './shared/listable-object.model';
 import { isNotEmpty } from '../empty.util';
 import { ViewMode } from '../../core/shared/view-mode.model';
+import { CollectionElementLinkType } from './collection-element-link.type';
+import { PaginatedList } from '../../core/data/paginated-list';
+import { Context } from '../../core/shared/context.model';
 
 @Component({
   selector: 'ds-viewable-collection',
@@ -19,12 +22,13 @@ import { ViewMode } from '../../core/shared/view-mode.model';
 })
 export class ObjectCollectionComponent implements OnInit {
 
-  @Input() objects: RemoteData<ListableObject[]>;
+  @Input() objects: RemoteData<PaginatedList<ListableObject>>;
   @Input() config?: PaginationComponentOptions;
   @Input() sortConfig: SortOptions;
   @Input() hasBorder = false;
   @Input() hideGear = false;
-  @Input() context: string;
+  @Input() linkType: CollectionElementLinkType;
+  @Input() context: Context;
   pageInfo: Observable<PageInfo>;
   /**
    * An event fired when the page is changed.
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
deleted file mode 100644
index d10ee1a0dd..0000000000
--- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { ListableObjectComponentLoaderComponent } from './listable-object-component-loader.component';
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { PageInfo } from '../../../core/shared/page-info.model';
-import { Item } from '../../../core/shared/item.model';
-import { PaginatedList } from '../../../core/data/paginated-list';
-import * as decorator from '../item-type-decorator';
-import { getComponentByItemType} from '../item-type-decorator';
-import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
-import { createSuccessfulRemoteDataObject$ } from '../../testing/utils';
-import createSpy = jasmine.createSpy;
-import { ViewMode } from '../../../core/shared/view-mode.model';
-
-const relationType = 'type';
-const mockItem: Item = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'test item'
-      }
-    ],
-    'relationship.type': [
-      {
-        language: 'en_US',
-        value: relationType
-      }
-    ]
-  }
-});
-const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(), mockItem);
-let viewMode = ViewMode.StandalonePage;
-
-describe('ItemTypeSwitcherComponent', () => {
-  let comp: ListableObjectComponentLoaderComponent;
-  let fixture: ComponentFixture<ListableObjectComponentLoaderComponent>;
-
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ ListableObjectComponentLoaderComponent ],
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).compileComponents();  // compile template and css
-  }));
-
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(ListableObjectComponentLoaderComponent);
-    comp = fixture.componentInstance;
-    comp.object = mockItem;
-    comp.viewMode = viewMode;
-    spyOnProperty(decorator, 'getComponentByItemType').and.returnValue(createSpy('getComponentByItemType'))
-  }));
-
-  describe('when the injected object is of type Item', () => {
-    beforeEach(() => {
-      viewMode = ViewMode.StandalonePage;
-      comp.object = mockItem;
-      comp.viewMode = viewMode;
-    });
-
-    describe('when calling getComponent', () => {
-      beforeEach(() => {
-        (comp as any).getComponent();
-      });
-
-      it('should call getComponentByItemType with parameters type and viewMode', () => {
-        expect(decorator.getComponentByItemType).toHaveBeenCalledWith(relationType, viewMode);
-      });
-    });
-  });
-
-  describe('when the injected object is of type MetadataRepresentation', () => {
-    beforeEach(() => {
-      viewMode = ViewMode.MetadataField;
-      comp.object = mockItemMetadataRepresentation;
-      comp.viewMode = viewMode;
-    });
-
-    describe('when calling getComponent', () => {
-      beforeEach(() => {
-        (comp as any).getComponent();
-      });
-
-      it('should call getComponentByItemType with parameters type, viewMode and representationType', () => {
-        expect(decorator.getComponentByItemType).toHaveBeenCalledWith(relationType, viewMode, mockItemMetadataRepresentation.representationType);
-      });
-    });
-  });
-
-});
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts
index 45367df857..fb315303f6 100644
--- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts
@@ -5,6 +5,7 @@ import { Context } from '../../../../core/shared/context.model';
 import { getListableObjectComponent } from './listable-object.decorator';
 import { GenericConstructor } from '../../../../core/shared/generic-constructor';
 import { ListableObjectDirective } from './listable-object.directive';
+import { CollectionElementLinkType } from '../../collection-element-link.type';
 
 @Component({
   selector: 'ds-listable-object-component-loader',
@@ -28,6 +29,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit {
   @Input() viewMode: ViewMode;
 
   @Input() context: Context;
+  @Input() linkType: CollectionElementLinkType;
   @ViewChild(ListableObjectDirective) listableObjectDirective: ListableObjectDirective;
 
   constructor(private componentFactoryResolver: ComponentFactoryResolver) {
@@ -42,6 +44,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit {
     const componentRef = viewContainerRef.createComponent(componentFactory);
     (<Component>componentRef.instance as any).object = this.object;
     (<Component>componentRef.instance as any).index = this.index;
+    (<Component>componentRef.instance as any).linkType = this.linkType;
   }
 
   /**
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts
index 29cd1287a1..6098875b4d 100644
--- a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts
@@ -38,7 +38,6 @@ export function getListableObjectComponent(types: string[], viewMode: ViewMode,
       const typeModeMap = typeMap.get(viewMode);
       if (hasValue(typeModeMap)) {
         if (hasValue(typeModeMap.get(context))) {
-          console.log(typeModeMap.get(context));
           return typeModeMap.get(context);
         }
         if (bestMatchValue < 2 && hasValue(typeModeMap.get(DEFAULT_CONTEXT))) {
@@ -52,6 +51,5 @@ export function getListableObjectComponent(types: string[], viewMode: ViewMode,
       }
     }
   }
-  console.log(bestMatch);
   return bestMatch;
 }
\ No newline at end of file
diff --git a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts
index d6819b04da..6d9f0289dd 100644
--- a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts
+++ b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts
@@ -1,6 +1,6 @@
-import { Component, Inject, Input } from '@angular/core';
+import { Component, Input } from '@angular/core';
 import { ListableObject } from '../listable-object.model';
-import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { CollectionElementLinkType } from '../../collection-element-link.type';
 
 @Component({
   selector: 'ds-abstract-object-element',
@@ -8,4 +8,6 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
 })
 export class AbstractListableElementComponent<T extends ListableObject> {
   @Input() object: T;
+  @Input() linkType: CollectionElementLinkType;
+  linkTypes = CollectionElementLinkType;
 }
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts
index 63520a8f5f..64bdfeff7b 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts
@@ -6,12 +6,11 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { ClaimedTaskSearchResultDetailElementComponent } from './claimed-task-search-result-detail-element.component';
-import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model';
 import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model';
 
 let component: ClaimedTaskSearchResultDetailElementComponent;
 let fixture: ComponentFixture<ClaimedTaskSearchResultDetailElementComponent>;
@@ -55,15 +54,11 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt
 const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
 mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) });
 
-describe('ClaimedMyDSpaceResultDetailElementComponent', () => {
+describe('ClaimedTaskSearchResultDetailElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [ClaimedTaskSearchResultDetailElementComponent],
-      providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
-      ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(ClaimedTaskSearchResultDetailElementComponent, {
       set: { changeDetection: ChangeDetectionStrategy.Default }
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
index 04e128c49a..66644d23a9 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
@@ -15,7 +15,7 @@
         <ng-container *ngVar="(bitstreams$ | async) as bitstreams">
           <ds-metadata-field-wrapper [label]="('item.page.files' | translate)">
             <div *ngIf="bitstreams?.length > 0" class="file-section">
-              <a *ngFor="let file of bitstreams; let last=last;" [href]="file?.content" target="_blank" [download]="file?.name">
+              <a *ngFor="let file of bitstreams; let last=last;" [href]="file?.content" target="_blank" rel="noopener noreferrer" [download]="file?.name">
                 <span>{{file?.name}}</span>
                 <span>({{(file?.sizeBytes) | dsFileSize }})</span>
                 <span *ngIf="!last" innerHTML="{{separator}}"></span>
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
index c5970d751f..7920e54b00 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
@@ -72,7 +72,7 @@ describe('ItemDetailPreviewComponent', () => {
     fixture = TestBed.createComponent(ItemDetailPreviewComponent);
     component = fixture.componentInstance;
     component.object = { hitHighlights: {} } as any;
-    component.object = mockItem;
+    component.item = mockItem;
     component.separator = ', ';
     spyOn(component.item, 'getFiles').and.returnValue(mockItem.bitstreams);
     fixture.detectChanges();
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts
index 070fedde81..72fbff78ed 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts
@@ -47,15 +47,11 @@ mockResultObject.indexableObject = Object.assign(new Item(), {
   }
 });
 
-describe('ItemMyDSpaceResultDetailElementComponent', () => {
+describe('ItemSearchResultDetailElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [ItemSearchResultDetailElementComponent],
-      providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
-      ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(ItemSearchResultDetailElementComponent, {
       set: { changeDetection: ChangeDetectionStrategy.Default }
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.html
similarity index 100%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.html
rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.html
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts
similarity index 93%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts
rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts
index b6fd29e8a6..412dd00c13 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts
@@ -5,12 +5,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
-import { PoolSearchResultDetailElementComponent } from './pool-my-dspace-result-detail-element.component';
-import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model';
 import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { PoolSearchResultDetailElementComponent } from './pool-search-result-detail-element.component';
+import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model';
 
 let component: PoolSearchResultDetailElementComponent;
 let fixture: ComponentFixture<PoolSearchResultDetailElementComponent>;
@@ -54,7 +54,7 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt
 const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
 mockResultObject.indexableObject = Object.assign(new PoolTask(), { workflowitem: observableOf(rdWorkflowitem) });
 
-describe('PoolMyDSpaceResultDetailElementComponent', () => {
+describe('PoolSearchResultDetailElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts
similarity index 100%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.ts
rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts
index a4f0e3542a..0e1a3bd307 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts
@@ -6,11 +6,10 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { WorkflowItemSearchResultDetailElementComponent } from './workflow-item-search-result-detail-element.component';
-import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model';
 
 let component: WorkflowItemSearchResultDetailElementComponent;
 let fixture: ComponentFixture<WorkflowItemSearchResultDetailElementComponent>;
@@ -52,7 +51,7 @@ const item = Object.assign(new Item(), {
 const rd = createSuccessfulRemoteDataObject(item);
 mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) });
 
-describe('WorkflowitemMyDSpaceResultDetailElementComponent', () => {
+describe('WorkflowItemSearchResultDetailElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.html
similarity index 100%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.html
rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.html
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.scss
similarity index 100%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.scss
rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.scss
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts
similarity index 93%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts
rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts
index ebd0d1ba6a..c841bf1dab 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts
@@ -6,11 +6,10 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { WorkspaceItemSearchResultDetailElementComponent } from './workspace-item-search-result-detail-element.component';
-import { WorkflowItemSearchResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model';
 import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model';
 
 let component: WorkspaceItemSearchResultDetailElementComponent;
 let fixture: ComponentFixture<WorkspaceItemSearchResultDetailElementComponent>;
@@ -52,7 +51,7 @@ const item = Object.assign(new Item(), {
 const rd = createSuccessfulRemoteDataObject(item);
 mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) });
 
-describe('WorkspaceitemMyDSpaceResultDetailElementComponent', () => {
+describe('WorkspaceItemSearchResultDetailElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts
similarity index 100%
rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.ts
rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts
diff --git a/src/app/shared/object-detail/object-detail.component.ts b/src/app/shared/object-detail/object-detail.component.ts
index 93da1bcce6..36963b2f5d 100644
--- a/src/app/shared/object-detail/object-detail.component.ts
+++ b/src/app/shared/object-detail/object-detail.component.ts
@@ -17,6 +17,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
 import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
 import { ViewMode } from '../../core/shared/view-mode.model';
 import { Context } from '../../core/shared/context.model';
+import { CollectionElementLinkType } from '../object-collection/collection-element-link.type';
 
 /**
  * This component renders a paginated set of results in the detail view.
@@ -51,6 +52,7 @@ export class ObjectDetailComponent {
    * A boolean representing if to hide pagination when there is only a page
    */
   @Input() hidePagerWhenSinglePage = true;
+  @Input() linkType: CollectionElementLinkType;
   @Input() context: Context;
 
   /**
diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html
index 9fecb51b9a..0b1a85d0ef 100644
--- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html
+++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html
@@ -1,14 +1,17 @@
 <div class="card">
-  <a [routerLink]="['/collections/', object.id]" class="card-img-top">
+  <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', object.id]" class="card-img-top">
     <ds-grid-thumbnail [thumbnail]="object.logo">
     </ds-grid-thumbnail>
   </a>
+  <span *ngIf="linkType == linkTypes.None" class="card-img-top">
+    <ds-grid-thumbnail [thumbnail]="object.logo">
+    </ds-grid-thumbnail>
+  </span>
   <div class="card-body">
     <h4 class="card-title">{{object.name}}</h4>
     <p *ngIf="object.shortDescription" class="card-text">{{object.shortDescription}}</p>
-    <div class="text-center">
-      <a [routerLink]="['/collections/', object.id]" class="lead btn btn-primary viewButton">View</a>
+    <div *ngIf="linkType != linkTypes.None" class="text-center">
+      <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', object.id]" class="lead btn btn-primary viewButton">View</a>
     </div>
-
   </div>
 </div>
diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html
index 31a9e8ad3d..eed29367fa 100644
--- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html
+++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html
@@ -1,14 +1,17 @@
 <div class="card">
-
-  <a [routerLink]="['/communities/', object.id]" class="card-img-top">
+  <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', object.id]" class="card-img-top">
     <ds-grid-thumbnail [thumbnail]="object.logo">
     </ds-grid-thumbnail>
   </a>
+  <span *ngIf="linkType == linkTypes.None" class="card-img-top">
+    <ds-grid-thumbnail [thumbnail]="object.logo">
+    </ds-grid-thumbnail>
+  </span>
   <div class="card-body">
     <h4 class="card-title">{{object.name}}</h4>
     <p *ngIf="object.shortDescription" class="card-text">{{object.shortDescription}}</p>
-    <div class="text-center">
-      <a [routerLink]="['/communities/', object.id]" class="lead btn btn-primary viewButton">View</a>
+    <div *ngIf="linkType != linkTypes.None" class="text-center">
+      <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', object.id]" class="lead btn btn-primary viewButton">View</a>
     </div>
   </div>
 </div>
diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html
index df413ebead..81ee3ebcce 100644
--- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html
+++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html
@@ -1 +1 @@
-<ds-publication-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-publication-search-result-grid-element>
+<ds-publication-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-publication-search-result-grid-element>
diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts
index 3d0b80932d..a3103268fe 100644
--- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts
+++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts
@@ -8,14 +8,12 @@ import { PublicationGridElementComponent } from './publication-grid-element.comp
 import { of as observableOf } from 'rxjs/internal/observable/of';
 import { ItemSearchResult } from '../../../../object-collection/shared/item-search-result.model';
 import { Item } from '../../../../../core/shared/item.model';
-import { ITEM } from '../../../../items/switcher/listable-object-component-loader.component';
 import { createSuccessfulRemoteDataObject$ } from '../../../../testing/utils';
 import { PaginatedList } from '../../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../../core/shared/page-info.model';
+import { JournalGridElementComponent } from '../../../../../entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component';
 
-const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithMetadata.hitHighlights = {};
-mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
+const mockItem = Object.assign(new Item(), {
   bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
   metadata: {
     'dc.title': [
@@ -45,33 +43,8 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutMetadata.hitHighlights = {};
-mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), {
-  bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('PublicationGridElementComponent', getEntityGridElementTestComponent(PublicationGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['authors', 'date', 'abstract']));
-
-/**
- * Create test cases for a grid component of an entity.
- * @param component                     The component's class
- * @param searchResultWithMetadata      An ItemSearchResult containing an item with metadata that should be displayed in the grid element
- * @param searchResultWithoutMetadata   An ItemSearchResult containing an item that's missing the metadata that should be displayed in the grid element
- * @param fieldsToCheck                 A list of fields to check. The tests expect to find html elements with class ".item-${field}", so make sure they exist in the html template of the grid element.
- *                                      For example: If one of the fields to check is labeled "authors", the html template should contain at least one element with class ".item-authors" that's
- *                                      present when the author metadata is available.
- */
-export function getEntityGridElementTestComponent(component, searchResultWithMetadata: ItemSearchResult, searchResultWithoutMetadata: ItemSearchResult, fieldsToCheck: string[]) {
-  return () => {
+describe('PublicationGridElementComponent',
+  () => {
     let comp;
     let fixture;
 
@@ -82,46 +55,31 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet
     beforeEach(async(() => {
       TestBed.configureTestingModule({
         imports: [NoopAnimationsModule],
-        declarations: [component, TruncatePipe],
+        declarations: [PublicationGridElementComponent, TruncatePipe],
         providers: [
           { provide: TruncatableService, useValue: truncatableServiceStub },
-          {provide: ITEM, useValue: searchResultWithoutMetadata}
         ],
         schemas: [NO_ERRORS_SCHEMA]
-      }).overrideComponent(component, {
+      }).overrideComponent(PublicationGridElementComponent, {
         set: { changeDetection: ChangeDetectionStrategy.Default }
       }).compileComponents();
     }));
 
     beforeEach(async(() => {
-      fixture = TestBed.createComponent(component);
+      fixture = TestBed.createComponent(PublicationGridElementComponent);
       comp = fixture.componentInstance;
     }));
 
-    fieldsToCheck.forEach((field) => {
-      describe(`when the item has "${field}" metadata`, () => {
-        beforeEach(() => {
-          comp.dso = searchResultWithMetadata.indexableObject;
-          fixture.detectChanges();
-        });
-
-        it(`should show the "${field}" field`, () => {
-          const itemAuthorField = fixture.debugElement.query(By.css(`.item-${field}`));
-          expect(itemAuthorField).not.toBeNull();
-        });
+    describe(`when the publication is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
       });
 
-      describe(`when the item has no "${field}" metadata`, () => {
-        beforeEach(() => {
-          comp.dso = searchResultWithoutMetadata.indexableObject;
-          fixture.detectChanges();
-        });
-
-        it(`should not show the "${field}" field`, () => {
-          const itemAuthorField = fixture.debugElement.query(By.css(`.item-${field}`));
-          expect(itemAuthorField).toBeNull();
-        });
+      it(`should contain a PublicationGridElementComponent`, () => {
+        const publicationGridElement = fixture.debugElement.query(By.css(`ds-publication-search-result-grid-element`));
+        expect(publicationGridElement).not.toBeNull();
       });
     });
-  }
-}
+
+  });
\ No newline at end of file
diff --git a/src/app/shared/object-grid/object-grid.component.html b/src/app/shared/object-grid/object-grid.component.html
index f527aa3555..348536bfed 100644
--- a/src/app/shared/object-grid/object-grid.component.html
+++ b/src/app/shared/object-grid/object-grid.component.html
@@ -13,7 +13,7 @@
     <div class="card-columns row" *ngIf="objects?.hasSucceeded">
       <div class="card-column col col-sm-6 col-lg-4" *ngFor="let column of (columns$ | async)" @fadeIn>
         <div class="card-element" *ngFor="let object of column">
-          <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context"></ds-listable-object-component-loader>
+          <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context" [linkType]="linkType"></ds-listable-object-component-loader>
         </div>
       </div>
     </div>
diff --git a/src/app/shared/object-grid/object-grid.component.ts b/src/app/shared/object-grid/object-grid.component.ts
index 52f6e29d14..6b61e6bfd8 100644
--- a/src/app/shared/object-grid/object-grid.component.ts
+++ b/src/app/shared/object-grid/object-grid.component.ts
@@ -22,6 +22,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
 import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
 import { ViewMode } from '../../core/shared/view-mode.model';
 import { Context } from '../../core/shared/context.model';
+import { CollectionElementLinkType } from '../object-collection/collection-element-link.type';
 
 @Component({
   changeDetection: ChangeDetectionStrategy.Default,
@@ -39,6 +40,7 @@ export class ObjectGridComponent implements OnInit {
   @Input() sortConfig: SortOptions;
   @Input() hideGear = false;
   @Input() hidePagerWhenSinglePage = true;
+  @Input() linkType: CollectionElementLinkType;
   @Input() context: Context;
   private _objects$: BehaviorSubject<RemoteData<PaginatedList<ListableObject>>>;
 
diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html
index 91548d945d..0c45316e30 100644
--- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html
+++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html
@@ -1,13 +1,17 @@
 <div class="card">
-  <a [routerLink]="['/collections/', dso.id]" class="card-img-top">
+  <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', dso.id]" class="card-img-top">
     <ds-grid-thumbnail [thumbnail]="dso.logo">
     </ds-grid-thumbnail>
   </a>
+  <span *ngIf="linkType == linkTypes.None" class="card-img-top">
+    <ds-grid-thumbnail [thumbnail]="dso.logo">
+    </ds-grid-thumbnail>
+  </span>
   <div class="card-body">
     <h4 class="card-title">{{dso.name}}</h4>
     <p *ngIf="dso.shortDescription" class="card-text">{{dso.shortDescription}}</p>
-    <div class="text-center">
-      <a [routerLink]="['/collections/',  dso.id]" class="lead btn btn-primary viewButton">View</a>
+    <div *ngIf="linkType != linkTypes.None" class="text-center">
+      <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/',  dso.id]" class="lead btn btn-primary viewButton">View</a>
     </div>
   </div>
 </div>
diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html
index 95094a6fa1..d0a9aa700e 100644
--- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html
+++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html
@@ -1,14 +1,17 @@
 <div class="card">
-
-  <a [routerLink]="['/communities/', dso.id]" class="card-img-top">
+  <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', dso.id]" class="card-img-top">
     <ds-grid-thumbnail [thumbnail]="dso.logo">
     </ds-grid-thumbnail>
   </a>
+  <span *ngIf="linkType == linkTypes.None" class="card-img-top">
+    <ds-grid-thumbnail [thumbnail]="dso.logo">
+    </ds-grid-thumbnail>
+  </span>
   <div class="card-body">
     <h4 class="card-title">{{dso.name}}</h4>
     <p *ngIf="dso.shortDescription" class="card-text">{{dso.shortDescription}}</p>
-    <div class="text-center">
-      <a [routerLink]="['/communities/', dso.id]" class="lead btn btn-primary viewButton">View</a>
+    <div *ngIf="linkType != linkTypes.None" class="text-center">
+      <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', dso.id]" class="lead btn btn-primary viewButton">View</a>
     </div>
   </div>
 </div>
diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html
index e0eedc22fc..a00e30cbcd 100644
--- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html
+++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html
@@ -1,32 +1,39 @@
 <ds-truncatable [id]="dso.id">
     <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'">
-        <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width">
+        <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
+           class="card-img-top full-width">
             <div>
                 <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async">
                 </ds-grid-thumbnail>
             </div>
         </a>
+        <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width">
+            <div>
+                <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async">
+                </ds-grid-thumbnail>
+            </div>
+        </span>
         <div class="card-body">
             <ds-item-type-badge [object]="dso"></ds-item-type-badge>
             <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
-                <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
+                <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4>
             </ds-truncatable-part>
             <p *ngIf="dso.hasMetadata(['dc.contributor.author', 'dc.creator', 'dc.contributor.*'])"
-               class="dso-authors card-text text-muted">
+               class="item-authors card-text text-muted">
                 <ds-truncatable-part [id]="dso.id" [minLines]="1">
-                    <span *ngIf="dso.hasMetadata('dc.date.issued')" class="dso-date">{{dso.firstMetadataValue('dc.date.issued')}}</span>
-                    <span *ngFor="let author of dso.allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']);">,
+                    <span *ngIf="dso.hasMetadata('dc.date.issued')" class="item-date">{{firstMetadataValue('dc.date.issued')}}</span>
+                    <span *ngFor="let author of allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']);">,
                         <span [innerHTML]="author"></span>
                     </span>
                 </ds-truncatable-part>
             </p>
-            <p *ngIf="dso.hasMetadata('dc.description.abstract')" class="dso-abstract card-text">
+            <p *ngIf="dso.hasMetadata('dc.description.abstract')" class="item-abstract card-text">
                 <ds-truncatable-part [id]="dso.id" [minLines]="3">
                     <span [innerHTML]="firstMetadataValue('dc.description.abstract')"></span>
                 </ds-truncatable-part>
             </p>
-            <div class="text-center">
-                <a [routerLink]="['/items/' + dso.id]"
+            <div *ngIf="linkType != linkTypes.None" class="text-center">
+                <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]"
                    class="lead btn btn-primary viewButton">View</a>
             </div>
         </div>
diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts
index 63ee848aa0..30bb2c9262 100644
--- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts
+++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts
@@ -99,7 +99,7 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet
     fieldsToCheck.forEach((field) => {
       describe(`when the item has "${field}" metadata`, () => {
         beforeEach(() => {
-          comp.dso = searchResultWithMetadata.indexableObject;
+          comp.object = searchResultWithMetadata;
           fixture.detectChanges();
         });
 
@@ -111,7 +111,7 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet
 
       describe(`when the item has no "${field}" metadata`, () => {
         beforeEach(() => {
-          comp.dso = searchResultWithoutMetadata.indexableObject;
+          comp.object = searchResultWithoutMetadata;
           fixture.detectChanges();
         });
 
diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html
index 0fad726777..e3455bf095 100644
--- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html
+++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html
@@ -1,7 +1,10 @@
 <div class="d-flex flex-row">
-  <a [routerLink]="" [queryParams]="{value: object.value, startsWith: undefined}" [queryParamsHandling]="'merge'" class="lead">
-    {{object.value}}
-  </a>
-  <span class="pr-2">&nbsp;</span>
-  <span class="badge badge-pill badge-secondary align-self-center">{{object.count}}</span>
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="" [queryParams]="{value: object.value, startsWith: undefined}" [queryParamsHandling]="'merge'" class="lead">
+        {{object.value}}
+    </a>
+    <span *ngIf="linkType == linkTypes.None" class="lead">
+        {{object.value}}
+    </span>
+    <span class="pr-2">&nbsp;</span>
+    <span class="badge badge-pill badge-secondary align-self-center">{{object.count}}</span>
 </div>
diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html
index dec2794dca..c61adf5dad 100644
--- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html
+++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html
@@ -1,6 +1,9 @@
-<a [routerLink]="['/collections/' + object.id]" class="lead">
+<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/' + object.id]" class="lead">
     {{object.name}}
 </a>
+<span *ngIf="linkType == linkTypes.None" class="lead">
+    {{object.name}}
+</span>
 <div *ngIf="object.shortDescription" class="text-muted abstract-text">
     {{object.shortDescription}}
 </div>
diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html
index 7582680fb2..af01999ca7 100644
--- a/src/app/shared/object-list/community-list-element/community-list-element.component.html
+++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html
@@ -1,6 +1,9 @@
-<a [routerLink]="['/communities/' + object.id]" class="lead">
+<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/' + object.id]" class="lead">
     {{object.name}}
 </a>
+<span *ngIf="linkType == linkTypes.None" class="lead">
+    {{object.name}}
+</span>
 <div *ngIf="object.shortDescription" class="text-muted abstract-text">
     {{object.shortDescription}}
 </div>
diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html
index f4269d357d..acc3ee4194 100644
--- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html
+++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html
@@ -1 +1 @@
-<ds-publication-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-publication-search-result-list-element>
\ No newline at end of file
+<ds-publication-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-publication-search-result-list-element>
\ No newline at end of file
diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts
index 5761a591dd..24bc774b1f 100644
--- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts
+++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts
@@ -1,4 +1,4 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { async, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
 import { PublicationListElementComponent } from './publication-list-element.component';
@@ -7,10 +7,7 @@ import { TruncatePipe } from '../../../../utils/truncate.pipe';
 import { TruncatableService } from '../../../../truncatable/truncatable.service';
 import { of as observableOf } from 'rxjs';
 
-let publicationListElementComponent: PublicationListElementComponent;
-let fixture: ComponentFixture<PublicationListElementComponent>;
-
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
+const mockItem: Item = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
@@ -45,131 +42,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
     ]
   }
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
-      }
-    ]
-  }
-});
-
-describe('PublicationListElementComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ PublicationListElementComponent , TruncatePipe],
-      providers: [
-        { provide: TruncatableService, useValue: {} }
-      ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
-    }).overrideComponent(PublicationListElementComponent, {
-      set: { changeDetection: ChangeDetectionStrategy.Default }
-    }).compileComponents();
-  }));
-
-  beforeEach(async(() => {
-    fixture = TestBed.createComponent(PublicationListElementComponent);
-    publicationListElementComponent = fixture.componentInstance;
-
-  }));
-
-  describe('When the item has an author', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the author paragraph', () => {
-      const itemAuthorField = fixture.debugElement.query(By.css('span.item-list-authors'));
-      expect(itemAuthorField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no author', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the author paragraph', () => {
-      const itemAuthorField = fixture.debugElement.query(By.css('span.item-list-authors'));
-      expect(itemAuthorField).toBeNull();
-    });
-  });
-
-  describe('When the item has a publisher', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the publisher span', () => {
-      const publisherField = fixture.debugElement.query(By.css('span.item-list-publisher'));
-      expect(publisherField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no publisher', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the publisher span', () => {
-      const publisherField = fixture.debugElement.query(By.css('span.item-list-publisher'));
-      expect(publisherField).toBeNull();
-    });
-  });
-
-  describe('When the item has an issuedate', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the issuedate span', () => {
-      const dateField = fixture.debugElement.query(By.css('span.item-list-date'));
-      expect(dateField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no issuedate', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the issuedate span', () => {
-      const dateField = fixture.debugElement.query(By.css('span.item-list-date'));
-      expect(dateField).toBeNull();
-    });
-  });
-
-  describe('When the item has an abstract', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should show the abstract span', () => {
-      const abstractField = fixture.debugElement.query(By.css('div.item-list-abstract'));
-      expect(abstractField).not.toBeNull();
-    });
-  });
-
-  describe('When the item has no abstract', () => {
-    beforeEach(() => {
-      publicationListElementComponent.object = mockItemWithoutMetadata;
-      fixture.detectChanges();
-    });
-
-    it('should not show the abstract span', () => {
-      const abstractField = fixture.debugElement.query(By.css('div.item-list-abstract'));
-      expect(abstractField).toBeNull();
-    });
-  });
-});
+describe('PublicationListElementComponent',
+  () => {
+    let comp;
+    let fixture;
+
+    const truncatableServiceStub: any = {
+      isCollapsed: (id: number) => observableOf(true),
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [PublicationListElementComponent, TruncatePipe],
+        providers: [
+          { provide: TruncatableService, useValue: truncatableServiceStub },
+        ],
+        schemas: [NO_ERRORS_SCHEMA]
+      }).overrideComponent(PublicationListElementComponent, {
+        set: { changeDetection: ChangeDetectionStrategy.Default }
+      }).compileComponents();
+    }));
+
+    beforeEach(async(() => {
+      fixture = TestBed.createComponent(PublicationListElementComponent);
+      comp = fixture.componentInstance;
+    }));
+
+    describe(`when the publication is rendered`, () => {
+      beforeEach(() => {
+        comp.object = mockItem;
+        fixture.detectChanges();
+      });
+
+      it(`should contain a PublicationListElementComponent`, () => {
+        const publicationListElement = fixture.debugElement.query(By.css(`ds-publication-search-result-list-element`));
+        expect(publicationListElement).not.toBeNull();
+      });
+    });
+
+  });
\ No newline at end of file
diff --git a/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts b/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts
index 04c40b73ff..35f283efe3 100644
--- a/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts
+++ b/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts
@@ -13,9 +13,7 @@ let fixture: ComponentFixture<ItemTypeBadgeComponent>;
 
 const type = 'authorOfPublication';
 
-const mockItemWithRelationshipType: ItemSearchResult = new ItemSearchResult();
-mockItemWithRelationshipType.hitHighlights = {};
-mockItemWithRelationshipType.indexableObject = Object.assign(new Item(), {
+const mockItemWithRelationshipType = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'relationship.type': [
@@ -27,9 +25,7 @@ mockItemWithRelationshipType.indexableObject = Object.assign(new Item(), {
   }
 });
 
-const mockItemWithoutRelationshipType: ItemSearchResult = new ItemSearchResult();
-mockItemWithoutRelationshipType.hitHighlights = {};
-mockItemWithoutRelationshipType.indexableObject = Object.assign(new Item(), {
+const mockItemWithoutRelationshipType = Object.assign(new Item(), {
   bitstreams: observableOf({}),
   metadata: {
     'dc.title': [
diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts
index 7afe774831..fe2ada3aff 100644
--- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts
+++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts
@@ -23,6 +23,7 @@ describe('ItemMetadataListElementComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(ItemMetadataListElementComponent);
     comp = fixture.componentInstance;
+    comp.metadataRepresentation = mockItemMetadataRepresentation;
     fixture.detectChanges();
   }));
 
diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts
index 08ff67e3f1..4f27bf05dd 100644
--- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts
+++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts
@@ -3,9 +3,8 @@ import { Component } from '@angular/core';
 import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
 import { ViewMode } from '../../../../core/shared/view-mode.model';
 import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
-import { Item } from '../../../../core/shared/item.model';
 
-@metadataRepresentationComponent(Item.name, MetadataRepresentationType.Item)
+@metadataRepresentationComponent('Publication', MetadataRepresentationType.Item)
 @Component({
   selector: 'ds-item-metadata-list-element',
   templateUrl: './item-metadata-list-element.component.html'
diff --git a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts
index b7f4a381e2..7b8e0d7f9c 100644
--- a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts
+++ b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts
@@ -10,7 +10,4 @@ import { MetadataRepresentation } from '../../../core/shared/metadata-representa
  */
 export class MetadataRepresentationListElementComponent {
   metadataRepresentation: MetadataRepresentation;
-
-  constructor() {
-  }
 }
diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts
index 9926b8639e..9a409aa147 100644
--- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts
+++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts
@@ -25,6 +25,7 @@ describe('PlainTextMetadataListElementComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(PlainTextMetadataListElementComponent);
     comp = fixture.componentInstance;
+    comp.metadataRepresentation = mockMetadataRepresentation;
     fixture.detectChanges();
   }));
 
diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts
index 50e2c2a60b..198c3712d9 100644
--- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts
+++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts
@@ -2,11 +2,10 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep
 import { Component } from '@angular/core';
 import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
 import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
-import { Item } from '../../../../core/shared/item.model';
 
-@metadataRepresentationComponent(Item.name, MetadataRepresentationType.PlainText)
+@metadataRepresentationComponent('Publication', MetadataRepresentationType.PlainText)
 // For now, authority controlled fields are rendered the same way as plain text fields
-@metadataRepresentationComponent(Item.name, MetadataRepresentationType.AuthorityControlled)
+@metadataRepresentationComponent('Publication', MetadataRepresentationType.AuthorityControlled)
 @Component({
   selector: 'ds-plain-text-metadata-list-element',
   templateUrl: './plain-text-metadata-list-element.component.html'
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts
index c52b1f1b07..327bb750b1 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts
@@ -6,12 +6,13 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { ClaimedSearchResultListElementComponent } from './claimed-search-result-list-element.component';
-import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model';
 import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model';
+import { TruncatableAction } from '../../../truncatable/truncatable.actions';
+import { TruncatableService } from '../../../truncatable/truncatable.service';
 
 let component: ClaimedSearchResultListElementComponent;
 let fixture: ComponentFixture<ClaimedSearchResultListElementComponent>;
@@ -55,14 +56,13 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt
 const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
 mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) });
 
-describe('ClaimedMyDSpaceResultListElementComponent', () => {
+describe('ClaimedSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [ClaimedSearchResultListElementComponent],
       providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
+        { provide: TruncatableService, useValue: {} },
       ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(ClaimedSearchResultListElementComponent, {
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts
index d3c657cc3f..57c1a4706c 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts
@@ -8,6 +8,7 @@ import { Item } from '../../../../core/shared/item.model';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
 import { ItemSearchResultListElementSubmissionComponent } from './item-search-result-list-element-submission.component';
+import { TruncatableService } from '../../../truncatable/truncatable.service';
 
 let component: ItemSearchResultListElementSubmissionComponent;
 let fixture: ComponentFixture<ItemSearchResultListElementSubmissionComponent>;
@@ -53,8 +54,7 @@ describe('ItemMyDSpaceResultListElementComponent', () => {
       imports: [NoopAnimationsModule],
       declarations: [ItemSearchResultListElementSubmissionComponent],
       providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
+        { provide: TruncatableService, useValue: {} },
       ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(ItemSearchResultListElementSubmissionComponent, {
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts
index 08b670862f..31f29439af 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts
@@ -6,12 +6,12 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { PoolSearchResultListElementComponent } from './pool-search-result-list-element.component';
-import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model';
 import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model';
+import { TruncatableService } from '../../../truncatable/truncatable.service';
 
 let component: PoolSearchResultListElementComponent;
 let fixture: ComponentFixture<PoolSearchResultListElementComponent>;
@@ -55,14 +55,13 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt
 const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
 mockResultObject.indexableObject = Object.assign(new PoolTask(), { workflowitem: observableOf(rdWorkflowitem) });
 
-describe('PoolMyDSpaceResultListElementComponent', () => {
+describe('PoolSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [PoolSearchResultListElementComponent],
       providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
+        { provide: TruncatableService, useValue: {} },
       ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(PoolSearchResultListElementComponent, {
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts
index dd04198b93..90036142c4 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts
@@ -5,12 +5,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
-import { WorkflowItemSearchResultListElementComponent } from './workflow-item-my-search-result-list-element.component';
-import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model';
 import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { WorkflowItemSearchResultListElementComponent } from './workflow-item-search-result-list-element.component';
+import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model';
+import { TruncatableService } from '../../../truncatable/truncatable.service';
 
 let component: WorkflowItemSearchResultListElementComponent;
 let fixture: ComponentFixture<WorkflowItemSearchResultListElementComponent>;
@@ -52,14 +52,13 @@ const item = Object.assign(new Item(), {
 const rd = createSuccessfulRemoteDataObject(item);
 mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) });
 
-describe('WorkflowitemMyDSpaceResultListElementComponent', () => {
+describe('WorkflowItemSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [WorkflowItemSearchResultListElementComponent],
       providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
+        { provide: TruncatableService, useValue: {} },
       ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(WorkflowItemSearchResultListElementComponent, {
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts
index 988d550345..eac4320bd7 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts
@@ -6,11 +6,11 @@ import { of as observableOf } from 'rxjs';
 
 import { Item } from '../../../../core/shared/item.model';
 import { WorkspaceItemSearchResultListElementComponent } from './workspace-item-search-result-list-element.component';
-import { WorkflowItemSearchResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model';
 import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model';
-import { RemoteData } from '../../../../core/data/remote-data';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
+import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model';
+import { TruncatableService } from '../../../truncatable/truncatable.service';
 
 let component: WorkspaceItemSearchResultListElementComponent;
 let fixture: ComponentFixture<WorkspaceItemSearchResultListElementComponent>;
@@ -52,14 +52,13 @@ const item = Object.assign(new Item(), {
 const rd = createSuccessfulRemoteDataObject(item);
 mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) });
 
-describe('WorkspaceitemMyDSpaceResultListElementComponent', () => {
+describe('WorkspaceItemSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
       imports: [NoopAnimationsModule],
       declarations: [WorkspaceItemSearchResultListElementComponent],
       providers: [
-        { provide: 'objectElementProvider', useValue: (mockResultObject) },
-        { provide: 'indexElementProvider', useValue: (compIndex) }
+        { provide: TruncatableService, useValue: {} },
       ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(WorkspaceItemSearchResultListElementComponent, {
diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html
index daec1db8ad..1d49ea09d7 100644
--- a/src/app/shared/object-list/object-list.component.html
+++ b/src/app/shared/object-list/object-list.component.html
@@ -12,7 +12,7 @@
   (paginationChange)="onPaginationChange($event)">
   <ul *ngIf="objects?.hasSucceeded" class="list-unstyled">
       <li *ngFor="let object of objects?.payload?.page; let i = index; let last = last" class="mt-4 mb-4" [class.border-bottom]="hasBorder && !last">
-        <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i" [context]="context"></ds-listable-object-component-loader>
+        <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i" [context]="context" [linkType]="linkType"></ds-listable-object-component-loader>
       </li>
   </ul>
 </ds-pagination>
diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts
index 0776134e83..9704dee70e 100644
--- a/src/app/shared/object-list/object-list.component.ts
+++ b/src/app/shared/object-list/object-list.component.ts
@@ -14,6 +14,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
 import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
 import { ViewMode } from '../../core/shared/view-mode.model';
 import { Context } from '../../core/shared/context.model';
+import { CollectionElementLinkType } from '../object-collection/collection-element-link.type';
 
 @Component({
   changeDetection: ChangeDetectionStrategy.Default,
@@ -30,6 +31,7 @@ export class ObjectListComponent {
   @Input() hasBorder = false;
   @Input() hideGear = false;
   @Input() hidePagerWhenSinglePage = true;
+  @Input() linkType: CollectionElementLinkType;
   @Input() context: Context;
   private _objects: RemoteData<PaginatedList<ListableObject>>;
   @Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) {
diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html
index b4af631e83..3c787c47ce 100644
--- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html
+++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html
@@ -1,2 +1,3 @@
-<a [routerLink]="['/collections/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a>
+<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a>
+<span *ngIf="linkType == linkTypes.None" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></span>
 <div *ngIf="dso.shortDescription" class="text-muted abstract-text" [innerHTML]="firstMetadataValue('dc.description.abstract')"></div>
diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts
index 7f5aaf5d9c..9de1e085b5 100644
--- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts
@@ -47,9 +47,7 @@ describe('CollectionSearchResultListElementComponent', () => {
       declarations: [ CollectionSearchResultListElementComponent, TruncatePipe ],
       providers: [
         { provide: TruncatableService, useValue: truncatableServiceStub },
-        { provide: 'objectElementProvider', useValue: (mockCollectionWithAbstract) }
       ],
-
       schemas: [ NO_ERRORS_SCHEMA ]
     }).overrideComponent(CollectionSearchResultListElementComponent, {
       set: { changeDetection: ChangeDetectionStrategy.Default }
@@ -59,6 +57,8 @@ describe('CollectionSearchResultListElementComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(CollectionSearchResultListElementComponent);
     collectionSearchResultListElementComponent = fixture.componentInstance;
+    collectionSearchResultListElementComponent.object = mockCollectionWithAbstract;
+    fixture.detectChanges();
   }));
 
   describe('When the collection has an abstract', () => {
diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html
index 9444a63771..32834fefee 100644
--- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html
+++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html
@@ -1,2 +1,3 @@
-<a [routerLink]="['/communities/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a>
+<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"  [routerLink]="['/communities/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a>
+<span *ngIf="linkType == linkTypes.None" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></span>
 <div *ngIf="dso.shortDescription" class="text-muted abstract-text" [innerHTML]="firstMetadataValue('dc.description.abstract')"></div>
diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts
index 691a69dde4..2bf61c2ab9 100644
--- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts
@@ -47,7 +47,6 @@ describe('CommunitySearchResultListElementComponent', () => {
       declarations: [ CommunitySearchResultListElementComponent, TruncatePipe ],
       providers: [
         { provide: TruncatableService, useValue: truncatableServiceStub },
-        { provide: 'objectElementProvider', useValue: (mockCommunityWithAbstract) }
       ],
 
       schemas: [ NO_ERRORS_SCHEMA ]
@@ -59,6 +58,8 @@ describe('CommunitySearchResultListElementComponent', () => {
   beforeEach(async(() => {
     fixture = TestBed.createComponent(CommunitySearchResultListElementComponent);
     communitySearchResultListElementComponent = fixture.componentInstance;
+    communitySearchResultListElementComponent.object = mockCommunityWithAbstract;
+    fixture.detectChanges();
   }));
 
   describe('When the community has an abstract', () => {
diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html
index 62b9bc5e74..3d2604585d 100644
--- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html
+++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html
@@ -1,9 +1,11 @@
 <ds-item-type-badge [object]="dso"></ds-item-type-badge>
 
 <ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null">
-    <a
-            [routerLink]="['/items/' + dso.id]" class="lead"
-            [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer"
+       [routerLink]="['/items/' + dso.id]" class="lead"
+       [innerHTML]="firstMetadataValue('dc.title')"></a>
+    <span *ngIf="linkType == linkTypes.None" class="lead"
+          [innerHTML]="firstMetadataValue('dc.title')"></span>
     <span class="text-muted">
     <ds-truncatable-part [id]="dso.id" [minLines]="1">
             <ng-container *ngIf="dso.firstMetadataValue('dc.publisher') || dso.firstMetadataValue('dc.date.issued')">(<span class="item-list-publisher"
diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts
index 1b77c5bd85..82703f1ee0 100644
--- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts
@@ -1,73 +1,78 @@
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
 import { By } from '@angular/platform-browser';
-import { PublicationSearchResultListElementComponent } from './publication-list-element.component';
-import { Item } from '../../../../../core/shared/item.model';
-import { TruncatePipe } from '../../../../utils/truncate.pipe';
-import { TruncatableService } from '../../../../truncatable/truncatable.service';
-import { ITEM } from '../../../../items/switcher/listable-object-component-loader.component';
 import { of as observableOf } from 'rxjs';
+import { PublicationSearchResultListElementComponent } from './publication-search-result-list-element.component';
+import { Item } from '../../../../../../core/shared/item.model';
+import { TruncatePipe } from '../../../../../utils/truncate.pipe';
+import { TruncatableService } from '../../../../../truncatable/truncatable.service';
+import { ItemSearchResult } from '../../../../../object-collection/shared/item-search-result.model';
 
 let publicationListElementComponent: PublicationSearchResultListElementComponent;
 let fixture: ComponentFixture<PublicationSearchResultListElementComponent>;
 
-const mockItemWithMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
+const mockItemWithMetadata: ItemSearchResult = Object.assign(new ItemSearchResult(), {
+  indexableObject:
+    Object.assign(new Item(), {
+      bitstreams: observableOf({}),
+      metadata: {
+        'dc.title': [
+          {
+            language: 'en_US',
+            value: 'This is just another title'
+          }
+        ],
+        'dc.contributor.author': [
+          {
+            language: 'en_US',
+            value: 'Smith, Donald'
+          }
+        ],
+        'dc.publisher': [
+          {
+            language: 'en_US',
+            value: 'a publisher'
+          }
+        ],
+        'dc.date.issued': [
+          {
+            language: 'en_US',
+            value: '2015-06-26'
+          }
+        ],
+        'dc.description.abstract': [
+          {
+            language: 'en_US',
+            value: 'This is the abstract'
+          }
+        ]
       }
-    ],
-    'dc.contributor.author': [
-      {
-        language: 'en_US',
-        value: 'Smith, Donald'
-      }
-    ],
-    'dc.publisher': [
-      {
-        language: 'en_US',
-        value: 'a publisher'
-      }
-    ],
-    'dc.date.issued': [
-      {
-        language: 'en_US',
-        value: '2015-06-26'
-      }
-    ],
-    'dc.description.abstract': [
-      {
-        language: 'en_US',
-        value: 'This is the abstract'
-      }
-    ]
-  }
+    })
 });
-const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
-  bitstreams: observableOf({}),
-  metadata: {
-    'dc.title': [
-      {
-        language: 'en_US',
-        value: 'This is just another title'
+const mockItemWithoutMetadata: ItemSearchResult = Object.assign(new ItemSearchResult(), {
+  indexableObject:
+    Object.assign(new Item(), {
+      bitstreams: observableOf({}),
+      metadata: {
+        'dc.title': [
+          {
+            language: 'en_US',
+            value: 'This is just another title'
+          }
+        ]
       }
-    ]
-  }
+    })
 });
 
 describe('PublicationListElementComponent', () => {
   beforeEach(async(() => {
     TestBed.configureTestingModule({
-      declarations: [ PublicationSearchResultListElementComponent , TruncatePipe],
+      declarations: [PublicationSearchResultListElementComponent, TruncatePipe],
       providers: [
-        { provide: ITEM, useValue: mockItemWithMetadata},
         { provide: TruncatableService, useValue: {} }
       ],
 
-      schemas: [ NO_ERRORS_SCHEMA ]
+      schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(PublicationSearchResultListElementComponent, {
       set: { changeDetection: ChangeDetectionStrategy.Default }
     }).compileComponents();
-- 
GitLab