diff --git a/ee/app/services/concerns/epics/sync_as_work_item.rb b/ee/app/services/concerns/epics/sync_as_work_item.rb
index 0dd9d6e4949c35393f4b0fb4316dc86af4af0f8b..f3e8087088d2623f1bb62a3e06235c47107e3eec 100644
--- a/ee/app/services/concerns/epics/sync_as_work_item.rb
+++ b/ee/app/services/concerns/epics/sync_as_work_item.rb
@@ -75,7 +75,7 @@ def sync_color(epic, work_item)
       work_item_color = work_item.color || work_item.build_color
 
       # only set non default color or remove the color if default color is set to epic
-      if epic.color.to_s == ::Epic::DEFAULT_COLOR.to_s
+      if epic.color.to_s == ::Epic::DEFAULT_COLOR.to_s && work_item.color.new_record?
         work_item.color = nil
       else
         work_item_color.color = epic.color
diff --git a/ee/spec/services/epics/create_service_spec.rb b/ee/spec/services/epics/create_service_spec.rb
index a21cea8badb4bf5acc7e5606c46874eafa2070db..00e950cd45046d249882d95a573637d5baa64f9c 100644
--- a/ee/spec/services/epics/create_service_spec.rb
+++ b/ee/spec/services/epics/create_service_spec.rb
@@ -101,6 +101,14 @@
         end
       end
 
+      context 'when epic color is set to default' do
+        let(:params) { { title: 'some epic', color: ::Epic::DEFAULT_COLOR } }
+
+        it_behaves_like 'syncs all data from an epic to a work item' do
+          let(:epic) { Epic.last }
+        end
+      end
+
       context 'when date params are not set and is_fixed is false' do
         let!(:params) do
           {
diff --git a/ee/spec/services/epics/update_service_spec.rb b/ee/spec/services/epics/update_service_spec.rb
index 867cf0e9bef126d7a8383b35551689c871b7052e..c903be9580773ed9cd75257c8e7cbe6c5ced76d0 100644
--- a/ee/spec/services/epics/update_service_spec.rb
+++ b/ee/spec/services/epics/update_service_spec.rb
@@ -907,6 +907,18 @@ def update_issuable(update_params)
               end
             end
 
+            context 'with epic color' do
+              let_it_be_with_reload(:epic) { create(:epic, group: group, color: '#ffffff') }
+
+              let(:opts) { { color: ::Epic::DEFAULT_COLOR } }
+
+              before do
+                create(:color, work_item: epic.work_item, color: epic.color)
+              end
+
+              it_behaves_like 'syncs all data from an epic to a work item'
+            end
+
             context 'description tasks' do
               context 'when marking a task as done' do
                 let_it_be(:description) { '- [ ] Task' }
@@ -935,9 +947,7 @@ def update_issuable(update_params)
 
                 context 'when saving to the work item fails' do
                   before do
-                    allow_next_found_instance_of(::WorkItem) do |instance|
-                      allow(instance).to receive(:save!).and_raise(ActiveRecord::RecordInvalid.new)
-                    end
+                    allow(work_item).to receive(:save!).and_raise(ActiveRecord::RecordInvalid.new)
                   end
 
                   it 'does not update the epic or the work item' do
diff --git a/ee/spec/support/shared_examples/services/epic/sync_work_item_shared_examples.rb b/ee/spec/support/shared_examples/services/epic/sync_work_item_shared_examples.rb
index 252cab0601e6d996c14d89f5d4b814a2c761428d..e48711ad86edd522fddb73812f2062f6c02acd0c 100644
--- a/ee/spec/support/shared_examples/services/epic/sync_work_item_shared_examples.rb
+++ b/ee/spec/support/shared_examples/services/epic/sync_work_item_shared_examples.rb
@@ -43,10 +43,10 @@
     epic.reload
     work_item = epic.work_item
 
-    if epic.color == Epic::DEFAULT_COLOR
-      expect(work_item.color).to be_nil
-    else
+    if work_item.color.present?
       expect(work_item.color.color).to eq(epic.color)
+    else
+      expect(epic.color).to eq(Epic::DEFAULT_COLOR)
     end
 
     if epic.parent