diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
index 8553a6b..bd991f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
@@ -17,9 +17,6 @@
 
 @Slf4j
 public class ChatGptPrompt {
-    public static final String SPACE = " ";
-    public static final String DOT = ". ";
-
     // Reply attributes
     public static final String ATTRIBUTE_ID = "id";
     public static final String ATTRIBUTE_REPLY = "reply";
@@ -68,10 +65,12 @@
     }
 
     public static String getCommentRequestUserPrompt(int commentPropertiesSize) {
-        return DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT + SPACE +
-                buildFieldSpecifications(REQUEST_REPLY_ATTRIBUTES) + SPACE +
-                DEFAULT_GPT_REPLIES_PROMPT_INLINE + SPACE +
-                String.format(DEFAULT_GPT_REPLIES_PROMPT_ENFORCE_RESPONSE_CHECK, commentPropertiesSize);
+        return joinWithSpace(new ArrayList<>(List.of(
+                DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT,
+                buildFieldSpecifications(REQUEST_REPLY_ATTRIBUTES),
+                DEFAULT_GPT_REPLIES_PROMPT_INLINE,
+                String.format(DEFAULT_GPT_REPLIES_PROMPT_ENFORCE_RESPONSE_CHECK, commentPropertiesSize)
+        )));
     }
 
     public static String getReviewPromptCommitMessages() {
@@ -129,8 +128,7 @@
             attributes.remove(ATTRIBUTE_SCORE);
         }
         updateRelevanceDescription();
-        return buildFieldSpecifications(attributes) + SPACE +
-                DEFAULT_GPT_REPLIES_PROMPT_INLINE;
+        return buildFieldSpecifications(attributes) + SPACE + DEFAULT_GPT_REPLIES_PROMPT_INLINE;
     }
 
     private void updateScoreDescription() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
index 2cf6d2b..9a16f7c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
@@ -63,7 +63,7 @@
                 instructions.add(getReviewPromptCommitMessages());
             }
         }
-        return String.join(SPACE, instructions);
+        return joinWithSpace(instructions);
     }
 
     public String getDefaultGptThreadReviewMessage(String patchSet) {
@@ -89,7 +89,7 @@
                         DEFAULT_GPT_ASSISTANT_INSTRUCTIONS_DONT_GUESS_CODE,
                         DEFAULT_GPT_ASSISTANT_INSTRUCTIONS_HISTORY
                 )),
-                RULE_NUMBER_PREFIX, COLON
+                RULE_NUMBER_PREFIX, COLON_SPACE
         )));
     }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
index b63256e..b466c91 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
@@ -9,9 +9,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-import static com.googlesource.gerrit.plugins.chatgpt.utils.StringUtils.concatenate;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.getNumberedListString;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.joinWithNewLine;
+import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.*;
 
 @Slf4j
 public class ChatGptPromptStateless extends ChatGptPrompt {
@@ -33,20 +31,22 @@
     }
 
     public static String getDefaultGptReviewSystemPrompt() {
-        return DEFAULT_GPT_SYSTEM_PROMPT + DOT +
-                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION + SPACE +
-                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW;
+        return joinWithSpace(new ArrayList<>(List.of(
+                DEFAULT_GPT_SYSTEM_PROMPT + DOT,
+                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION,
+                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW
+        )));
     }
 
     public String getGptSystemPrompt() {
         List<String> prompt = new ArrayList<>(Arrays.asList(
-                config.getString(Configuration.KEY_GPT_SYSTEM_PROMPT, DEFAULT_GPT_SYSTEM_PROMPT), DOT,
+                config.getString(Configuration.KEY_GPT_SYSTEM_PROMPT, DEFAULT_GPT_SYSTEM_PROMPT) + DOT,
                 ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION
         ));
         if (!isCommentEvent) {
-            prompt.addAll(Arrays.asList(SPACE, ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW));
+            prompt.add(ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW);
         }
-        return concatenate(prompt);
+        return joinWithSpace(prompt);
     }
 
     public String getGptUserPrompt(ChangeSetData changeSetData, String patchSet) {
@@ -88,12 +88,13 @@
     }
 
     private List<String> getReviewSteps() {
-        List<String> steps = new ArrayList<>(){};
-        steps.add(
-                DEFAULT_GPT_REVIEW_PROMPT_REVIEW + SPACE +
-                DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT + SPACE +
-                getPatchSetReviewUserPrompt()
-        );
+        List<String> steps = new ArrayList<>(List.of(
+                joinWithSpace(new ArrayList<>(List.of(
+                        DEFAULT_GPT_REVIEW_PROMPT_REVIEW,
+                        DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT,
+                        getPatchSetReviewUserPrompt()
+                )))
+        ));
         if (config.getGptReviewCommitMessages()) {
             steps.add(getReviewPromptCommitMessages());
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
index a78470f..e4f41e8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
@@ -14,10 +14,11 @@
     public static final String CODE_DELIMITER = "```";
     public static final String CODE_DELIMITER_BEGIN ="\n\n" + CODE_DELIMITER + "\n";
     public static final String CODE_DELIMITER_END ="\n" + CODE_DELIMITER + "\n";
-    public static final String COLON = ": ";
-
-    private static final String COMMA = ", ";
-    private static final String SEMICOLON = "; ";
+    public static final String SPACE = " ";
+    public static final String DOT = ".";
+    public static final String COMMA_SPACE = ", ";
+    public static final String COLON_SPACE = ": ";
+    public static final String SEMICOLON_SPACE = "; ";
 
     public static String parseOutOfDelimiters(String body, String splitDelim, Function<String, String> processMessage,
                                               String leftDelimReplacement, String rightDelimReplacement) {
@@ -48,12 +49,16 @@
         return String.join("\n\n", components);
     }
 
+    public static String joinWithSpace(List<String> components) {
+        return String.join(SPACE, components);
+    }
+
     public static String joinWithComma(Set<String> components) {
-        return String.join(COMMA, components);
+        return String.join(COMMA_SPACE, components);
     }
 
     public static String joinWithSemicolon(List<String> components) {
-        return String.join(SEMICOLON, components);
+        return String.join(SEMICOLON_SPACE, components);
     }
 
     public static List<String> getNumberedList(List<String> components, String prefix, String postfix) {
