diff --git a/nav2_rviz_plugins/include/nav2_rviz_plugins/nav2_panel.hpp b/nav2_rviz_plugins/include/nav2_rviz_plugins/nav2_panel.hpp
index b9eb6f38cb19dc845f8c807c91b9e7c7b4346198..1e6532723a6dfbe8a87d05db0608653c13c088a6 100644
--- a/nav2_rviz_plugins/include/nav2_rviz_plugins/nav2_panel.hpp
+++ b/nav2_rviz_plugins/include/nav2_rviz_plugins/nav2_panel.hpp
@@ -35,6 +35,8 @@ class QPushButton;
 namespace nav2_rviz_plugins
 {
 
+class InitialThread;
+
 /// Panel to interface to the nav2 stack
 class Nav2Panel : public rviz_common::Panel
 {
@@ -51,6 +53,7 @@ public:
   void save(rviz_common::Config config) const override;
 
 private Q_SLOTS:
+  void startThread();
   void onStartup();
   void onShutdown();
   void onCancel();
@@ -87,6 +90,7 @@ private:
   QPushButton * pause_resume_button_{nullptr};
 
   QStateMachine state_machine_;
+  InitialThread * initial_thread_;
 
   QState * pre_initial_{nullptr};
   QState * initial_{nullptr};
diff --git a/nav2_rviz_plugins/src/nav2_panel.cpp b/nav2_rviz_plugins/src/nav2_panel.cpp
index a9623c281733ac2a696b2c9a5810cf9809bf0bf2..0deffec59490a3d263896272352ebe24bb60f3c9 100644
--- a/nav2_rviz_plugins/src/nav2_panel.cpp
+++ b/nav2_rviz_plugins/src/nav2_panel.cpp
@@ -136,15 +136,15 @@ Nav2Panel::Nav2Panel(QWidget * parent)
   runningTransition->setTargetState(idle_);
   running_->addTransition(runningTransition);
 
-  InitialThread * initialThread = new InitialThread(client_);
-  connect(initialThread, &InitialThread::finished, initialThread, &QObject::deleteLater);
+  initial_thread_ = new InitialThread(client_);
+  connect(initial_thread_, &InitialThread::finished, initial_thread_, &QObject::deleteLater);
 
-  QSignalTransition * activeSignal = new QSignalTransition(initialThread,
+  QSignalTransition * activeSignal = new QSignalTransition(initial_thread_,
       &InitialThread::activeSystem);
   activeSignal->setTargetState(idle_);
   pre_initial_->addTransition(activeSignal);
 
-  QSignalTransition * inactiveSignal = new QSignalTransition(initialThread,
+  QSignalTransition * inactiveSignal = new QSignalTransition(initial_thread_,
       &InitialThread::inactiveSystem);
   inactiveSignal->setTargetState(initial_);
   pre_initial_->addTransition(inactiveSignal);
@@ -161,6 +161,9 @@ Nav2Panel::Nav2Panel(QWidget * parent)
   state_machine_.setInitialState(pre_initial_);
   state_machine_.start();
 
+  // delay starting initial thread until state machine has started or a race occurs
+  QObject::connect(&state_machine_, SIGNAL(started()), this, SLOT(startThread()));
+
   // Lay out the items in the panel
   QVBoxLayout * main_layout = new QVBoxLayout;
   main_layout->addWidget(pause_resume_button_);
@@ -178,8 +181,6 @@ Nav2Panel::Nav2Panel(QWidget * parent)
 
   QObject::connect(&GoalUpdater, SIGNAL(updateGoal(double,double,double,QString)),  // NOLINT
     this, SLOT(onNewGoal(double,double,double,QString)));  // NOLINT
-
-  initialThread->start();
 }
 
 Nav2Panel::~Nav2Panel()
@@ -192,6 +193,13 @@ Nav2Panel::onInitialize()
   auto node = getDisplayContext()->getRosNodeAbstraction().lock()->get_raw_node();
 }
 
+void
+Nav2Panel::startThread()
+{
+  // start initial thread now that state machine is started
+  initial_thread_->start();
+}
+
 void
 Nav2Panel::onPause()
 {