diff --git a/cms/pages/modules/cms_calendar.php b/cms/pages/modules/cms_calendar.php
index b19d1a3..93bea54 100644
--- a/cms/pages/modules/cms_calendar.php
+++ b/cms/pages/modules/cms_calendar.php
@@ -437,7 +437,7 @@ class Module_cms_calendar extends standard_aed_module
 		$fields2->attach(form_input_tick(do_lang_tempcode('SEG_RECURRENCES'),do_lang_tempcode('DESCRIPTION_SEG_RECURRENCES'),'seg_recurrences',$seg_recurrences==1));
 		$fields2->attach(monthly_spec_type_chooser($start_day_of_month,$start_month,$start_year,$start_monthly_spec_type));
 
-		if (($adding) && (cron_installed())) // Some more stuff only when adding
+		if (($adding) && (cron_installed()) && (has_specific_permission(get_member(),'set_reminders'))) // Some more stuff only when adding
 		{
 			$fields2->attach(do_template('FORM_SCREEN_FIELD_SPACER',array('SECTION_HIDDEN'=>true,'TITLE'=>do_lang_tempcode('REMINDERS'))));
 
@@ -650,83 +650,86 @@ class Module_cms_calendar extends standard_aed_module
 		$id=add_calendar_event($type,$recurrence,$recurrences,$seg_recurrences,$title,$content,$priority,$is_public,$start_year,$start_month,$start_day,$start_monthly_spec_type,$start_hour,$start_minute,$end_year,$end_month,$end_day,$end_monthly_spec_type,$end_hour,$end_minute,$timezone,$do_timezone_conv,$validated,$allow_rating,$allow_comments,$allow_trackbacks,$notes);
 
 		// Reminders
-		if (function_exists('set_time_limit')) @set_time_limit(0);
-		$rem_groups=array();
-		if ((has_specific_permission(get_member(),'add_public_events')) && (array_key_exists('sign_up_reminder_groups',$_POST)))
+		if (has_specific_permission(get_member(),'set_reminders'))
 		{
-			$all_groups=$GLOBALS['FORUM_DRIVER']->get_usergroup_list(true);
-			$multi_code=read_multi_code('sign_up_reminder_groups'); // Usergroups signed up
-			require_code('ocfiltering');
-			if ((substr($multi_code,0,1)=='-') || (substr($multi_code,0,1)=='*'))
+			if (function_exists('set_time_limit')) @set_time_limit(0);
+			$rem_groups=array();
+			if ((has_specific_permission(get_member(),'add_public_events')) && (array_key_exists('sign_up_reminder_groups',$_POST)))
 			{
-				$rem_groups=$all_groups;
-				if (get_forum_type()=='ocf')
-					unset($rem_groups[db_get_first_id()]);
-			}
-			foreach (explode(',',substr($multi_code,1)) as $m)
-			{
-				if (substr($multi_code,0,1)=='-')
+				$all_groups=$GLOBALS['FORUM_DRIVER']->get_usergroup_list(true);
+				$multi_code=read_multi_code('sign_up_reminder_groups'); // Usergroups signed up
+				require_code('ocfiltering');
+				if ((substr($multi_code,0,1)=='-') || (substr($multi_code,0,1)=='*'))
 				{
-					unset($rem_groups[intval($m)]);
-				} elseif (substr($multi_code,0,1)=='+')
+					$rem_groups=$all_groups;
+					if (get_forum_type()=='ocf')
+						unset($rem_groups[db_get_first_id()]);
+				}
+				foreach (explode(',',substr($multi_code,1)) as $m)
 				{
-					$rem_groups[intval($m)]=$all_groups[intval($m)];
+					if (substr($multi_code,0,1)=='-')
+					{
+						unset($rem_groups[intval($m)]);
+					} elseif (substr($multi_code,0,1)=='+')
+					{
+						$rem_groups[intval($m)]=$all_groups[intval($m)];
+					}
 				}
+				$rem_groups=array_keys($rem_groups);
 			}
-			$rem_groups=array_keys($rem_groups);
-		}
-		$start=0;
-		do
-		{
-			$members=array();
-			if (count($rem_groups)!=0)
-			{
-				$members=array_keys($GLOBALS['FORUM_DRIVER']->member_group_query($rem_groups,300,$start));
-				$members=array_diff($members,array(get_member(),$GLOBALS['FORUM_DRIVER']->get_guest_id()));
-			}
-			if (($start==0) && (post_param_integer('sign_up_reminder',0)==1)) // If this member is signing up
-				$members[]=get_member();
-			if (count($members)!=0) // Now add their reminders
-			{
-				$secs_before=floatval(post_param('hours_before','1.0'))*3600.0;
-
-				$filled1=array();
-				for ($i=0;$i<count($members);$i++) $filled1[]=$id;
-				$filled2=array();
-				for ($i=0;$i<count($members);$i++) $filled2[]=intval($secs_before);
-				$GLOBALS['SITE_DB']->query_insert('calendar_reminders',array(
-					'e_id'=>$filled1,
-					'n_member_id'=>array_values($members),
-					'n_seconds_before'=>$filled2
-				));
-			}
-			$start+=300;
-		}
-		while (array_key_exists(0,$members));
-		if ($is_public==1)
-		{
 			$start=0;
 			do
 			{
 				$members=array();
-				$interested=$GLOBALS['SITE_DB']->query_select('calendar_interests',array('i_member_id'),array('t_type'=>$type),'',300,$start);
-				foreach ($interested as $int) // Members with declarations of interest
+				if (count($rem_groups)!=0)
 				{
-					if (!in_array($int['i_member_id'],$members)) $members[]=$int['i_member_id'];
+					$members=array_keys($GLOBALS['FORUM_DRIVER']->member_group_query($rem_groups,300,$start));
+					$members=array_diff($members,array(get_member(),$GLOBALS['FORUM_DRIVER']->get_guest_id()));
 				}
-				$members=array_diff($members,array(get_member(),$GLOBALS['FORUM_DRIVER']->get_guest_id()));
-				foreach ($members as $member) // Now add their reminders. Can't do this as multi-insert as there may be dupes, so we need to skip over errors individually
+				if (($start==0) && (post_param_integer('sign_up_reminder',0)==1)) // If this member is signing up
+					$members[]=get_member();
+				if (count($members)!=0) // Now add their reminders
 				{
 					$secs_before=floatval(post_param('hours_before','1.0'))*3600.0;
+
+					$filled1=array();
+					for ($i=0;$i<count($members);$i++) $filled1[]=$id;
+					$filled2=array();
+					for ($i=0;$i<count($members);$i++) $filled2[]=intval($secs_before);
 					$GLOBALS['SITE_DB']->query_insert('calendar_reminders',array(
-						'e_id'=>$id,
-						'n_member_id'=>$member,
-						'n_seconds_before'=>intval($secs_before),
-					),false,true);
+						'e_id'=>$filled1,
+						'n_member_id'=>array_values($members),
+						'n_seconds_before'=>$filled2
+					));
 				}
 				$start+=300;
 			}
 			while (array_key_exists(0,$members));
