diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidget.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidget.java
new file mode 100644
index 0000000..1e15514
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidget.java
@@ -0,0 +1,82 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.form.Widget;
+import com.arsdigita.bebop.parameters.LongParameter;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.xml.Element;
+
+import org.libreccm.cdi.utils.CdiUtil;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class JournalSearchWidget extends Widget {
+
+ public JournalSearchWidget(final String name) {
+ super(new LongParameter(name));
+ }
+
+ @Override
+ public boolean isCompound() {
+ return true;
+ }
+
+ @Override
+ protected String getType() {
+ return "journal-search-widget";
+ }
+
+ @Override
+ public String getElementTag() {
+ return "cms:journal-search-widget";
+ }
+
+ @Override
+ public void generateWidget(
+ final PageState state, final Element parent
+ ) {
+ final Element widget = parent.newChildElement(getElementTag(),
+ CMS.CMS_XML_NS);
+
+ widget.addAttribute("name", getName());
+
+ final Long value = (Long) getValue(state);
+ if (value != null) {
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final JournalSearchWidgetController controller = cdiUtil
+ .findBean(JournalSearchWidgetController.class);
+
+ final Map data = controller.getData(value);
+
+ final Element selected = widget
+ .newChildElement("cms:selected-journal", CMS.CMS_XML_NS);
+ selected.addAttribute(
+ "journalId",
+ data.get(JournalSearchWidgetController.JOURNAL_ID)
+ );
+ selected.addAttribute(
+ "title",
+ data.get(JournalSearchWidgetController.TITLE)
+ );
+ selected.addAttribute(
+ "symbol",
+ data.get(JournalSearchWidgetController.SYMBOL)
+ );
+ selected.addAttribute(
+ "issn",
+ data.get(JournalSearchWidgetController.ISSN));
+
+ exportAttributes(widget);
+ }
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidgetController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidgetController.java
new file mode 100644
index 0000000..3ea56be
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/JournalSearchWidgetController.java
@@ -0,0 +1,58 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import org.libreccm.l10n.GlobalizationHelper;
+import org.scientificcms.publications.Journal;
+import org.scientificcms.publications.JournalRepository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class JournalSearchWidgetController {
+
+ protected static final String JOURNAL_ID = "journalId";
+
+ protected static final String TITLE = "title";
+
+ protected static final String SYMBOL = "symbol";
+
+ protected static final String ISSN = "issn";
+
+ @Inject
+ private JournalRepository journalRepository;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Map getData(final long journalId) {
+
+ final Journal journal = journalRepository
+ .findById(journalId)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format("No Journal with ID %d found.", journalId)
+ )
+ );
+
+ final Map data = new HashMap<>();
+
+ data.put(JOURNAL_ID, Long.toString(journal.getJournalId()));
+ data.put(TITLE, journal.getTitle());
+ data.put(SYMBOL, journal.getSymbol());
+ data.put(ISSN, journal.getIssn());
+
+ return data;
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidget.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidget.java
new file mode 100644
index 0000000..8624f32
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidget.java
@@ -0,0 +1,109 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.form.Widget;
+import com.arsdigita.bebop.parameters.LongParameter;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.xml.Element;
+
+import org.libreccm.cdi.utils.CdiUtil;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.PublicationWithPublisher;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class PublicationSearchWidget extends Widget {
+
+ private Class extends Publication> type;
+
+ public PublicationSearchWidget(final String name) {
+ super(new LongParameter(name));
+ }
+
+ public PublicationSearchWidget(
+ final String name, final Class extends Publication> type
+ ) {
+ this(name);
+ this.type = type;
+ }
+
+ @Override
+ public boolean isCompound() {
+ return true;
+ }
+
+ @Override
+ protected String getType() {
+ return "publication-search-widget";
+ }
+
+ @Override
+ protected String getElementTag() {
+ return "cms:publication-search-widget";
+ }
+
+ @Override
+ public void generateWidget(final PageState state,
+ final Element parent) {
+ final Element widget = parent.newChildElement(
+ getElementTag(), CMS.CMS_XML_NS
+ );
+
+ widget.addAttribute("name", getName());
+
+ if (type != null) {
+ widget.addAttribute("publication-type", type.getName());
+ }
+
+ final Long value = (Long) getValue(state);
+ if (value != null) {
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final PublicationSearchWidgetController controller = cdiUtil
+ .findBean(PublicationSearchWidgetController.class);
+
+ final Map data = controller.getData(value);
+
+ final Element selected = widget.newChildElement(
+ "cms:selected-publication", CMS.CMS_XML_NS
+ );
+ selected.addAttribute(
+ "publicationId",
+ data.get(PublicationSearchWidgetController.PUBLICATION_ID)
+ );
+
+ selected.addAttribute(
+ "title",
+ data.get(PublicationSearchWidgetController.TITLE)
+ );
+
+ selected.addAttribute(
+ "year",
+ data.get(PublicationSearchWidgetController.YEAR)
+ );
+
+ if (type != null
+ && PublicationWithPublisher.class.isAssignableFrom(type)) {
+ selected.addAttribute(
+ "publisher",
+ data.get(PublicationSearchWidgetController.PUBLISHER)
+ );
+ selected.addAttribute(
+ "place",
+ data.get(PublicationSearchWidgetController.PLACE)
+ );
+ }
+
+ exportAttributes(widget);
+ }
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidgetController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidgetController.java
new file mode 100644
index 0000000..5db10ac
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSearchWidgetController.java
@@ -0,0 +1,95 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import org.libreccm.l10n.GlobalizationHelper;
+import org.librecms.assets.Person;
+import org.scientificcms.publications.Authorship;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.PublicationRepository;
+import org.scientificcms.publications.PublicationWithPublisher;
+import org.scientificcms.publications.Publisher;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class PublicationSearchWidgetController {
+
+ protected static final String PUBLICATION_ID = "publicationId";
+
+ protected static final String TITLE = "title";
+
+ protected static final String YEAR = "year";
+
+ protected static final String AUTHORS = "authors";
+
+ protected static final String PUBLISHER = "publisher";
+
+ protected static final String PLACE = "place";
+
+ @Inject
+ private PublicationRepository publicationRepository;
+
+ @Inject
+ private GlobalizationHelper globalizationHelper;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Map getData(final long publicationId) {
+
+ final Publication publication = publicationRepository
+ .findById(publicationId)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format("No Publication with ID %d found.",
+ publicationId)
+ )
+ );
+
+ final Map data = new HashMap<>();
+
+ data.put(PUBLICATION_ID, Long.toString(publication.getPublicationId()));
+ data.put(
+ TITLE,
+ globalizationHelper.getValueFromLocalizedString(
+ publication.getTitle()
+ )
+ );
+ data.put(YEAR, Integer.toString(publication.getYearOfPublication()));
+ data.put(
+ AUTHORS,
+ publication
+ .getAuthorships()
+ .stream()
+ .sorted()
+ .map(Authorship::getAuthor)
+ .map(Person::getPersonName)
+ .map(name -> String.format("%s, %s",
+ name.getSurname(),
+ name.getGivenName()))
+ .collect(Collectors.joining("; "))
+ );
+
+ if (publication instanceof PublicationWithPublisher) {
+ final Publisher publisher = ((PublicationWithPublisher) publication)
+ .getPublisher();
+ data.put(PUBLISHER, publisher.getName());
+ data.put(PLACE, publisher.getPlace());
+ }
+
+ return data;
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidget.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidget.java
new file mode 100644
index 0000000..32a8bc1
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidget.java
@@ -0,0 +1,79 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.form.Widget;
+import com.arsdigita.bebop.parameters.LongParameter;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.xml.Element;
+
+import org.libreccm.cdi.utils.CdiUtil;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class PublisherSearchWidget extends Widget {
+
+ public PublisherSearchWidget(final String name) {
+ super(new LongParameter(name));
+ }
+
+ @Override
+ public boolean isCompound() {
+ return true;
+ }
+
+ @Override
+ protected String getType() {
+ return "publisher-search-widget";
+ }
+
+ @Override
+ public String getElementTag() {
+ return "cms:publisher-search-widget";
+ }
+
+ @Override
+ public void generateWidget(
+ final PageState state, final Element parent
+ ) {
+ final Element widget = parent.newChildElement(getElementTag(),
+ CMS.CMS_XML_NS);
+
+ widget.addAttribute("name", getName());
+
+ final Long value = (Long) getValue(state);
+ if (value != null) {
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final PublisherSearchWidgetController controller = cdiUtil
+ .findBean(PublisherSearchWidgetController.class);
+
+ final Map data = controller.getData(value);
+
+ final Element selected = widget
+ .newChildElement("cms:selected-publisher", CMS.CMS_XML_NS);
+ selected.addAttribute(
+ "publisherId",
+ data.get(PublisherSearchWidgetController.PUBLISHER_ID)
+ );
+ selected.addAttribute(
+ "name",
+ data.get(PublisherSearchWidgetController.NAME)
+ );
+ selected.addAttribute(
+ "place",
+ data.get(PublisherSearchWidgetController.PLACE)
+ );
+
+ exportAttributes(widget);
+ }
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidgetController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidgetController.java
new file mode 100644
index 0000000..b6ff605
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublisherSearchWidgetController.java
@@ -0,0 +1,51 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import org.scientificcms.publications.Publisher;
+import org.scientificcms.publications.PublisherRepository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class PublisherSearchWidgetController {
+
+ protected static final String PUBLISHER_ID = "publisherId";
+ protected static final String NAME = "name";
+ protected static final String PLACE = "place";
+
+ @Inject
+ private PublisherRepository publisherRepository;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Map getData(final long publisherId) {
+
+ final Publisher publisher = publisherRepository
+ .findById(publisherId)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format("No Publisher with ID %d found.", publisherId)
+ )
+ );
+
+ final Map data = new HashMap<>();
+
+ data.put(PUBLISHER_ID, Long.toString(publisher.getPublisherId()));
+ data.put(NAME, publisher.getName());
+ data.put(PLACE, publisher.getPlace());
+
+ return data;
+ }
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidget.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidget.java
new file mode 100644
index 0000000..5f5c40d
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidget.java
@@ -0,0 +1,75 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.form.Widget;
+import com.arsdigita.bebop.parameters.LongParameter;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.xml.Element;
+
+import org.libreccm.cdi.utils.CdiUtil;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class SeriesSearchWidget extends Widget {
+
+ public SeriesSearchWidget(final String name) {
+ super(new LongParameter(name));
+ }
+
+ @Override
+ public boolean isCompound() {
+ return true;
+ }
+
+ @Override
+ protected String getType() {
+ return "series-search-widget";
+ }
+
+ @Override
+ public String getElementTag() {
+ return "cms:series-search-widget";
+ }
+
+ @Override
+ public void generateWidget(
+ final PageState state, final Element parent
+ ) {
+ final Element widget = parent.newChildElement(getElementTag(),
+ CMS.CMS_XML_NS);
+
+ widget.addAttribute("name", getName());
+
+ final Long value = (Long) getValue(state);
+ if (value != null) {
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final SeriesSearchWidgetController controller = cdiUtil
+ .findBean(SeriesSearchWidgetController.class);
+
+ final Map data = controller.getData(value);
+
+ final Element selected = widget
+ .newChildElement("cms:selected-series", CMS.CMS_XML_NS);
+ selected.addAttribute(
+ "series",
+ data.get(SeriesSearchWidgetController.SERIES_ID)
+ );
+ selected.addAttribute(
+ "title",
+ data.get(SeriesSearchWidgetController.TITLE)
+ );
+
+ exportAttributes(widget);
+ }
+ }
+
+}
diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidgetController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidgetController.java
new file mode 100644
index 0000000..46de996
--- /dev/null
+++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SeriesSearchWidgetController.java
@@ -0,0 +1,58 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.cms.contenttypes.ui;
+
+import org.libreccm.l10n.GlobalizationHelper;
+import org.scientificcms.publications.Series;
+import org.scientificcms.publications.SeriesRepository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class SeriesSearchWidgetController {
+
+ protected static final String SERIES_ID = "seriesId";
+
+ protected static final String TITLE = "title";
+
+ @Inject
+ private SeriesRepository seriesRepository;
+
+ @Inject
+ private GlobalizationHelper globalizationHelper;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Map getData(final long seriesId) {
+
+ final Series series = seriesRepository
+ .findById(seriesId)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format("No Series with ID %d found.", seriesId)
+ )
+ );
+
+ final Map data = new HashMap<>();
+
+ data.put(SERIES_ID, Long.toString(series.getSeriesId()));
+ data.put(
+ TITLE,
+ globalizationHelper.getValueFromLocalizedString(series.getTitle())
+ );
+
+ return data;
+ }
+
+}