diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
index d0cd5c29532f496e217a588ab949a7f896fe7aaa..64a65fe4e44f3d8aafca28d41407b42eceb86efe 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/NotificationSubscriptionController.java
@@ -20,6 +20,8 @@ package no.nibio.vips.logic.controller.servlet;
 
 import freemarker.core.ParseException;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.List;
 import javax.ejb.EJB;
 import javax.persistence.EntityManager;
@@ -80,7 +82,12 @@ public class NotificationSubscriptionController extends HttpServlet {
         
         String action = request.getParameter("action");
         VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
-        
+        if(user == null)
+        {
+            this.redirectToLogin(request, response);
+            return;
+        }
+
         try
         {
             // Default: View list of user subscriptions
@@ -173,6 +180,13 @@ public class NotificationSubscriptionController extends HttpServlet {
         }
     }
 
+    private void redirectToLogin(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, IOException
+    {
+        String nextPage = ServletUtil.getFullRequestURI(request);
+        String nextPageDirective= "?nextPage=" + URLEncoder.encode(nextPage, "UTF-8");
+        response.sendRedirect(Globals.PROTOCOL + "://" + ServletUtil.getServerName(request) + "/login" + nextPageDirective);
+    }
+
     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
     /**
      * Handles the HTTP <code>GET</code> method.
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessageLocalVersion.java b/src/main/java/no/nibio/vips/logic/messaging/MessageLocalVersion.java
index 563d743088ddad2693e49c0f76598162fd50dd1a..031b5ab29f06c0b864da31217c86fc3bb41d71ef 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessageLocalVersion.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessageLocalVersion.java
@@ -20,7 +20,10 @@
 package no.nibio.vips.logic.messaging;
 
 /**
- * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
+ * Represents a localized message in the VIPS push notification system. Used by
+ * the UniversalMessage class
+ *
+ * @copyright 2016-2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 public class MessageLocalVersion {
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
index c18f42d83240ceaac6488f63d7934281008ab815..4b249b517aa90b74903944cc9dd256157bb497e1 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
@@ -79,6 +79,7 @@ public class MessagingBean {
     
     public void sendUniversalMessage(Message message)
     {
+        // TODO: Make URL relative
         String msgDownloadUrlTpl = "https://www.vips-landbruk.no/messages/" + message.getMessageId() + "/";
         // Create a universal message from the message
         // TODO: When UniversalMessage has changed, pick
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
index 8140c9802a11bde3afdbea1b284c4690da5cf735..c4c4725c95612442bb7feb4f4eed2ac2cfeebb37 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
@@ -29,6 +29,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.ResourceBundle;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.persistence.Basic;
@@ -44,6 +45,8 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
+
+import com.ibm.icu.util.ULocale;
 import no.nibio.vips.logic.util.StringJsonUserType;
 import org.hibernate.annotations.Type;
 import org.hibernate.annotations.TypeDef;
@@ -84,6 +87,10 @@ public class UniversalMessage implements Serializable {
     
     @Transient
     private ObjectMapper objectMapper;
+
+    // Include by default. If not needed, use constructor that makes it configurable
+    @Transient
+    private Boolean includeNotificationSettingsLink = Boolean.TRUE;
     
 
     public UniversalMessage() {
@@ -99,6 +106,19 @@ public class UniversalMessage implements Serializable {
     {
         this.addMessageLocalVersion(locale, msgSubject, msgLeadParagraph, msgBody, msgDownloadUrl);
     }
+
+    public UniversalMessage(
+            String locale,
+            String msgSubject,
+            String msgLeadParagraph,
+            String msgBody,
+            String msgDownloadUrl,
+            Boolean includeNotificationSettingsLink
+    )
+    {
+        this(locale, msgSubject, msgLeadParagraph, msgBody, msgDownloadUrl);
+        this.setIncludeNotificationSettingsLink(includeNotificationSettingsLink);
+    }
     
     public final void addMessageLocalVersion(
         String locale,
@@ -235,6 +255,18 @@ public class UniversalMessage implements Serializable {
         }
     }
 
+    /**
+     * @param locale two-letter language string
+     * @return The localized string **template** for generating a link to a user's page for
+     * managing notification subscription settings
+     */
+    @Transient
+    public String getNotificationSettingsLinkTpl(String locale)
+    {
+        ULocale theLocale = new ULocale(locale);
+        ResourceBundle rb = ResourceBundle.getBundle("no.nibio.vips.logic.i18n.vipslogictexts",theLocale.toLocale());
+        return rb.getString("universalMessageSettingsLink_tpl");
+    }
     
     private ObjectMapper getObjectMapper()
     {
@@ -244,4 +276,19 @@ public class UniversalMessage implements Serializable {
         }
         return this.objectMapper;
     }
+
+    /**
+     * If true, the SMS and mail messages will have this type of link appended at the end:
+     * "To edit your notification subscriptions, please use this link: https://logic.vips.nibio.no/user/notificationsubscription?userId=1"
+     *  The server name can be configured with the system properties no.nibio.vips.logic.VIPSLOGIC_PROTOCOL and no.nibio.vips.logic.SERVER_NAME
+     * @return
+     */
+    @Transient
+    public Boolean getIncludeNotificationSettingsLink() {
+        return includeNotificationSettingsLink;
+    }
+
+    public void setIncludeNotificationSettingsLink(Boolean includeNotificationSettingsLink) {
+        this.includeNotificationSettingsLink = includeNotificationSettingsLink;
+    }
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/distribution/entity/MsgToSend.java b/src/main/java/no/nibio/vips/logic/messaging/distribution/entity/MsgToSend.java
index 4c2fe6473320a84390ca3d1646ddc7b47b3ee61c..1e3abbee193c7c1c25b77c4c6ea9944decdab395 100644
--- a/src/main/java/no/nibio/vips/logic/messaging/distribution/entity/MsgToSend.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/distribution/entity/MsgToSend.java
@@ -18,7 +18,12 @@
  */
 package no.nibio.vips.logic.messaging.distribution.entity;
 
+import com.ibm.icu.util.ULocale;
+import no.nibio.vips.logic.util.Globals;
+
 import java.net.URL;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
 
 
 /**
@@ -46,6 +51,10 @@ public class MsgToSend {
         // The lead paragraph (AKA "Ingress")
 	public String msgLeadParagraph;
 
+	// Include by default. If not needed, use constructor that makes it configurable
+	private Boolean includeNotificationSettingsLink = Boolean.TRUE;
+
+
 	/* (non-Javadoc)
 	 * @see no.nibio.vips_msg_dist.dao.Test#getMsgSubject()
 	 */
@@ -116,5 +125,29 @@ public class MsgToSend {
 		this.locale = locale;
 	}
 
-	
+	/**
+	 * @return The localized string **template** for generating a link to a user's page for
+	 * managing notification subscription settings
+	 */
+	public String getNotificationSettingsLinkTpl()
+	{
+		ULocale theLocale = new ULocale(this.getLocale());
+		ResourceBundle rb = ResourceBundle.getBundle("no.nibio.vips.logic.i18n.vipslogictexts",theLocale.toLocale());
+		return MessageFormat.format(rb.getString("universalMessageSettingsLink_tpl"), Globals.PROTOCOL + "://" + Globals.SERVER_NAME + "/user/notificationsubscription?userId={0}");
+	}
+
+
+	/**
+	 * If true, the SMS and mail messages will have this type of link appended at the end:
+	 * "To edit your notification subscriptions, please use this link: https://logic.vips.nibio.no/user/notificationsubscription?userId=1"
+	 * The server name can be configured with the system properties no.nibio.vips.logic.VIPSLOGIC_PROTOCOL and no.nibio.vips.logic.SERVER_NAME
+	 * @return
+	 */
+	public Boolean getIncludeNotificationSettingsLink() {
+		return includeNotificationSettingsLink;
+	}
+
+	public void setIncludeNotificationSettingsLink(Boolean includeNotificationSettingsLink) {
+		this.includeNotificationSettingsLink = includeNotificationSettingsLink;
+	}
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
index 19c2273b9e39a3c45b576826c0bb9b0ab383f869..d13d028b0d61632d21f75c2f8543c517bbf1d789 100644
--- a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/MailMsgDeliveryHandler.java
@@ -19,6 +19,7 @@
 package no.nibio.vips.logic.messaging.distribution.send;
 
 import java.io.UnsupportedEncodingException;
+import java.text.MessageFormat;
 import java.util.Date;
 import java.util.Properties;
 
@@ -148,7 +149,8 @@ public class MailMsgDeliveryHandler implements IDeliveryMsgHandler {
                         + " using server " + mailserver);
             } else {
                 sendMessage(msgToSend.getMsgSubject(), msgToSend.getMsgLeadParagraph(), new StringBuffer(msgToSend.getMsgBody()).append("\n\n")
-                        .append(msgToSend.getMsgDownloadUrl() != null ? msgToSend.getMsgDownloadUrl():""),
+                        .append(msgToSend.getMsgDownloadUrl() != null ? msgToSend.getMsgDownloadUrl():"")
+                                .append(msgToSend.getIncludeNotificationSettingsLink() ? "\n\n" + MessageFormat.format(msgToSend.getNotificationSettingsLinkTpl(),msgReceiver.recipientId): "\n"),
                         msgReceiver.msgDeliveryAddress);
             }
             return SingleMsgSentStateEnum.Ok;
diff --git a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
index 4d9bb0847d82d0f8a78f61f60b827edd640fe597..965ef4b35492bd2fd188431ad846495437cc4600 100644
--- a/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/distribution/send/SmsMsgDeliveryHandler.java
@@ -26,6 +26,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLEncoder;
+import java.text.MessageFormat;
 
 import javax.mail.MessagingException;
 import no.nibio.vips.logic.messaging.distribution.entity.MsgReceiver;
@@ -134,7 +135,8 @@ public class SmsMsgDeliveryHandler implements IDeliveryMsgHandler {
         String smsText = msgToSend.getMsgSubject() + "\n"
                 + msgToSend.getMsgLeadParagraph() + "\n"
                 + msgToSend.getMsgBody()
-                + (msgToSend.getMsgDownloadUrl() != null ? "\n" + msgToSend.getMsgDownloadUrl().toString(): "");
+                + (msgToSend.getMsgDownloadUrl() != null ? "\n" + msgToSend.getMsgDownloadUrl().toString(): "\n")
+                + (msgToSend.getIncludeNotificationSettingsLink() ? "\n\n" + MessageFormat.format(msgToSend.getNotificationSettingsLinkTpl(), msgReceiver.recipientId): "\n");
         LOGGER.debug(smsText);
         LOGGER.debug("Teksten er på " + smsText.length() + " tegn.");
 
diff --git a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
index 8257d46d0b145d24527515bd03cb124c19e73c99..64a6f555c9a2a6023266e6017f26439e4b33f7a1 100644
--- a/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
+++ b/src/main/java/no/nibio/vips/logic/modules/barkbeetle/BarkbeetleBean.java
@@ -842,11 +842,13 @@ public class BarkbeetleBean {
      * @param users
      * @param heading
      * @param message
-     * @param url
      */
     public void sendReminder(List<VipsLogicUser> users, String heading, String message) {
 
         UniversalMessage uMessage = new UniversalMessage();
+        // The notificationSettingsLink is relevant to regular VIPS notifications, not
+        // these barkbeetle reminders, so omitting this here.
+        uMessage.setIncludeNotificationSettingsLink(false);
         Calendar cal = Calendar.getInstance(BarkbeetleBean.NORGE_MITT_NORGE);
         cal.setTime(new Date());
         cal.add(Calendar.DATE, 2);
diff --git a/src/main/java/no/nibio/vips/logic/util/Globals.java b/src/main/java/no/nibio/vips/logic/util/Globals.java
index 407c77c74eb97674895ff5478560f7455a69cf71..82180bf0c7981d68c7f0a07f82abdfac8ed43dc5 100755
--- a/src/main/java/no/nibio/vips/logic/util/Globals.java
+++ b/src/main/java/no/nibio/vips/logic/util/Globals.java
@@ -70,6 +70,8 @@ public class Globals {
     
     public static int DEFAULT_UUID_VALIDITY_DURATION_DAYS = 30;
     
-    public static String PROTOCOL = System.getProperty("no.nibio.vips.logic.VIPSLOGIC_PROTOCOL");
+    public static String PROTOCOL = System.getProperty("no.nibio.vips.logic.VIPSLOGIC_PROTOCOL") != null ? System.getProperty("no.nibio.vips.logic.VIPSLOGIC_PROTOCOL") : "http";
+
+    public static String SERVER_NAME = System.getProperty("no.nibio.vips.logic.SERVER_NAME") != null ? System.getProperty("no.nibio.vips.logic.SERVER_NAME") : "logic.vips.nibio.no";
     
 }
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
index 9c6384c2f132bcc76c95e14d62ff9e0853ae8434..b97d60170a0935b8a1efe1fec551367afb928403 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
@@ -1041,3 +1041,4 @@ addIllustration=Add illustration
 allRoles=All roles
 allStatuses=All statuses
 LEAFBLOTCH=Leaf blotch model
+universalMessageSettingsLink_tpl=To edit your notification subscriptions, please use this link: {0}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
index 10be401770dacc01de06b2db4e47725b5a86a1c0..f2572880428953a51d7cf3b0b16fdd1eb3b2e4bb 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
@@ -1034,3 +1034,4 @@ addIllustration=Add illustration
 allRoles=All roles
 allStatuses=All statuses
 LEAFBLOTCH=Leaf blotch model
+universalMessageSettingsLink_tpl=To edit your VIPS notification subscriptions, please use this link: {0}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
index 97b0be0ad9faa62ad8f26d9e4fda10d7372aedd8..34aa7af55b5da0ba8a177adad58bc151a048c0a6 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
@@ -1033,3 +1033,4 @@ addIllustration=Add illustration
 allRoles=All roles
 allStatuses=All statuses
 LEAFBLOTCH=Leaf blotch model
+universalMessageSettingsLink_tpl=To edit your notification subscriptions, please use this link: {0}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
index 6fb3a590d63862114591d91a350f346354375959..dbb321573390e03808b79539176f6f3728140b17 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
@@ -1042,3 +1042,4 @@ addIllustration=Legg til illustrasjon
 allRoles=Alle roller
 allStatuses=Alle statuser
 LEAFBLOTCH=Bladflekksjukdomsmodell
+universalMessageSettingsLink_tpl=For � endre dine abonnement p� push-varsler fra VIPS, bruk denne lenken: {0}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
index 752a7e00f5f745021c20306b1fdbe1fe056b2dd7..bc87ecca6d84dc9faadab56873fe9dfe062c6297 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
@@ -1035,3 +1035,4 @@ addIllustration=Add illustration
 allRoles=All roles
 allStatuses=All statuses
 LEAFBLOTCH=Leaf blotch model
+universalMessageSettingsLink_tpl=To edit your notification subscriptions, please use this link: {0}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties
index ba7e355e6fc73718f5b845050f106f06aed6edb5..3bb3a5d8a33d9557f250e39e15f408ec751cec88 100755
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties
@@ -1028,3 +1028,4 @@ addIllustration=Add illustration
 allRoles=All roles
 allStatuses=All statuses
 LEAFBLOTCH=Leaf blotch model
+universalMessageSettingsLink_tpl=To edit your notification subscriptions, please use this link: {0}