diff --git a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
index c38684a6dc3dc07e5de7435b419057da3912105c..b5137f9db6b7077f9feac5f69aecd8ce3a5cca99 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
@@ -144,7 +144,7 @@
 
     context 'has image' do
       it 'replaces rich text with img to the embedded image' do
-        expect(nb_file.highlighted_diff_lines[58].rich_text).to include('<img')
+        expect(nb_file.highlighted_diff_lines[56].rich_text).to include('<img')
       end
 
       it 'adds image to src' do
@@ -159,11 +159,11 @@
       let(:commit) { project.commit("4963fefc990451a8ad34289ce266b757456fc88c") }
 
       it 'prevents injected html to be rendered as html' do
-        expect(nb_file.highlighted_diff_lines[45].rich_text).not_to include('<div>Hello')
+        expect(nb_file.highlighted_diff_lines[43].rich_text).not_to include('<div>Hello')
       end
 
       it 'keeps the injected html as part of the string' do
-        expect(nb_file.highlighted_diff_lines[45].rich_text).to end_with('/div&gt;">')
+        expect(nb_file.highlighted_diff_lines[43].rich_text).to end_with('/div&gt;">')
       end
     end
   end
diff --git a/vendor/gems/ipynbdiff/lib/output_transformer.rb b/vendor/gems/ipynbdiff/lib/output_transformer.rb
index 88728df2f173e3f188ede525986dbc073f809636..e7adfbd8c3e9fd1d8e5c92fde46040f08ae96f09 100644
--- a/vendor/gems/ipynbdiff/lib/output_transformer.rb
+++ b/vendor/gems/ipynbdiff/lib/output_transformer.rb
@@ -19,25 +19,14 @@ def initialize(hide_images: false)
     end
 
     def transform(output, symbol)
-      transformed = case (output_type = output['output_type'])
-                    when 'error'
-                      transform_error(output['traceback'], symbol / 'traceback')
-                    when 'execute_result', 'display_data'
-                      transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
-                    when 'stream'
-                      transform_element('text', output['text'], symbol)
-                    end
-
-      transformed ? decorate_output(transformed, output, symbol) : []
-    end
-
-    def decorate_output(output_rows, output, symbol)
-      [
-        _,
-        _(symbol, %(%%%% Output: #{output['output_type']})),
-        _,
-        *output_rows
-      ]
+      case (output_type = output['output_type'])
+      when 'error'
+        transform_error(output['traceback'], symbol / 'traceback')
+      when 'execute_result', 'display_data'
+        transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
+      when 'stream'
+        transform_element('text', output['text'], symbol)
+      end
     end
 
     def transform_error(traceback, symbol)
diff --git a/vendor/gems/ipynbdiff/lib/transformer.rb b/vendor/gems/ipynbdiff/lib/transformer.rb
index 153d821db2797df57858210eb8d820744ff8ca99..64d59eeaea8d69c1890094fc36aba14cc8971411 100644
--- a/vendor/gems/ipynbdiff/lib/transformer.rb
+++ b/vendor/gems/ipynbdiff/lib/transformer.rb
@@ -20,7 +20,7 @@ class Transformer
     def initialize(include_frontmatter: true, hide_images: false)
       @include_frontmatter = include_frontmatter
       @hide_images = hide_images
-      @output_transformer = OutputTransformer.new(hide_images: hide_images)
+      @out_transformer = OutputTransformer.new(hide_images: hide_images)
     end
 
     def validate_notebook(notebook)
@@ -75,9 +75,19 @@ def transform_code_cell(cell, notebook, symbol)
         _(symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''})),
         symbolize_array(symbol / 'source', cell['source'], &:rstrip),
         _(nil, '```'),
