patch 9.1.1391: Vim does not have a vertical tabpanel

Problem:  Vim does not have a tabpanel
Solution: include the tabpanel feature
          (Naruhiko Nishino, thinca)

closes: #17263

Co-authored-by: thinca <thinca@gmail.com>
Signed-off-by: Naruhiko Nishino <naru123456789@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 88bf5c3..ef86a7d 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -311,6 +311,7 @@
 	test_tab \
 	test_tabline \
 	test_tabpage \
+	test_tabpanel \
 	test_tagcase \
 	test_tagfunc \
 	test_tagjump \
@@ -567,6 +568,7 @@
 	test_system.res \
 	test_tab.res \
 	test_tabpage.res \
+	test_tabpanel.res \
 	test_tagjump.res \
 	test_taglist.res \
 	test_tcl.res \
diff --git a/src/testdir/dumps/Test_tabpanel_commandline_0.dump b/src/testdir/dumps/Test_tabpanel_commandline_0.dump
new file mode 100644
index 0000000..5ed359c
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_commandline_0.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| | +0#0000000#ffffff0@34
+|[+2&&|N|o| |N|a|m|e|]| |~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+|a+0#0000001#ffff4012|b@1|r|e|v|i|a|t|e| +3#0000000#ffffff0@1|a|b|c|l|e|a|r| @1|a|b|o|v|e|l|e|f|t| @1|a|b|s|t|r|a|c|t| @4
+|:+0&&|a|b@1|r|e|v|i|a|t|e> @33
diff --git a/src/testdir/dumps/Test_tabpanel_commandline_1.dump b/src/testdir/dumps/Test_tabpanel_commandline_1.dump
new file mode 100644
index 0000000..a44f54e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_commandline_1.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| | +0#0000000#ffffff0@34
+|[+2&&|N|o| |N|a|m|e|]| |~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +0#0000001#e0e0e08|a|b@1|r|e|v|i|a|t|e| @4| +0#4040ff13#ffffff0@28
+| +0#0000001#ffd7ff255|a|b|c|l|e|a|r| @7| +0#4040ff13#ffffff0@28
+| +0#0000001#ffd7ff255|a|b|o|v|e|l|e|f|t| @5| +0#4040ff13#ffffff0@28
+| +0#0000001#ffd7ff255|a|b|s|t|r|a|c|t| @6| +0#4040ff13#ffffff0@28
+|:+0#0000000&|a|b@1|r|e|v|i|a|t|e> @33
diff --git a/src/testdir/dumps/Test_tabpanel_dont_overflow_into_tabpanel_0.dump b/src/testdir/dumps/Test_tabpanel_dont_overflow_into_tabpanel_0.dump
new file mode 100644
index 0000000..5fd8f9b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_dont_overflow_into_tabpanel_0.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| @1|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|+| |[|N|o| |N|a|m|e|]| | +1&&@9|X+8#0000001#e0e0e08
+|++2#0000000#ffffff0| |[|N|o| |N|a|m|e>x+0&&@34
+| +1&&@9|x+0&&@34
+| +1&&@9|x+0&&@29| @4
+| +1&&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +0#0000000&@36|1|,|1| @4
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_00.dump b/src/testdir/dumps/Test_tabpanel_drawing_00.dump
new file mode 100644
index 0000000..1491b66
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_00.dump
@@ -0,0 +1,6 @@
+> +0&#ffffff0@44
+|~+0#4040ff13&| @43
+|~| @43
+|~| @43
+|~| @43
+| +0#0000000&@26|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_01.dump b/src/testdir/dumps/Test_tabpanel_drawing_01.dump
new file mode 100644
index 0000000..8601542
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_01.dump
@@ -0,0 +1,6 @@
+|X+2&#ffffff0|t|a|b|p|a|n|e|l|1| @5> +0&&@28
+| +1&&@15|~+0#4040ff13&| @27
+| +1#0000000&@15|~+0#4040ff13&| @27
+| +1#0000000&@15|~+0#4040ff13&| @27
+| +1#0000000&@15|~+0#4040ff13&| @27
+| +0#0000000&@26|0|,|0|-|1| @8|A|l|0|,
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_02.dump b/src/testdir/dumps/Test_tabpanel_drawing_02.dump
new file mode 100644
index 0000000..f7567dc
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_02.dump
@@ -0,0 +1,6 @@
+|2+2#e000e06#ffffff0| +2#0000000&|X|t|a|b|p|a|n|e|l|1| @3> +0&&@19||+1&&| +0&&@7
+| +1&&@15|~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @6
+| +1#0000000&@15|~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @6
+| +1#0000000&@15|~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @6
+| +1#0000000&@15|<+3&&|a|b|p|a|n|e|l|1| |0|,|0|-|1| @1|A|l@1| |<+1&&|l|1| |0|,|0|-
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_03.dump b/src/testdir/dumps/Test_tabpanel_drawing_03.dump
new file mode 100644
index 0000000..cb67b9e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_03.dump
@@ -0,0 +1,6 @@
+|2+2#e000e06#ffffff0|++2#0000000&| |X|t|a|b|p|a|n|e|l|1| @2>a+0&&| @18||+1&&|a+0&&| @6
+| +1&&@15|b+0&&| @18||+1&&|b+0&&| @6
+| +1&&@15|c+0&&| @18||+1&&|c+0&&| @6
+| +1&&@15|~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @6
+| +1#0000000&@15|<+3&&|n|e|l|1| |[|+|]| |1|,|1| @3|A|l@1| |<+1&&|+|]| |1|,|1| 
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_04.dump b/src/testdir/dumps/Test_tabpanel_drawing_04.dump
new file mode 100644
index 0000000..61b759e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_04.dump
@@ -0,0 +1,6 @@
+|2+8#e000e06#e0e0e08|++8#0000001&| |X|t|a|b|p|a|n|e|l|1| @2>d+0#0000000#ffffff0| @27
+|++2&&| |X|t|a|b|p|a|n|e|l|2| @3|e+0&&| @27
+| +1&&@15|f+0&&| @27
+| +1&&@15|~+0#4040ff13&| @27
+| +1#0000000&@15|~+0#4040ff13&| @27
+| +0#0000000&@42|1|,
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_05.dump b/src/testdir/dumps/Test_tabpanel_drawing_05.dump
new file mode 100644
index 0000000..e9ea7cb
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_05.dump
@@ -0,0 +1,6 @@
+| +8#0000001#e0e0e08@15>d+0#0000000#ffffff0| @27
+|1+8#0000001#e0e0e08|:|X+2#4040ff13#ffffff0|t|a|b|p|a|n|e|l|1| +8#0000001#e0e0e08@3|e+0#0000000#ffffff0| @27
+| +2&&@15|f+0&&| @27
+|2+2&&|:|X+0#4040ff13&|t|a|b|p|a|n|e|l|2| +2#0000000&@3|~+0#4040ff13&| @27
+| +1#0000000&@15|~+0#4040ff13&| @27
+| +0#0000000&@42|1|,
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_06.dump b/src/testdir/dumps/Test_tabpanel_drawing_06.dump
new file mode 100644
index 0000000..b5935d3
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_06.dump
@@ -0,0 +1,6 @@
+>d+0&#ffffff0| @27| +8#0000001#e0e0e08@15
+|e+0#0000000#ffffff0| @27|1+8#0000001#e0e0e08|:|X+2#4040ff13#ffffff0|t|a|b|p|a|n|e|l|1| +8#0000001#e0e0e08@3
+|f+0#0000000#ffffff0| @27| +2&&@15
+|~+0#4040ff13&| @27|2+2#0000000&|:|X+0#4040ff13&|t|a|b|p|a|n|e|l|2| +2#0000000&@3
+|~+0#4040ff13&| @27| +1#0000000&@15
+| +0&&@26|1|,|1| @10|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_07.dump b/src/testdir/dumps/Test_tabpanel_drawing_07.dump
new file mode 100644
index 0000000..440988b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_07.dump
@@ -0,0 +1,6 @@
+> +0&#ffffff0@28| +8#0000001#e0e0e08@15
+|~+0#4040ff13#ffffff0| @27|1+8#0000001#e0e0e08|:|X+2#4040ff13#ffffff0|t|a|b|p|a|n|e|l|1| +8#0000001#e0e0e08@3
+|~+0#4040ff13#ffffff0| @27| +8#0000001#e0e0e08@15
+|~+0#4040ff13#ffffff0| @27|2+8#0000001#e0e0e08|:|X+0#4040ff13#ffffff0|t|a|b|p|a|n|e|l|2| +8#0000001#e0e0e08@3
+|~+0#4040ff13#ffffff0| @27| +2#0000000&@15
+| +0&&@26|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_08.dump b/src/testdir/dumps/Test_tabpanel_drawing_08.dump
new file mode 100644
index 0000000..57bbf92
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_08.dump
@@ -0,0 +1,6 @@
+>a+0&#ffffff0| @18||+1&&|a+0&&| @6| +2&&@15
+|b+0&&| @18||+1&&|b+0&&| @6|1+2&&|:|X+0#4040ff13&|t|a|b|p|a|n|e|l|1| +2#0000000&@3
+|c+0&&| @18||+1&&|c+0&&| @6| +1&&@15
+|~+0#4040ff13&| @18||+1#0000000&|~+0#4040ff13&| @6| +1#0000000&@15
+|<+3&&|n|e|l|1| |[|+|]| |1|,|1| @3|A|l@1| |<+1&&|+|]| |1|,|1| @16
+| +0&&@26|1|,|1| @10|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_fill_tailing_0.dump b/src/testdir/dumps/Test_tabpanel_drawing_fill_tailing_0.dump
new file mode 100644
index 0000000..40e3bd7
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_fill_tailing_0.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08@19> +0#0000000#ffffff0@24
+|T+8#0000001#e0e0e08|O|P| @16|~+0#4040ff13#ffffff0| @23
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12|~+0#4040ff13#ffffff0| @23
+|B+8#0000001#e0e0e08|O|T@1|O|M| @13|~+0#4040ff13#ffffff0| @23
+| +2#0000000&@19|~+0#4040ff13&| @23
+|T+2#0000000&|O|P| @16|~+0#4040ff13&| @23
+|b+2#0000000&@2|.|t|x|t| @12|~+0#4040ff13&| @23
+|B+2#0000000&|O|T@1|O|M| @13|~+0#4040ff13&| @23
+| +1#0000000&@19|~+0#4040ff13&| @23
+| +0#0000000&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_pum_0.dump b/src/testdir/dumps/Test_tabpanel_drawing_pum_0.dump
new file mode 100644
index 0000000..190e5d9
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_pum_0.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12|!+0#0000000#ffffff0> @23
+|b+2&&@2|.|t|x|t| @12|!+0#0000001#e0e0e08| @14| +0#0000000#0000001| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|#+0#0000001#ffd7ff255| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|&+0#0000001#ffd7ff255| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|*+0#0000001#ffd7ff255| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|++0#0000001#ffd7ff255@1| @13| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|-+0#0000001#ffd7ff255@1| @13| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|<+0#0000001#ffd7ff255| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|=+0#0000001#ffd7ff255| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@7
+|-+2#0000000&@1| |m+0#00e0003&|a|t|c|h| |1| |o|f| |5|9|6| +0#0000000&@27
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_pum_1.dump b/src/testdir/dumps/Test_tabpanel_drawing_pum_1.dump
new file mode 100644
index 0000000..9888bc0
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_pum_1.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12|!+0#0000000#ffffff0| @23
+|++2&&| |b@2|.|t|x|t| @10| +0&&@1|a|b@1|r|e|v|i|a|t|e> @12
+| +1&&@19|~+0#4040ff13&| +0#0000001#e0e0e08|a|b@1|r|e|v|i|a|t|e| @4| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|~+0#4040ff13&| +0#0000001#ffd7ff255|a|b|c|l|e|a|r| @7| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|~+0#4040ff13&| +0#0000001#ffd7ff255|a|b|o|v|e|l|e|f|t| @5| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|~+0#4040ff13&| +0#0000001#ffd7ff255|a|b|s|t|r|a|c|t| @6| +0#4040ff13#ffffff0@7
+| +1#0000000&@19|~+0#4040ff13&| @23
+| +1#0000000&@19|~+0#4040ff13&| @23
+| +1#0000000&@19|~+0#4040ff13&| @23
+|-+2#0000000&@1| |m+0#00e0003&|a|t|c|h| |1| |o|f| |4| +0#0000000&@29
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_scrolling_0.dump b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_0.dump
new file mode 100644
index 0000000..fa1947e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_0.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12| +0#af5f00255#ffffff0@1|9| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|1| 
+|2+2#e000e06&|++2#0000000&| |b@2|.|t|x|t| @9| +0#af5f00255&|1|0| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|2| 
+| +1#0000000&@19| +0#af5f00255&|1@1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|3| 
+| +1#0000000&@19| +0#af5f00255&|1|2| >@+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|4| 
+| +1#0000000&@19| +0#af5f00255&|1|3| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|5| 
+| +1#0000000&@19| +0#af5f00255&|1|4| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|6| 
+| +1#0000000&@19| +0#af5f00255&|1|5| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|7| 
+| +1#0000000&@19| +0#af5f00255&|1|6| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t||+1&&| +0#af5f00255&@1|8| 
+| +1#0000000&@19|<+3&&|.|t|x|t| |[|+|]| |1|2|,|1| @3|8|%| |<+1&&| |1|,
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_scrolling_1.dump b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_1.dump
new file mode 100644
index 0000000..6370449
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_1.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12| +0#af5f00255#ffffff0@1|1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+|2+2#e000e06&|++2#0000000&| |b@2|.|t|x|t| @9| +0#af5f00255&@1|2| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&@1|3| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19|b@2|.|t|x|t| |[|+|]| @1|1|,|1| @5|T|o|p
+| @19| +0#af5f00255&|1|5| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&|1|6| >@+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&|1|7| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&|1|8| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19|b+3&&@2|.|t|x|t| |[|+|]| @1|1|6|,|1| @4|1|4|%
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_scrolling_2.dump b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_2.dump
new file mode 100644
index 0000000..50b55ea
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_2.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12| +0#af5f00255#ffffff0|1|9| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+|2+2#e000e06&|++2#0000000&| |b@2|.|t|x|t| @9| +0#af5f00255&|2|0| >@+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&|2|1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&|2@1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19|b+3&&@2|.|t|x|t| |[|+|]| @1|2|0|,|1| @4|1|8|%
+| +1&&@19| +0#af5f00255&@1|1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&@1|2| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19| +0#af5f00255&@1|3| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| @1
+| +1&&@19|b@2|.|t|x|t| |[|+|]| @1|1|,|1| @5|T|o|p
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_scrolling_3.dump b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_3.dump
new file mode 100644
index 0000000..fdde1ab
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_scrolling_3.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @12| +0#af5f00255#ffffff0@1|1| ||+1#0000000&| +0#af5f00255&|2|5| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+|2+2#e000e06&|++2#0000000&| |b@2|.|t|x|t| @9| +0#af5f00255&@1|2| ||+1#0000000&| +0#af5f00255&|2|6| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|3| ||+1#0000000&| +0#af5f00255&|2|7| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|4| ||+1#0000000&| +0#af5f00255&|2|8| >@+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|5| ||+1#0000000&| +0#af5f00255&|2|9| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|6| ||+1#0000000&| +0#af5f00255&|3|0| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|7| ||+1#0000000&| +0#af5f00255&|3|1| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19| +0#af5f00255&@1|8| ||+1#0000000&| +0#af5f00255&|3|2| |t+0#0000000&|e|x|t| |t|e|x|t| |t|e|x|t| |t
+| +1&&@19|<| |1|,| |<+3&&|.|t|x|t| |[|+|]| |2|8|,|1| @2|2|6|%
+| +0&&@44
diff --git a/src/testdir/dumps/Test_tabpanel_drawing_with_popupwin_0.dump b/src/testdir/dumps/Test_tabpanel_drawing_with_popupwin_0.dump
new file mode 100644
index 0000000..080fa27
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_drawing_with_popupwin_0.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| @10|╔+0#0000000#ffffff0|═|╗|.@18|╔|═|╗
+|[+2&&|S|c|r|a|t|c|h|]| @10|║+0&&|@|║|.@18|║|@|║
+| +1&&@19|╚+0&&|═|╝|.@5|a|t|c|u|r|s|o|r|.@4|╚|═|╝
+| +1&&@19|.+0&&@8>.@15
+| +1&&@19|.+0&&@24
+| +1&&@19|╔+0&&|═|╗|.@18|╔|═|╗
+| +1&&@19|║+0&&|@|║|.@18|║|@|║
+| +1&&@19|╚+0&&|═|╝|.@18|╚|═|╝
+| +1&&@19|.+0&&@24
+| @44
diff --git a/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_0.dump b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_0.dump
new file mode 100644
index 0000000..9214434
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_0.dump
@@ -0,0 +1,10 @@
+|$+8#0000001#e0e0e08| |[|a@2|]| |$|│+1#0000000#ffffff0|$| @13|[|c@2|]| @13|$
+|$+8#0000001#e0e0e08| |[|b@2|]| |$|│+1#0000000#ffffff0> +0&&@34
+|$+2&&| |[|c@2|]| |$|│+1&&|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|$+3&&| @13|[|c@2|]| @13|$
+|"+0&&|c@2|"| |[|N|e|w|]| @33
diff --git a/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_1.dump b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_1.dump
new file mode 100644
index 0000000..dae0d0b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_statusline_tabline_1.dump
@@ -0,0 +1,10 @@
+|$+1&#ffffff0| @13|[|c@2|]| @13|$|│|$+8#0000001#e0e0e08| |[|a@2|]| |$
+> +0#0000000#ffffff0@34|│+1&&|$+8#0000001#e0e0e08| |[|b@2|]| |$
+|~+0#4040ff13#ffffff0| @33|│+1#0000000&|$+2&&| |[|c@2|]| |$
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|$+3&&| @13|[|c@2|]| @13|$|│+1&&| @8
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|+|=|a|l|i|g|n|:|r|i|g|h|t| @15
diff --git a/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_0.dump b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_0.dump
new file mode 100644
index 0000000..dd55218
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_0.dump
@@ -0,0 +1,10 @@
+|t+8#0000001#e0e0e08|o|p| @7|a@2| @1|b@2| | +2#0000000#ffffff0|c@2| | +1&&@18|X+8#0000001#e0e0e08
+|$| |[|a@2|]| @1|$> +0#0000000#ffffff0@34
+|b+8#0000001#e0e0e08|o|t@1|o|m| @3|~+0#4040ff13#ffffff0| @33
+|t+8#0000001#e0e0e08|o|p| @6|~+0#4040ff13#ffffff0| @33
+|$+8#0000001#e0e0e08| |[|b@2|]| @1|$|~+0#4040ff13#ffffff0| @33
+|b+8#0000001#e0e0e08|o|t@1|o|m| @3|~+0#4040ff13#ffffff0| @33
+|t+2#0000000&|o|p| @6|~+0#4040ff13&| @33
+|$+2#0000000&| |[|c@2|]| @1|$|~+0#4040ff13&| @33
+|b+2#0000000&|o|t@1|o|m| @3|~+0#4040ff13&| @33
+|"+0#0000000&|c@2|"| |[|N|e|w|]| @25|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_1.dump b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_1.dump
new file mode 100644
index 0000000..84bf683
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_eval_tabpanel_with_linebreaks_1.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|a@2| @1|b@2| | +2#0000000#ffffff0|c@2| | +1&&@19|t+8#0000001#e0e0e08|o|p| @6
+> +0#0000000#ffffff0@34|$+8#0000001#e0e0e08| |[|a@2|]| @1|$
+|~+0#4040ff13#ffffff0| @33|b+8#0000001#e0e0e08|o|t@1|o|m| @3
+|~+0#4040ff13#ffffff0| @33|t+8#0000001#e0e0e08|o|p| @6
+|~+0#4040ff13#ffffff0| @33|$+8#0000001#e0e0e08| |[|b@2|]| @1|$
+|~+0#4040ff13#ffffff0| @33|b+8#0000001#e0e0e08|o|t@1|o|m| @3
+|~+0#4040ff13#ffffff0| @33|t+2#0000000&|o|p| @6
+|~+0#4040ff13&| @33|$+2#0000000&| |[|c@2|]| @1|$
+|~+0#4040ff13&| @33|b+2#0000000&|o|t@1|o|m| @3
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|+|=|a|l|i|g|n|:|r|i|g|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_many_tabpages_0.dump b/src/testdir/dumps/Test_tabpanel_many_tabpages_0.dump
new file mode 100644
index 0000000..e974381
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_many_tabpages_0.dump
@@ -0,0 +1,10 @@
+|1+2&#ffffff0|:|t|a|b| @4> +0&&@34
+|2+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|3+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|4+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|5+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|6+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|7+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|8+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|9+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+| +0#0000000&@36|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_many_tabpages_1.dump b/src/testdir/dumps/Test_tabpanel_many_tabpages_1.dump
new file mode 100644
index 0000000..3ac3dde
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_many_tabpages_1.dump
@@ -0,0 +1,10 @@
+|1+8#0000001#e0e0e08|:|t|a|b| @4> +0#0000000#ffffff0@34
+|2+2&&|:|t|a|b| @4|~+0#4040ff13&| @33
+|3+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|4+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|5+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|6+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|7+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|8+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|9+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+| +0#0000000&@36|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_many_tabpages_2.dump b/src/testdir/dumps/Test_tabpanel_many_tabpages_2.dump
new file mode 100644
index 0000000..7b980e6
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_many_tabpages_2.dump
@@ -0,0 +1,10 @@
+|1+8#0000001#e0e0e08|:|t|a|b| @4> +0#0000000#ffffff0@34
+|2+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|3+2#0000000&|:|t|a|b| @4|~+0#4040ff13&| @33
+|4+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|5+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|6+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|7+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|8+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|9+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+| +0#0000000&@36|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_many_tabpages_3.dump b/src/testdir/dumps/Test_tabpanel_many_tabpages_3.dump
new file mode 100644
index 0000000..fa3c09c
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_many_tabpages_3.dump
@@ -0,0 +1,10 @@
+|1+8#0000001#e0e0e08|:|t|a|b| @4> +0#0000000#ffffff0@34
+|2+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|3+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|4+2#0000000&|:|t|a|b| @4|~+0#4040ff13&| @33
+|5+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|6+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|7+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|8+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+|9+8#0000001#e0e0e08|:|t|a|b| @4|~+0#4040ff13#ffffff0| @33
+| +0#0000000&@36|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_many_tabpages_4.dump b/src/testdir/dumps/Test_tabpanel_many_tabpages_4.dump
new file mode 100644
index 0000000..07ff180
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_many_tabpages_4.dump
@@ -0,0 +1,10 @@
+|1+8#0000001#e0e0e08|0|:|t|a|b| @3> +0#0000000#ffffff0@34
+|1+2&&@1|:|t|a|b| @3|~+0#4040ff13&| @33
+|1+8#0000001#e0e0e08|2|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|3|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|4|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|5|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|6|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|7|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|1+8#0000001#e0e0e08|8|:|t|a|b| @3|~+0#4040ff13#ffffff0| @33
+|:+0#0000000&|t|a|b|n|e|x|t| |-|3| @25|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_0.dump b/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_0.dump
new file mode 100644
index 0000000..9214434
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_0.dump
@@ -0,0 +1,10 @@
+|$+8#0000001#e0e0e08| |[|a@2|]| |$|│+1#0000000#ffffff0|$| @13|[|c@2|]| @13|$
+|$+8#0000001#e0e0e08| |[|b@2|]| |$|│+1#0000000#ffffff0> +0&&@34
+|$+2&&| |[|c@2|]| |$|│+1&&|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|$+3&&| @13|[|c@2|]| @13|$
+|"+0&&|c@2|"| |[|N|e|w|]| @33
diff --git a/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_1.dump b/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_1.dump
new file mode 100644
index 0000000..dae0d0b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_noeval_tabpanel_statusline_tabline_1.dump
@@ -0,0 +1,10 @@
+|$+1&#ffffff0| @13|[|c@2|]| @13|$|│|$+8#0000001#e0e0e08| |[|a@2|]| |$
+> +0#0000000#ffffff0@34|│+1&&|$+8#0000001#e0e0e08| |[|b@2|]| |$
+|~+0#4040ff13#ffffff0| @33|│+1#0000000&|$+2&&| |[|c@2|]| |$
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|$+3&&| @13|[|c@2|]| @13|$|│+1&&| @8
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|+|=|a|l|i|g|n|:|r|i|g|h|t| @15
diff --git a/src/testdir/dumps/Test_tabpanel_tabline_and_tabpanel_0.dump b/src/testdir/dumps/Test_tabpanel_tabline_and_tabpanel_0.dump
new file mode 100644
index 0000000..fdca7f1
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_tabline_and_tabpanel_0.dump
@@ -0,0 +1,10 @@
+|a+8#0000001#e0e0e08@2|.|t|x|t| @1|│+1#0000000#ffffff0| +8#0000001#e0e0e08|a@2|.|t|x|t| @1|b@2|.|t|x|t| | +2#0000000#ffffff0|c@2|.|t|x|t| | +1&&@6|X+8#0000001#e0e0e08
+|b@2|.|t|x|t| @1|│+1#0000000#ffffff0> +0&&@34
+|c+2&&@2|.|t|x|t| @1|│+1&&|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+|"+0#0000000&|c@2|.|t|x|t|"| |[|N|e|w|]| @21|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_0.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_0.dump
new file mode 100644
index 0000000..a50355f
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_0.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]|│+1#0000000#ffffff0| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@11|X+8#0000001#e0e0e08
+|[+2#0000000#ffffff0|N|o| |N|a|m|e|]|│+1&&> +0&&@34
+| +1&&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +0#0000000&@36|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_1.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_1.dump
new file mode 100644
index 0000000..e347c7e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_1.dump
@@ -0,0 +1,10 @@
+|│+1&#ffffff0| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@20|X+8#0000001#e0e0e08
+|│+1#0000000#ffffff0> +0&&@43
+|│+1&&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|│+1#0000000&|~+0#4040ff13&| @42
+|:+0#0000000&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|c|o|l|u|m|n|s|:|1|,|v|0|,|0|-|1| @8|A|l@1
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_2.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_2.dump
new file mode 100644
index 0000000..d1c5b92
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_2.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]|│+1#0000000#ffffff0| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@11|X+8#0000001#e0e0e08
+|[+2#0000000#ffffff0|N|o| |N|a|m|e|]|│+1&&> +0&&@34
+| +1&&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+| +1#0000000&@8|│|~+0#4040ff13&| @33
+|:+0#0000000&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|c|o|l|u|m|n|s|:|1|0|,|v|e|r|t| @4|0|,|0|-|1| @2
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_3.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_3.dump
new file mode 100644
index 0000000..fc84c0b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_left_3.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|│+1#0000000#ffffff0| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@19|X+8#0000001#e0e0e08
+|[+2#0000000#ffffff0|│+1&&> +0&&@42
+| +1&&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+| +1#0000000&|│|~+0#4040ff13&| @41
+|:+0#0000000&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|c|o|l|u|m|n|s|:|2|,|v|e|0|,|0|-|1| @8|A|l
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_0.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_0.dump
new file mode 100644
index 0000000..02aa109
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_0.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@12|│|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]
+> +0#0000000#ffffff0@34|│+1&&|[+2&&|N|o| |N|a|m|e|]
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+| +0&&@26|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_1.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_1.dump
new file mode 100644
index 0000000..8e97a7e
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_1.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@21|│
+> +0&&@43|│+1&&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|~+0#4040ff13&| @42|│+1#0000000&
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|a|l|i|g|n|:|r|i|g|h|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_2.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_2.dump
new file mode 100644
index 0000000..6e33239
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_2.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@12|│|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]
+> +0#0000000#ffffff0@34|│+1&&|[+2&&|N|o| |N|a|m|e|]
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|~+0#4040ff13&| @33|│+1#0000000&| @8
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|a|l|i|g|n|:|r|i|g|h|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_3.dump b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_3.dump
new file mode 100644
index 0000000..1f9255b
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_vert_is_multibytes_right_3.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|[|N|o| |N|a|m|e|]| | +1&&@20|│|[+8#0000001#e0e0e08
+> +0#0000000#ffffff0@42|│+1&&|[+2&&
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|~+0#4040ff13&| @41|│+1#0000000&| 
+|:+0&&|s|e|t| |t|a|b|p|a|n|e|l|o|p|t|=|a|l|i|g|n|:|r|i|g|h|0|,|0|-|1| @8|A|l@1| 
diff --git a/src/testdir/dumps/Test_tabpanel_visual_0.dump b/src/testdir/dumps/Test_tabpanel_visual_0.dump
new file mode 100644
index 0000000..af7ba65
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_visual_0.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0&#a8a8a8255@2|1| |b@2|1| >c+0#0000000#ffffff0@2|1| |d@2|1| @15
+|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| |b@2|2| |c@2|2| |d@2|2| @15
+| +1&&@9|a+0&&@2|3| |b@2|3| |c@2|3| |d@2|3| @15
+| +1&&@9|a+0&&@2|4| |b@2|4| |c@2|4| |d@2|4| @15
+| +1&&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+|-+2#0000000&@1| |V|I|S|U|A|L| |-@1| +0&&@4|1@1| @17|1|,|1@1| @3
diff --git a/src/testdir/dumps/Test_tabpanel_visual_1.dump b/src/testdir/dumps/Test_tabpanel_visual_1.dump
new file mode 100644
index 0000000..0cdc5f2
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_visual_1.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0#0000000#ffffff0@2|1| |b@2|1| |c@2|1| |d@2|1| @15
+|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| |b+0#0000001#a8a8a8255@2|2| |c@2>2+0#0000000#ffffff0| |d@2|2| @15
+| +1&&@9|a+0&&@2|3| |b@2|3| |c@2|3| |d@2|3| @15
+| +1&&@9|a+0&&@2|4| |b@2|4| |c@2|4| |d@2|4| @15
+| +1&&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+|-+2#0000000&@1| |V|I|S|U|A|L| |-@1| +0&&@4|9| @18|2|,|1|4| @3
diff --git a/src/testdir/dumps/Test_tabpanel_visual_2.dump b/src/testdir/dumps/Test_tabpanel_visual_2.dump
new file mode 100644
index 0000000..9a307c1
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_visual_2.dump
@@ -0,0 +1,10 @@
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0#0000000#ffffff0@2|1| |b@2|1| |c@2|1| |d@2|1| @15
+|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| >b@2|2| |c@2|2| |d@2|2| @15
+| +1&&@9|a+0&&@2|3| |b@2|3| |c@2|3| |d@2|3| @15
+| +1&&@9|a+0&&@2|4| |b@2|4| |c@2|4| |d@2|4| @15
+| +1&&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+| +1#0000000&@9|~+0#4040ff13&| @33
+|b+0#0000000&@2|2| |c@2|2| @27|2|,|6| @4
diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim
index 3d798e9..1f15453 100644
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/gen_opt_test.vim
@@ -94,6 +94,7 @@
       \ 'scrolljump': [[-100, -1, 0, 1, 2, 15], [-101, 999]],
       \ 'scrolloff': [[0, 1, 8, 999], [-1]],
       \ 'shiftwidth': [[0, 1, 8, 999], [-1]],
+      \ 'showtabpanel': [[0, 1, 2], []],
       \ 'sidescroll': [[0, 1, 8, 999], [-1]],
       \ 'sidescrolloff': [[0, 1, 8, 999], [-1]],
       \ 'tabstop': [[1, 4, 8, 12, 9999], [-1, 0, 10000]],
@@ -301,6 +302,11 @@
       \		['xxx']],
       \ 'tabclose': [['', 'left', 'uselast', 'left,uselast'], ['xxx']],
       \ 'tabline': [['', 'xxx'], ['%$', '%{', '%{%', '%{%}', '%(', '%)']],