+			if ($is_public==1)
+			{
+				$start=0;
+				do
+				{
+					$members=array();
+					$interested=$GLOBALS['SITE_DB']->query_select('calendar_interests',array('i_member_id'),array('t_type'=>$type),'',300,$start);
+					foreach ($interested as $int) // Members with declarations of interest
+					{
+						if (!in_array($int['i_member_id'],$members)) $members[]=$int['i_member_id'];
+					}
+					$members=array_diff($members,array(get_member(),$GLOBALS['FORUM_DRIVER']->get_guest_id()));
+					foreach ($members as $member) // Now add their reminders. Can't do this as multi-insert as there may be dupes, so we need to skip over errors individually
+					{
+						$secs_before=floatval(post_param('hours_before','1.0'))*3600.0;
+						$GLOBALS['SITE_DB']->query_insert('calendar_reminders',array(
+							'e_id'=>$id,
+							'n_member_id'=>$member,
+							'n_seconds_before'=>intval($secs_before),
+						),false,true);
+					}
+					$start+=300;
+				}
+				while (array_key_exists(0,$members));
+			}
 		}
 
 		regenerate_event_reminder_jobs($id);
diff --git a/lang/EN/calendar.ini b/lang/EN/calendar.ini
index 2233bc4..1ef50be 100644
--- a/lang/EN/calendar.ini
+++ b/lang/EN/calendar.ini
@@ -156,3 +156,5 @@ CALENDAR_MONTHLY_RECURRENCE_CONCRETE_day_of_month=Every {1} of month
 CALENDAR_MONTHLY_RECURRENCE_CONCRETE_day_of_month_backwards=Every {1} day going back from end of month
 CALENDAR_MONTHLY_RECURRENCE_CONCRETE_dow_of_month=Every {1} {2} of month
 CALENDAR_MONTHLY_RECURRENCE_CONCRETE_dow_of_month_backwards=Every {1} {2} going back from end of month
+
+PT_set_reminders=Set calendar reminders on behalf of other users
diff --git a/site/pages/modules/calendar.php b/site/pages/modules/calendar.php
index 4d6771d..ed3399a 100644
--- a/site/pages/modules/calendar.php
+++ b/site/pages/modules/calendar.php
@@ -60,7 +60,7 @@ class Module_calendar
 		$GLOBALS['SITE_DB']->drop_if_exists('calendar_interests');
 		$GLOBALS['SITE_DB']->drop_if_exists('calendar_jobs');
 
-		$perms=array('view_event_subscriptions','view_calendar','add_public_events','edit_viewable_events','edit_owned_events','view_personal_events','sense_personal_conflicts');
+		$perms=array('set_reminders','view_event_subscriptions','view_calendar','add_public_events','edit_viewable_events','edit_owned_events','view_personal_events','sense_personal_conflicts');
 		foreach ($perms as $perm)
 		{
 			delete_specific_permission($perm);
@@ -247,6 +247,11 @@ class Module_calendar
 			$GLOBALS['SITE_DB']->add_table_field('calendar_events','e_start_monthly_spec_type','ID_TEXT','day_of_month');
 			$GLOBALS['SITE_DB']->add_table_field('calendar_events','e_end_monthly_spec_type','ID_TEXT','day_of_month');
 		}
+
+		if ((!is_null($upgrade_from)) && ($upgrade_from<7))
+		{
+			add_specific_permission('CALENDAR','set_reminders',false);
+		}
 	}
 
 	/**