-        cell['outputs'].map.with_index do |output, idx|
-          @output_transformer.transform(output, symbol / ['outputs', idx])
-        end
+        transform_outputs(cell['outputs'], symbol)
+      ]
+    end
+
+    def transform_outputs(outputs, symbol)
+      transformed = outputs.map
+                           .with_index { |output, i| @out_transformer.transform(output, symbol / ['outputs', i]) }
+                           .compact
+                           .map { |el| [_, el] }
+
+      [
+        transformed.empty? ? [] : [_, _(symbol / 'outputs', '%% Output')],
+        transformed
       ]
     end
 
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
index 5be645de9c9718b055de5f93cc709c37a9f8063c..e6e8a0755988dbbb9734a95726fca79b0114e095 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
@@ -5,7 +5,7 @@
 y = sin(x)
 ```
 
-%%%% Output: error
+%% Output
 
     ---------------------------------------------------------------------------
     NameError                                 Traceback (most recent call last)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
index 75e35d123d058bd14291150fefd1b198c9216653..5d2f248135df1bc8bcdde924de6dbb225e7d6394 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
@@ -5,7 +5,7 @@
 .cells.0.source.1
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.traceback.0
 .cells.0.outputs.0.traceback.1
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
index 89a812740a6d46d283ed415b166a631aa404e0c3..ff63d351a3b72721e15bbdbd0a4f70c7f831f29b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
@@ -3,10 +3,8 @@
 ``` python
 ```
 
-%%%% Output: display_data
+%% Output
 
     [Hidden Image Output]
 
-%%%% Output: display_data
-
     [Hidden Image Output]
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
index b94e9538f58d879f6d90fd5e8e77e1cd79c06f0d..b8f24f9fba537b603ae848cef0b2ef8d5213b286 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
@@ -3,10 +3,8 @@
 .cells.0.source
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 
 
-.cells.0.outputs.1
-
 
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
index 456224f3afff830d605dba31ed72436ba02ac685..3085da739ed7f956ff8eb12e6836f5bceb08ba7b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
@@ -4,7 +4,7 @@
 df[:2]
 ```
 
-%%%% Output: execute_result
+%% Output
 
               x         y
     0  0.000000  0.000000
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
index fa9d412c6dce5812ce27bd3df909625538b34d6a..3bf319d1fa659f0355b316368fd5110cff8c44ec 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
@@ -4,7 +4,7 @@
 .cells.0.source.0
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.text/plain.0
 .cells.0.outputs.0.data.text/plain.1
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
index add84ed26a03a089e69fdf16ce6552caf818d9f6..194c1f43c42908707c8303a9a01133eef0ee71c5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
@@ -5,6 +5,6 @@ from IPython.display import display, Math
 display(Math(r'Dims: {}x{}m \\ Area: {}m^2 \\ Volume: {}m^3'.format(1, round(2,2), 3, 4)))
 ```
 
-%%%% Output: display_data
+%% Output
 
     $\displaystyle Dims: 1x2m \\ Area: 3m^2 \\ Volume: 4m^3$
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
index 9407e6db7025d0f37d77bd6a910ea28827888a19..868adca2712841937e7af5cf43532b1685a2c94b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
@@ -5,6 +5,6 @@
 .cells.0.source.1
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.text/latex.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
index 4a880d8ce18e672c787ca7070fe9d8aa5813d952..0a69c8370e7baf50ceba745df8263c6132228507 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
@@ -4,6 +4,6 @@
 Some Image
 ```
 
-%%%% Output: display_data
+%% Output
 
     ![](data:image/png;base64,this_is_an_invalid_hash_for_testing_purposes)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
index 26e11781ec11a3d64fa8963a39e1665296f5912b..1b66012ef2050cecc1cf557de61acba416b1a792 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
@@ -4,6 +4,6 @@
 .cells.0.source.0
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.image/png
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
index ecb0029f256065491ef3c7b8b767837f1e87a59f..1ece1f2fd06a301d7c86a5bf6eb20e8cf10b3800 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
@@ -38,12 +38,10 @@ y = np.sin(x)
 plt.plot(x, y)
 ```
 
-%%%% Output: execute_result
+%% Output
 
     [<matplotlib.lines.Line2D at 0x123e39370>]
 
-%%%% Output: display_data
-
     ![](data:image/png;base64,some_invalid_base64_image_here)
 
 %% Cell type:code id:dc1178cd-c46d-4da3-9ab5-08f000699884 tags:
@@ -58,7 +56,7 @@ df = pd.DataFrame({"x": x, "y": y})
 df[:2]
 ```
 