+      \ 'tabpanel': [['', 'aaa', 'bbb'], []],
+      \ 'tabpanelopt': [['', 'align:left', 'align:right', 'vert', 'columns:0',
+      \		'columns:20', 'columns:999'],
+      \		['xxx', 'align:', 'align:middle', 'colomns:', 'cols:10',
+      \		'cols:-1']],
       \ 'tagcase': [['followic', 'followscs', 'ignore', 'match', 'smart'],
       \		['', 'xxx', 'smart,match']],
       \ 'termencoding': [has('gui_gtk') ? [] : ['', 'utf-8'], ['xxx']],
@@ -373,8 +379,17 @@
       \ 'verbosefile': [[], ['call delete("Xfile")']],
       \}
 
-const invalid_options = test_values->keys()
+let invalid_options = test_values->keys()
       \->filter({-> v:val !~# '^other' && !exists($"&{v:val}")})
+for s:skip_option in [
+  \ [!has('tabpanel'), 'tabpanel'],
+  \ [!has('tabpanel'), 'tabpanelopt'],
+  \ [!has('tabpanel'), 'showtabpanel'],
+  \ ]
+  if s:skip_option[0]
+    call remove(invalid_options, s:skip_option[1])
+  endif
+endfor
 if !empty(invalid_options)
   throw $"Invalid option name in test_values: '{invalid_options->join("', '")}'"
 endif
@@ -406,6 +421,8 @@
   let [pre_processing, post_processing] = get(test_prepost, fullname, [[], []])
   let script += pre_processing
 
+  " Setting an option can only fail when it's implemented.
+  call add(script, $"if exists('+{fullname}')")
   if line =~ 'P_BOOL'
     for opt in [fullname, shortname]
       for cmd in ['set', 'setlocal', 'setglobal']
@@ -439,8 +456,6 @@
     endfor
 
     " Failure tests
-    " Setting an option can only fail when it's implemented.
-    call add(script, $"if exists('+{fullname}')")
     for opt in [fullname, shortname]
       for cmd in ['set', 'setlocal', 'setglobal']
 	for val in invalid_values
@@ -464,7 +479,6 @@
 	endfor
       endfor
     endfor
-    call add(script, "endif")
   endif
 
   " Cannot change 'termencoding' in GTK
@@ -476,6 +490,8 @@
     call add(script, 'endif')
   endif
 
+  call add(script, "endif")
+
   let script += post_processing
   call add(script, 'endfunc')
 endwhile
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 68933a3..9a3fe20 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -4345,4 +4345,9 @@
   set wildoptions&
 endfunc
 
+func Test_redrawtabpanel_error()
+  CheckNotFeature tabpanel
+  call assert_fails(':redrawtabpanel', 'E1547:')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_tabpanel.vim b/src/testdir/test_tabpanel.vim
new file mode 100644
index 0000000..630226f
--- /dev/null
+++ b/src/testdir/test_tabpanel.vim
@@ -0,0 +1,480 @@
+" Tests for tabpanel
+
+source check.vim
+source screendump.vim
+CheckFeature tabpanel
+
+function! s:reset()
+  set tabpanel&
+  set tabpanelopt&
+  set showtabpanel&
+endfunc
+
+function! Test_tabpanel_mouse()
+  let save_showtabline = &showtabline
+  let save_mouse = &mouse
+  set showtabline=0 mouse=a
+
+  tabnew
+  tabnew
+
+  call test_setmouse(1, 1)
+  call feedkeys("\<LeftMouse>", 'xt')
+  call assert_equal(3, tabpagenr())
+
+  set showtabpanel=2 tabpanelopt=columns:10
+
+  call test_setmouse(1, 1)
+  call feedkeys("\<LeftMouse>", 'xt')
+  call assert_equal(1, tabpagenr())
+  call test_setmouse(2, 1)
+  call feedkeys("\<LeftMouse>", 'xt')
+  call assert_equal(2, tabpagenr())
+  call test_setmouse(3, 1)
+  call feedkeys("\<LeftMouse>", 'xt')
+  call assert_equal(3, tabpagenr())
+
+  call feedkeys("\<LeftMouse>", 'xt')
+  call test_setmouse(2, 3)
+  let pos = getmousepos()
+  call assert_equal(2, pos['winrow'])
+  call assert_equal(0, pos['wincol'])
+  call assert_equal(2, pos['screenrow'])
+  call assert_equal(3, pos['screencol'])
+
+  call test_setmouse(1, 11)
+  call feedkeys("\<LeftMouse>", 'xt')
+  let pos = getmousepos()
+  call assert_equal(1, pos['winrow'])
+  call assert_equal(1, pos['wincol'])
+  call assert_equal(1, pos['screenrow'])
+  call assert_equal(11, pos['screencol'])
+
+  new
+  wincmd x
+
+  call test_setmouse(10, 11)
+  call feedkeys("\<LeftMouse>", 'xt')
+  let pos = getmousepos()
+  call assert_equal(10, pos['winrow'])
+  call assert_equal(1, pos['wincol'])
+  call assert_equal(10, pos['screenrow'])
+  call assert_equal(11, pos['screencol'])
+
+  tabonly!
+  call s:reset()
+  let &mouse = save_mouse
+  let &showtabline = save_showtabline
+endfunc
+
+function! Test_tabpanel_drawing()
+  CheckScreendump
+
+  let lines =<< trim END
+    function! MyTabPanel()
+      let n = g:actual_curtabpage
+      let hi = n == tabpagenr() ? 'TabLineSel' : 'TabLine'
+      let label = printf("\n%%#%sTabNumber#%d:%%#%s#", hi, n, hi)
+      let label ..= '%1*%f%*'
+      return label
+    endfunction
+    hi User1 ctermfg=12
+
+    set showtabline=0
+    set showtabpanel=0
+    set tabpanelopt=columns:16
+    set tabpanel=
+    silent edit Xtabpanel1
+
+    nnoremap \01 <Cmd>set showtabpanel=2<CR>
+    nnoremap \02 <C-w>v
+    nnoremap \03 <Cmd>call setline(1, ['a', 'b', 'c'])<CR>
+    nnoremap \04 <Cmd>silent tabnew Xtabpanel2<CR><Cmd>call setline(1, ['d', 'e', 'f'])<CR>
+    nnoremap \05 <Cmd>set tabpanel=%!MyTabPanel()<CR>
+    nnoremap \06 <Cmd>set tabpanelopt+=align:right<CR>
+    nnoremap \07 <Cmd>tab terminal NONE<CR><C-w>N
+    nnoremap \08 <Cmd>tabclose!<CR><Cmd>tabclose!<CR>
+  END
+  call writefile(lines, 'XTest_tabpanel', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel', {'rows': 6, 'cols': 45})
+
+  call VerifyScreenDump(buf, 'Test_tabpanel_drawing_00', {})
+
+  for i in range(1, 8)
+    let n = printf('%02d', i)
+    call term_sendkeys(buf, '\' .. n)
+    call VerifyScreenDump(buf, 'Test_tabpanel_drawing_' .. n, {})
+  endfor
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_drawing_with_popupwin()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:20
+    set showtabline=0
+    tabnew
+    setlocal buftype=nofile
+    call setbufline(bufnr(), 1, repeat([repeat('.', &columns - 20)], &lines))
+    highlight TestingForTabPanelPopupwin guibg=#7777ff guifg=#000000
+    for line in [1, &lines]
+      for col in [1, &columns - 20 - 2]
+        call popup_create([
+          \   '@',
+          \ ], {
+          \   'line': line,
+          \   'col': col,
+          \   'border': [],
+          \   'highlight': 'TestingForTabPanelPopupwin',
+          \ })
+      endfor
+    endfor
+    call cursor(4, 10)
+    call popup_atcursor('atcursor', {
+      \   'highlight': 'TestingForTabPanelPopupwin',
+      \ })
+  END
+  call writefile(lines, 'XTest_tabpanel_with_popupwin', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_with_popupwin', {'rows': 10, 'cols': 45})
+
+  call VerifyScreenDump(buf, 'Test_tabpanel_drawing_with_popupwin_0', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_drawing_fill_tailing()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:20
+    set showtabline=0
+    e aaa.txt
+    tabnew
+    e bbb.txt
+    let &tabpanel = "abc"
+    redraw!
+    " Check whether "abc" is cleared
+    let &tabpanel = "\nTOP\n%f\nBOTTOM"
+  END
+  call writefile(lines, 'XTest_tabpanel_fill_tailing', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_fill_tailing', {'rows': 10, 'cols': 45})
+
+  call VerifyScreenDump(buf, 'Test_tabpanel_drawing_fill_tailing_0', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_drawing_pum()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:20
+    set showtabline=0
+    e aaa.txt
+    tabnew
+    e bbb.txt
+  END
+  call writefile(lines, 'XTest_tabpanel_pum', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_pum', {'rows': 10, 'cols': 45})
+
+  call term_sendkeys(buf, "i\<C-x>\<C-v>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_drawing_pum_0', {})
+
+  call term_sendkeys(buf, "\<cr>  ab\<C-x>\<C-v>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_drawing_pum_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_scrolling()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:20
+    set showtabline=0
+    set nowrap
+    set number
+    e aaa.txt
+    tabnew
+    e bbb.txt
+    vsplit
+    call setbufline(bufnr(), 1, repeat(['text text text text'], 100))
+    wincmd =
+  END
+  call writefile(lines, 'XTest_tabpanel_scrolling', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_scrolling', {'rows': 10, 'cols': 45})
+  let n = 0
+  for c in ['H', 'J', 'K', 'L']
+    call term_sendkeys(buf, ":wincmd " .. c ..  "\<cr>")
+    call term_sendkeys(buf, "\<C-d>\<C-d>")
+    call term_sendkeys(buf, "r@")
+    call VerifyScreenDump(buf, 'Test_tabpanel_drawing_scrolling_' .. n, {})
+    let n += 1
+  endfor
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_many_tabpages()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10
+    set showtabline=0
+    set tabpanel=%{g:actual_curtabpage}:tab
+    execute join(repeat(['tabnew'], 20), ' | ')
+  END
+  call writefile(lines, 'XTest_tabpanel_many_tabpages', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_many_tabpages', {'rows': 10, 'cols': 45})
+  for n in range(0, 3)
+    call term_sendkeys(buf, "gt")
+    call VerifyScreenDump(buf, 'Test_tabpanel_many_tabpages_' .. n, {})
+  endfor
+  call term_sendkeys(buf, ":tabnext +10\<cr>")
+  call term_sendkeys(buf, ":tabnext -3\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_many_tabpages_4', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_visual()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10
+    set showtabline=0
+    tabnew
+    call setbufline(bufnr(), 1, ['aaa1 bbb1 ccc1 ddd1', 'aaa2 bbb2 ccc2 ddd2', 'aaa3 bbb3 ccc3 ddd3', 'aaa4 bbb4 ccc4 ddd4'])
+  END
+  call writefile(lines, 'XTest_tabpanel_visual', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_visual', {'rows': 10, 'cols': 45})
+  call term_sendkeys(buf, "v2w")
+  call VerifyScreenDump(buf, 'Test_tabpanel_visual_0', {})
+  call term_sendkeys(buf, "\<esc>0jw")
+  call term_sendkeys(buf, "v2wge")
+  call VerifyScreenDump(buf, 'Test_tabpanel_visual_1', {})
+  call term_sendkeys(buf, "y:echo @\"\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_visual_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_commandline()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10
+    set showtabline=0
+    tabnew
+  END
+  call writefile(lines, 'XTest_tabpanel_commandline', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_commandline', {'rows': 10, 'cols': 45})
+  call term_sendkeys(buf, ":ab\<tab>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_commandline_0', {})
+
+  call term_sendkeys(buf, "\<esc>")
+  call term_sendkeys(buf, ":set wildoptions=pum\<cr>")
+  call term_sendkeys(buf, ":ab\<tab>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_commandline_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_tabline_and_tabpanel()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10,vert
+    set fillchars=tpl_vert:│
+    set showtabline=2
+    e aaa.txt
+    tabnew
+    e bbb.txt
+    tabnew
+    e ccc.txt
+  END
+  call writefile(lines, 'XTest_tabpanel_tabline_and_tabpanel', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_tabline_and_tabpanel', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_tabline_and_tabpanel_0', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_dont_overflow_into_tabpanel()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10
+    set showtabline=2
+    tabnew
+    call setline(1, repeat('x', 100))
+    set wrap
+  END
+  call writefile(lines, 'XTest_tabpanel_dont_overflow_into_tabpanel', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_dont_overflow_into_tabpanel', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_dont_overflow_into_tabpanel_0', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_dont_vert_is_multibytes_left()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=columns:10,vert
+    set fillchars=tpl_vert:│
+    set showtabline=2
+    tabnew
+  END
+  call writefile(lines, 'XTest_tabpanel_vert_is_multibyte_lefts', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_vert_is_multibyte_lefts', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_left_0', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=columns:1,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_left_1', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=columns:10,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_left_2', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=columns:2,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_left_3', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_dont_vert_is_multibytes_right()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set tabpanelopt=align:right,columns:10,vert
+    set fillchars=tpl_vert:│
+    set showtabline=2
+    tabnew
+  END
+  call writefile(lines, 'XTest_tabpanel_vert_is_multibytes_right', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_vert_is_multibytes_right', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_right_0', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=align:right,columns:1,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_right_1', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=align:right,columns:10,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_right_2', {})
+
+  call term_sendkeys(buf, ":set tabpanelopt=align:right,columns:2,vert\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_vert_is_multibytes_right_3', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_eval_tabpanel_statusline_tabline()
+  CheckScreendump
+
+  let lines =<< trim END
+    function! Expr()
+      return "$%=[%f]%=$"
+    endfunction
+    set laststatus=2
+    set showtabline=2
+    set showtabpanel=2
+    set statusline=%!Expr()
+    set tabline=%!Expr()
+    set tabpanel=%!Expr()
+    set tabpanelopt=columns:10,vert
+    set fillchars=tpl_vert:│
+    e aaa
+    tabnew
+    e bbb
+    tabnew
+    e ccc
+  END
+  call writefile(lines, 'XTest_tabpanel_eval_tabpanel_statusline_tabline', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_eval_tabpanel_statusline_tabline', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_eval_tabpanel_statusline_tabline_0', {})
+  call term_sendkeys(buf, ":set tabpanelopt+=align:right\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_eval_tabpanel_statusline_tabline_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_noeval_tabpanel_statusline_tabline()
+  CheckScreendump
+
+  let lines =<< trim END
+    set laststatus=2
+    set showtabline=2
+    set showtabpanel=2
+    set statusline=$%=[%f]%=$
+    set tabline=$%=[%f]%=$
+    set tabpanel=$%=[%f]%=$
+    set tabpanelopt=columns:10,vert
+    set fillchars=tpl_vert:│
+    e aaa
+    tabnew
+    e bbb
+    tabnew
+    e ccc
+  END
+  call writefile(lines, 'XTest_tabpanel_noeval_tabpanel_statusline_tabline', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_noeval_tabpanel_statusline_tabline', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_noeval_tabpanel_statusline_tabline_0', {})
+  call term_sendkeys(buf, ":set tabpanelopt+=align:right\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_noeval_tabpanel_statusline_tabline_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+function! Test_tabpanel_eval_tabpanel_with_linebreaks()
+  CheckScreendump
+
+  let lines =<< trim END
+    function! Expr()
+      return "top\n$%=[%f]%=$\nbottom"
+    endfunction
+    set showtabpanel=2
+    set tabpanel=%!Expr()
+    set tabpanelopt=columns:10
+    e aaa
+    tabnew
+    e bbb
+    tabnew
+    e ccc
+  END
+  call writefile(lines, 'XTest_tabpanel_eval_tabpanel_with_linebreaks', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_eval_tabpanel_with_linebreaks', {'rows': 10, 'cols': 45})
+  call VerifyScreenDump(buf, 'Test_tabpanel_eval_tabpanel_with_linebreaks_0', {})
+  call term_sendkeys(buf, ":set tabpanelopt+=align:right\<cr>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_eval_tabpanel_with_linebreaks_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab