diff --git a/Civi/GeotargetedPetitions/PetitionSubmission.php b/Civi/GeotargetedPetitions/PetitionSubmission.php
index 06b73ae3b578b1db6baede504d0b0090ab928821..0fc2881c7699caf89c1e5fc0b532c66f4220d67f 100644
--- a/Civi/GeotargetedPetitions/PetitionSubmission.php
+++ b/Civi/GeotargetedPetitions/PetitionSubmission.php
@@ -44,7 +44,7 @@ class PetitionSubmission {
       $petitionForm['subject3']
     ];
     // Get a random subject from petition values
-    $subject = _randomizeSubject($subjects);
+    $randomSubject = _randomizeSubject($subjects);
     $assignee_contact_ids = [];
     $first_name = $submittedFields['Individual1'][0]['fields']['first_name'];
     $last_name = $submittedFields['Individual1'][0]['fields']['last_name'];
@@ -106,7 +106,8 @@ class PetitionSubmission {
               'from' => $updatedFromEmail,
               'replyTo' => $replyTo,
               'html' => $body,
-              'subject' => $subject,
+              // Use submitted message subject as js has randomised it or if subject wasn't on the form use the php random subject
+              'subject' => $fields['message_subject'] ?? $randomSubject,
             ];
             if ($sandboxMode) {
               // SANDBOX MODE: send email to logged-in user
@@ -138,7 +139,7 @@ class PetitionSubmission {
       }
     }
     Activity::create(FALSE)
-      ->addValue('subject', $subject)
+      ->addValue('subject', $fields['message_subject'] ?? $randomSubject)
       ->addValue('details', $body)
       ->addValue('activity_type_id:name', 'Petition Signature')
       ->addValue('source_contact_id', $event->getEntityIds('Individual1')[0])
diff --git a/lib/js/form.js b/lib/js/form.js
index 9653eda41b9f383ced2615aa18052cc1d7e15d5a..398f912551bfdf8dd1f1aa44177507c6b118228a 100644
--- a/lib/js/form.js
+++ b/lib/js/form.js
@@ -18,6 +18,23 @@ function waitForElm(selector) {
     });
   });
 }
+function shuffle(array) {
+  let currentIndex = array.length,  randomIndex;
+
+  // While there remain elements to shuffle.
+  while (currentIndex > 0) {
+
+    // Pick a remaining element.
+    randomIndex = Math.floor(Math.random() * currentIndex);
+    currentIndex--;
+
+    // And swap it with the current element.
+    [array[currentIndex], array[randomIndex]] = [
+      array[randomIndex], array[currentIndex]];
+  }
+
+  return array;
+}
 (function ($, angular) {
   let default_recipients_set = {};
   let representatives = addRepresentativesSection();
@@ -66,7 +83,16 @@ function waitForElm(selector) {
       }).then(function (settings) {
         if (settings.length) {
           if (messageSubjectAfField.length) {
-            messageSubjectAfField.find('input').val(settings[0].subject1).trigger('change');
+            let subjects = [];
+            let possiblesubjects = ['subject1', 'subject2', 'subject3'];
+            for (i=0; i < possiblesubjects.length; i++) {
+              if (settings[0][possiblesubjects[i]].length > 0) {
+                subjects.push(possiblesubjects[i]);
+              }
+            }
+            subjects = shuffle(subjects);
+            let randomNumber = Math.floor(Math.random() * subjects.length);
+            messageSubjectAfField.find('input').val(settings[0][subjects[randomNumber]]).trigger('change');
           }
           // fill in the default message fields
           if (messageEditableAfField.length) {