-%%%% Output: execute_result
+%% Output
 
               x         y
     0  0.000000  0.000000
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
index ab70e7bc908b702cb2983aa4f8430ff615065716..c95665d1903961e9e32e456a6caf391c9647b3f8 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
@@ -38,12 +38,10 @@
 .cells.4.source.3
 
 
-.cells.4.outputs.0
+.cells.4.outputs
 
 .cells.4.outputs.0.data.text/plain.0
 
-.cells.4.outputs.1
-
 .cells.4.outputs.1.data.image/png
 
 .cells.5
@@ -58,7 +56,7 @@
 .cells.6.source.0
 
 
-.cells.6.outputs.0
+.cells.6.outputs
 
 .cells.6.outputs.0.data.text/plain.0
 .cells.6.outputs.0.data.text/plain.1
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
index fb862cbb6364e387cbdddc37a1457406bb3ff5e2..0448bf211112d7515d5a4ed199f4cbd73f685f88 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
@@ -4,6 +4,6 @@
 print("G'bye")
 ```
 
-%%%% Output: stream
+%% Output
 
     G'bye
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
index ed4a8a075d3bdf51a675456e08098168d6fe80e1..be4e2861ea90931548c73067d6931066a97a7104 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
@@ -4,6 +4,6 @@
 .cells.0.source.0
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.text.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md b/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
index 37269446f5a899f5e47c4d7f077e24177bb3fe22..a5a167d31c50d50e49798b41607dd0d052f1fc4c 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
@@ -10,10 +10,8 @@ svg = """<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
 display(SVG(svg))
 ```
 
-%%%% Output: display_data
+%% Output
 
     ![](data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="50"/></svg>)
 
-%%%% Output: display_data
-
     ![](data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="50"/></svg>)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
index dd2e412302d8d3f6730b447aa3a0b0739994e534..861198a8c926f0442a805d90f9d94afb81f81aa8 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
@@ -10,10 +10,8 @@
 .cells.0.source.6
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.image/svg+xml
 
-.cells.0.outputs.1
-
 .cells.0.outputs.1.data.image/svg+xml
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
index 924f4939f54022e82ddeebcdcf6ac365918cac8d..1b6c086ecd57fcbb064262d186288de99c6ac382 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
@@ -4,6 +4,6 @@
 plt.plot(x, y)
 ```
 
-%%%% Output: execute_result
+%% Output
 
     [<matplotlib.lines.Line2D at 0x12a4e43d0>]
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
index 179b30098a13c13e45b6055ab3987e20d90615d1..a004d852ba424cee98c27b7f1c05c2396e16fc5c 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
@@ -4,6 +4,6 @@
 .cells.0.source.0
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.text/plain.0
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
index b1dda235951666d7925f5807b85044185af42f69..c77f109378ccdcc53e5df086b8d616a127487469 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
@@ -7,10 +7,8 @@ y = 2 * np.sin(x)
 plt.plot(x, y)
 ```
 
-%%%% Output: execute_result
+%% Output
 
     [<matplotlib.lines.Line2D at 0x12a4e43d0>]
 
-%%%% Output: display_data
-
     ![](data:image/png;base64,this_is_an_invalid_hash_for_testing_purposes)
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
index 5a86e4daa675cf5523fbacbc21e922a048095e41..49f2d7149d84d6ed897f28836d6a4c6161af565d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
+++ b/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
@@ -7,10 +7,8 @@
 .cells.0.source.3
 
 
-.cells.0.outputs.0
+.cells.0.outputs
 
 .cells.0.outputs.0.data.text/plain.0
 
-.cells.0.outputs.1
-
 .cells.0.outputs.1.data.image/png