diff --git a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java
index 0a2ad0d909e4cf108ff1a1d8de324e8d8fe5beaa..1e1125d1fc2af4f21f6afdfff1a5a22c25066442 100644
--- a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java
+++ b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java
@@ -28,22 +28,23 @@ public final class ExcelFileGenerator {
     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private static final ObjectMapper objectMapper = new ObjectMapper();
 
+    // TODO Dette må fikses før deploy til prod
+    private static final String VIPSWEB = "https://testvips.nibio.no";
+    private static final String VIPSLOGIC = "https://logic.testvips.nibio.no";
+
     private enum ColumnIndex {
         ID(false, 0, 0, "observationId"),
         DATE(false, 1, 1, "timeOfObservation"),
-        POI_ID(false, 2, 2, "locationPointOfInterestId"),
-        POI_NAME(false, 3, 3, "location"),
-        OBSERVER_ID(true, null, 4, "observerId"),
-        OBSERVER_NAME(true, null, 5, "observer"),
-        OBSERVATION_TIME_SERIES_ID(false, 4, 6, "observationTimeSeriesId"),
-        OBSERVATION_TIME_SERIES_LABEL(false, 5, 7, "observationTimeSeriesLabel"),
-        ORGANISM(false, 6, 8, "organism"),
-        CROP_ORGANISM(false, 7, 9, "cropOrganismId"),
-        HEADING(false, 8, 10, "observationHeading"),
-        DESCRIPTION(false, 9, 11, "observationText"),
-        BROADCAST(false, 10, 12, "isBroadcast"),
-        POSITIVE(false, 11, 13, "isPositiveRegistration"),
-        INDEX_DATA(false, 12, 14, null);
+        POI_NAME(false, 2, 2, "location"),
+        OBSERVER_NAME(true, null, 3, "observer"),
+        OBSERVATION_TIME_SERIES_LABEL(false, 3, 4, "observationTimeSeriesLabel"),
+        ORGANISM(false, 4, 5, "organism"),
+        CROP_ORGANISM(false, 5, 6, "cropOrganismId"),
+        HEADING(false, 6, 7, "observationHeading"),
+        DESCRIPTION(false, 7, 8, "observationText"),
+        BROADCAST(false, 8, 9, "isBroadcast"),
+        POSITIVE(false, 9, 10, "isPositiveRegistration"),
+        INDEX_DATA(false, 10, 11, null);
 
         private final boolean isSensitive;
         private final Integer openIndex;
@@ -101,22 +102,7 @@ public final class ExcelFileGenerator {
 
             // Create meta sheet for information about the download
             Sheet metaSheet = workbook.createSheet(rb.getString("downloadInfo"));
-            Row userRow = metaSheet.createRow(0);
-            userRow.createCell(0).setCellValue(rb.getString("downloadedBy"));
-            userRow.createCell(1).setCellValue(user != null ? user.getFullName() : rb.getString("unregisteredUser"));
-            Row timeRow = metaSheet.createRow(1);
-            timeRow.createCell(0).setCellValue(rb.getString("downloadedTime"));
-            timeRow.createCell(1).setCellValue(DATE_TIME_FORMATTER.format(now));
-            Row fromRow = metaSheet.createRow(2);
-            fromRow.createCell(0).setCellValue(rb.getString("dateStart"));
-            fromRow.createCell(1).setCellValue(fromStr);
-            Row toRow = metaSheet.createRow(3);
-            toRow.createCell(0).setCellValue(rb.getString("dateEnd"));
-            toRow.createCell(1).setCellValue(toStr);
-            Row countRow = metaSheet.createRow(4);
-            countRow.createCell(0).setCellValue(rb.getString("observationCount"));
-            countRow.createCell(1).setCellValue(observations.size());
-            autoSizeColumns(metaSheet, 0, 1);
+            addMetaInfo(metaSheet, user, now, fromStr, toStr, observations, headerStyle, rb);
 
             // Prepare list of observations for each type of pest
             Map<Integer, List<ObservationListItem>> pestObservations = getObservationsForEachPest(observations);
@@ -160,6 +146,47 @@ public final class ExcelFileGenerator {
         }
     }
 
+    /**
+     * Add meta information to given sheet
+     *
+     * @param metaSheet    The sheet in which to add content
+     * @param user         The current user
+     * @param now          The current timestamp
+     * @param fromStr      The start of the period for which we have observations
+     * @param toStr        The end of the period for which we have observations
+     * @param observations The list of observations
+     * @param headerStyle  How to style the title cells
+     * @param rb           Resource bundle with translations
+     */
+    private static void addMetaInfo(Sheet metaSheet, VipsLogicUser user, LocalDateTime now, String fromStr, String toStr, List<ObservationListItem> observations, CellStyle headerStyle, ResourceBundle rb) {
+        Row userRow = metaSheet.createRow(0);
+        Cell downloadedByCell = userRow.createCell(0);
+        downloadedByCell.setCellStyle(headerStyle);
+        downloadedByCell.setCellValue(rb.getString("downloadedBy"));
+        userRow.createCell(1).setCellValue(user != null ? user.getFullName() : rb.getString("unregisteredUser"));
+        Row timeRow = metaSheet.createRow(1);
+        Cell downloadedTimeCell = timeRow.createCell(0);
+        downloadedTimeCell.setCellStyle(headerStyle);
+        downloadedTimeCell.setCellValue(rb.getString("downloadedTime"));
+        timeRow.createCell(1).setCellValue(DATE_TIME_FORMATTER.format(now));
+        Row fromRow = metaSheet.createRow(2);
+        Cell dateFromCell = fromRow.createCell(0);
+        dateFromCell.setCellStyle(headerStyle);
+        dateFromCell.setCellValue(rb.getString("dateStart"));
+        fromRow.createCell(1).setCellValue(fromStr);
+        Row toRow = metaSheet.createRow(3);
+        Cell dateToCell = toRow.createCell(0);
+        dateToCell.setCellStyle(headerStyle);
+        dateToCell.setCellValue(rb.getString("dateEnd"));
+        toRow.createCell(1).setCellValue(toStr);
+        Row countRow = metaSheet.createRow(4);
+        Cell countCell = countRow.createCell(0);
+        countCell.setCellStyle(headerStyle);
+        countCell.setCellValue(rb.getString("observationCount"));
+        countRow.createCell(1).setCellValue(observations.size());
+        autoSizeColumns(metaSheet, 0, 1);
+    }
+
     /**
      * Create sheet name without invalid characters and within size limits
      *
@@ -260,21 +287,23 @@ public final class ExcelFileGenerator {
     private static Row createItemRow(boolean isAdmin, Sheet sheet, int rowIndex, ObservationListItem item, ResourceBundle rb) throws JsonProcessingException {
         LocalDate localDateOfObservation = item.getTimeOfObservation().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
         Row row = sheet.createRow(rowIndex);
-        addObservationLinkToIdCol(isAdmin, row, item.getObservationId());
+        addObservationLink(row, ColumnIndex.ID.getIndex(isAdmin), item.getObservationId());
         addValueToCell(row, ColumnIndex.DATE.getIndex(isAdmin), localDateOfObservation.format(DATE_FORMATTER));
 
         if (item.getLocationPointOfInterestId() != null) {
-            addValueToCell(row, ColumnIndex.POI_ID.getIndex(isAdmin), item.getLocationPointOfInterestId());
-            addValueToCell(row, ColumnIndex.POI_NAME.getIndex(isAdmin), item.getLocationPointOfInterestName());
+            Integer poiNameIndex = ColumnIndex.POI_NAME.getIndex(isAdmin);
+            if(isAdmin) {
+                addPoiLink(row, poiNameIndex, item.getLocationPointOfInterestId(), item.getLocationPointOfInterestName());
+            } else {
+                addValueToCell(row, poiNameIndex, item.getLocationPointOfInterestName());
+            }
         }
 
         if (isAdmin) {
-            addValueToCell(row, ColumnIndex.OBSERVER_ID.getIndex(isAdmin), item.getObserverId());
-            addValueToCell(row, ColumnIndex.OBSERVER_NAME.getIndex(isAdmin), item.getObserverName());
+            addUserLink(row, ColumnIndex.OBSERVER_NAME.getIndex(isAdmin), item.getObserverId(), item.getObserverName());
         }
         if (item.getObservationTimeSeriesId() != null) {
-            addValueToCell(row, ColumnIndex.OBSERVATION_TIME_SERIES_ID.getIndex(isAdmin), item.getObservationTimeSeriesId());
-            addValueToCell(row, ColumnIndex.OBSERVATION_TIME_SERIES_LABEL.getIndex(isAdmin), item.getObservationTimeSeriesLabel());
+            addTimeSeriesLink(row, ColumnIndex.OBSERVATION_TIME_SERIES_LABEL.getIndex(isAdmin), item.getObservationTimeSeriesId(), item.getObservationTimeSeriesLabel());
         }
         addValueToCell(row, ColumnIndex.ORGANISM.getIndex(isAdmin), item.getOrganismName());
         addValueToCell(row, ColumnIndex.CROP_ORGANISM.getIndex(isAdmin), item.getCropOrganismName());
@@ -330,28 +359,84 @@ public final class ExcelFileGenerator {
     /**
      * Add link to observation details in column containing the observation Id
      *
-     * @param isAdmin       Whether or not the user is admin
      * @param row           A reference to the current row
+     * @param colIndex      The index of the column in which the link should be added
      * @param observationId The id of the observation
      */
-    private static void addObservationLinkToIdCol(boolean isAdmin, Row row, Integer observationId) {
-        Cell cell = row.createCell(ColumnIndex.ID.getIndex(isAdmin));
+    private static void addObservationLink(Row row, Integer colIndex, Integer observationId) {
+        Cell cell = row.createCell(colIndex);
         cell.setCellValue(observationId);
 
         Workbook workbook = row.getSheet().getWorkbook();
+        cell.setHyperlink(createHyperlink(workbook, VIPSWEB + "/observations/" + observationId));
+        cell.setCellStyle(hyperlinkCellStyle(workbook));
+    }
+
+    /**
+     * Add link to timeseries details in column with given index
+     *
+     * @param row             A reference to the current row
+     * @param colIndex        The index of the column in which the link should be added
+     * @param timeSeriesId    The id of the timeseries
+     * @param timeSeriesLabel The text which should be displayed in the cell
+     */
+    private static void addTimeSeriesLink(Row row, Integer colIndex, Integer timeSeriesId, String timeSeriesLabel) {
+        Cell cell = row.createCell(colIndex);
+        cell.setCellValue(timeSeriesLabel);
+
+        Workbook workbook = row.getSheet().getWorkbook();
+        cell.setHyperlink(createHyperlink(workbook, VIPSWEB + "/observations/timeseries/" + timeSeriesId));
+        cell.setCellStyle(hyperlinkCellStyle(workbook));
+    }
+
+    /**
+     * Add link to poi details in column with given index
+     *
+     * @param row      A reference to the current row
+     * @param colIndex The index of the column in which the link should be added
+     * @param poiId    The id of the poi
+     * @param poiName  The text which should be displayed in the cell
+     */
+    private static void addPoiLink(Row row, Integer colIndex, Integer poiId, String poiName) {
+        Cell cell = row.createCell(colIndex);
+        cell.setCellValue(poiName);
+
+        Workbook workbook = row.getSheet().getWorkbook();
+        cell.setHyperlink(createHyperlink(workbook, VIPSLOGIC + "/weatherStation?pointOfInterestId=" + poiId));
+        cell.setCellStyle(hyperlinkCellStyle(workbook));
+    }
+
+    /**
+     * Add link to user details in column with given index
+     *
+     * @param row      A reference to the current row
+     * @param colIndex The index of the column in which the link should be added
+     * @param userId   The id of the user
+     * @param userName The text which should be displayed in the cell
+     */
+    private static void addUserLink(Row row, Integer colIndex, Integer userId, String userName) {
+        Cell cell = row.createCell(colIndex);
+        cell.setCellValue(userName);
+
+        Workbook workbook = row.getSheet().getWorkbook();
+        cell.setHyperlink(createHyperlink(workbook, VIPSLOGIC + "/user?action=viewUser&userId=" + userId));
+        cell.setCellStyle(hyperlinkCellStyle(workbook));
+    }
+
+    private static Hyperlink createHyperlink(Workbook workbook, String url) {
         CreationHelper creationHelper = workbook.getCreationHelper();
         Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
-        //hyperlink.setAddress("https://www.vips-landbruk.no/observations/" + observationId);
-        // TODO Dette må fikses før deploy til prod
-        hyperlink.setAddress("https://testvips.nibio.no/observations/" + observationId);
-        cell.setHyperlink(hyperlink);
+        hyperlink.setAddress(url);
+        return hyperlink;
+    }
 
-        CellStyle hlinkStyle = workbook.createCellStyle();
+    private static CellStyle hyperlinkCellStyle(Workbook workbook) {
+        CellStyle hyperlinkStyle = workbook.createCellStyle();
         Font hlinkFont = workbook.createFont();
         hlinkFont.setUnderline(Font.U_SINGLE);
         hlinkFont.setColor(IndexedColors.BLUE.getIndex());
-        hlinkStyle.setFont(hlinkFont);
-        cell.setCellStyle(hlinkStyle);
+        hyperlinkStyle.setFont(hlinkFont);
+        return hyperlinkStyle;
     }
 
 }