Merge branch '3.7-dev'
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 19afd6f..ed2463f 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -53,6 +53,7 @@
 * Refactored mutation events registration by moving reusable code from relevant steps to `EventUtil`
 * Open `NoOpBarrierStep` for extensibility (removed `final` keyword)
 * Deprecated public constructor for `SeedStrategy` in favor of builder pattern to be consistent with other strategies.
+* Allow specifying a customized Spark app name
 
 [[release-3-7-2]]
 === TinkerPop 3.7.2 (April 8, 2024)
diff --git a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/structure/Spark.java b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/structure/Spark.java
index 697e649..c000749 100644
--- a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/structure/Spark.java
+++ b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/structure/Spark.java
@@ -43,12 +43,17 @@
     private static SparkContext CONTEXT;
     private static final Map<String, RDD<?>> NAME_TO_RDD = new ConcurrentHashMap<>();
 
+    public static final String DEFAULT_APP_NAME = "Apache TinkerPop's Spark-Gremlin";
+
     private Spark() {
     }
 
     public static SparkContext create(final SparkConf sparkConf) {
         if (isContextNullOrStopped()) {
-            sparkConf.setAppName("Apache TinkerPop's Spark-Gremlin");
+            // Set the default app name if it is not specified
+            if (sparkConf.get("spark.app.name", DEFAULT_APP_NAME).equals(DEFAULT_APP_NAME)) {
+                sparkConf.setAppName(DEFAULT_APP_NAME);
+            }
             CONTEXT = SparkContext.getOrCreate(sparkConf);
         }
         return CONTEXT;
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
index 2bd4c94..a4aad70 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
@@ -51,6 +51,23 @@
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class SparkTest extends AbstractSparkTest {
+    @Test
+    public void testCustomizedSparkAppName() {
+	final String appName = "SparkAppNameTest";
+	final org.apache.spark.SparkConf sparkConfiguration = new org.apache.spark.SparkConf();
+	sparkConfiguration.set("spark.app.name", appName);
+	sparkConfiguration.set("spark.master", "local[4]");
+	final org.apache.spark.SparkContext sparkContext = Spark.create(sparkConfiguration);
+	assertEquals(appName, sparkContext.getConf().get("spark.app.name"));
+    }
+
+    @Test
+    public void testDefaultSparkAppName() {
+	final org.apache.spark.SparkConf sparkConfiguration = new org.apache.spark.SparkConf();
+	sparkConfiguration.set("spark.master", "local[4]");
+	final org.apache.spark.SparkContext sparkContext = Spark.create(sparkConfiguration);
+	assertEquals(Spark.DEFAULT_APP_NAME, sparkContext.getConf().get("spark.app.name"));
+    }
 
     @Test
     public void testSparkRDDPersistence() throws Exception {