diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
index f5434e1..9cf478d 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java
@@ -32,15 +32,15 @@
     this.tracer = tracer;
     this.impl = impl;
     this.parent = parent;
-    if (description == null) {
-      this.description = Thread.currentThread().getName();
-    } else {
-      this.description = description;
-    }
+    this.description = description;
   }
 
   @Override
   public V call() throws Exception {
+    String description = this.description;
+    if (description == null) {
+      description = Thread.currentThread().getName();
+    }
     try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) {
       return impl.call();
     }
diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
index abf530f..f2db5c2 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java
@@ -30,15 +30,15 @@
     this.tracer = tracer;
     this.parent = parent;
     this.runnable = runnable;
-    if (description == null) {
-      this.description = Thread.currentThread().getName();
-    } else {
-      this.description = description;
-    }
+    this.description = description;
   }
 
   @Override
   public void run() {
+    String description = this.description;
+    if (description == null) {
+      description = Thread.currentThread().getName();
+    }
     try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) {
       runnable.run();
     }
diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
index 9a5b04e..a04c9b9 100644
--- a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
+++ b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java
@@ -465,6 +465,10 @@
     return new TraceRunnable(this, parentScope, runnable, description);
   }
 
+  public TraceExecutorService newTraceExecutorService(ExecutorService impl) {
+    return newTraceExecutorService(impl, null);
+  }
+
   public TraceExecutorService newTraceExecutorService(ExecutorService impl,
                                                       String scopeName) {
     return new TraceExecutorService(this, scopeName, impl);
diff --git a/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java
new file mode 100644
index 0000000..bf98a1a
--- /dev/null
+++ b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.htrace.core;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.Test;
+
+public class TestTraceExecutor {
+  private static final int WAIT_TIME_SECONDS = 60;
+
+  @Test
+  public void testExecutorWithNullScope() throws Exception {
+    HTraceConfiguration conf = HTraceConfiguration.fromKeyValuePairs("sampler.classes", "AlwaysSampler");
+    ExecutorService es = null;
+    try (Tracer tracer = new Tracer.Builder("TestTraceExecutor").conf(conf).build()) {
+      es = Executors.newSingleThreadExecutor(new NamingThreadFactory());
+      es = tracer.newTraceExecutorService(es);
+
+      try (TraceScope scope = tracer.newScope("TestRunnable")) {
+        final AtomicReference<String> description = new AtomicReference<String>("");
+        es.submit(new Runnable() {
+          @Override
+          public void run() {
+            description.set(Tracer.getCurrentSpan().getDescription());
+          }
+        }).get(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
+        assertEquals("TraceRunnable did not set description correctly", "child-thread-1", description.get());
+      }
+
+      try (TraceScope scope = tracer.newScope("TestCallable")) {
+        String description = es.submit(new Callable<String>() {
+          @Override
+          public String call() throws Exception {
+            return Tracer.getCurrentSpan().getDescription();
+          }
+        }).get(WAIT_TIME_SECONDS, TimeUnit.SECONDS);
+        assertEquals("TraceCallable did not set description correctly", "child-thread-1", description);
+      }
+    } finally {
+      if (es != null) {
+        es.shutdown();
+      }
+    }
+  }
+
+  /*
+   * Inspired by org.apache.solr.util.DefaultSolrThreadFactory
+   */
+  static class NamingThreadFactory implements ThreadFactory {
+    private final ThreadGroup group;
+    private final AtomicInteger threadNumber = new AtomicInteger(1);
+
+    public NamingThreadFactory() {
+      SecurityManager s = System.getSecurityManager();
+      group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
+    }
+
+    @Override
+    public Thread newThread(Runnable r) {
+      return new Thread(group, r, "child-thread-" + threadNumber.getAndIncrement(), 0);
+    }
+  }
+}
