diff --git a/resources/icons/add.svg b/resources/icons/add.svg
new file mode 100644
index 000000000..8a9b253de
--- /dev/null
+++ b/resources/icons/add.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<path fill="#FFFFFF" d="M87.29,22.62H34.71c-1.39,0-3.14,0.69-4.16,1.63L9.81,43.46c-1.05,0.98-1.82,2.73-1.82,4.16v54.31
+	c0,1.9,1.55,3.45,3.45,3.45h55.17c1.4,0,3.15-0.7,4.16-1.67l12.41-11.83c0.69-0.66,0.72-1.75,0.06-2.44s-1.75-0.71-2.44-0.06
+	L70.05,99.63v-53.2c0.26-0.19,0.51-0.39,0.72-0.61L87.3,28.29v33.12c0,0.35-0.02,0.64-0.04,0.85c-0.51,0.55-0.62,1.39-0.22,2.06
+	c0.49,0.82,1.55,1.08,2.37,0.59l0.25-0.15c0.67-0.4,1.09-1.1,1.09-3.35V26.07C90.74,24.17,89.2,22.62,87.29,22.62z M11.44,47.62
+	L11.44,47.62h55.17v54.31H11.44V47.62z M68.26,43.46c-0.33,0.35-1.18,0.71-1.65,0.71H14.12L32.9,26.78
+	c0.37-0.35,1.31-0.71,1.82-0.71h49.94L68.26,43.46z"/>
+<path id="_x2B__1_" fill="#ED6B21" d="M110.57,82.1c0,0.95-0.78,1.72-1.72,1.72h-4.31c-0.95,0-1.72,0.78-1.72,1.72v4.31
+	c0,0.95-0.78,1.72-1.72,1.72h-4.31c-0.95,0-1.72-0.78-1.72-1.72v-4.31c0-0.95-0.78-1.72-1.72-1.72h-4.31
+	c-0.95,0-1.72-0.78-1.72-1.72v-4.31c0-0.95,0.78-1.72,1.72-1.72h4.31c0.95,0,1.72-0.78,1.72-1.72v-4.31c0-0.95,0.78-1.72,1.72-1.72
+	h4.31c0.95,0,1.72,0.78,1.72,1.72v4.31c0,0.95,0.78,1.72,1.72,1.72h4.31c0.95,0,1.72,0.78,1.72,1.72V82.1z M120.05,79.95
+	c0-11.65-9.47-21.12-21.12-21.12S77.81,68.3,77.81,79.95s9.47,21.12,21.12,21.12S120.05,91.59,120.05,79.95z M116.6,79.95
+	c0,9.74-7.93,17.67-17.67,17.67s-17.67-7.93-17.67-17.67s7.93-17.67,17.67-17.67S116.6,70.2,116.6,79.95z"/>
+</svg>
diff --git a/resources/icons/arrange.svg b/resources/icons/arrange.svg
new file mode 100644
index 000000000..4f30e979e
--- /dev/null
+++ b/resources/icons/arrange.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="ARRANGE">
+	<path fill="#FFFFFF" d="M113.85,14.27v99.36h-99.7V14.27H113.85 M115.85,8.27H12.15c-2.2,0-4,1.8-4,4v103.36c0,2.2,1.8,4,4,4h103.7
+		c2.2,0,4-1.8,4-4V12.27C119.85,10.07,118.05,8.27,115.85,8.27L115.85,8.27z"/>
+	<g>
+		<path fill="#ED6B21" d="M48.04,99.24c0,2.2-1.8,4-4,4H28.11c-2.2,0-4-1.8-4-4v-47c0-2.2,1.8-4,4-4h15.94c2.2,0,4,1.8,4,4
+			L48.04,99.24L48.04,99.24z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M28.11,40.38c-2.2,0-4-1.8-4-4v-7.72c0-2.2,1.8-4,4-4h15.94c2.2,0,4,1.8,4,4v7.72c0,2.2-1.8,4-4,4H28.11z"
+			/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M68,103.24c-2.2,0-4-1.8-4-4V83.67c0-2.2,1.8-4,4-4h31.89c2.2,0,4,1.8,4,4v15.57c0,2.2-1.8,4-4,4H68z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M103.89,59.95c0,2.2-1.8,4-4,4H68c-2.2,0-4-1.8-4-4V28.66c0-2.2,1.8-4,4-4h31.89c2.2,0,4,1.8,4,4V59.95z"
+			/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/cut.svg b/resources/icons/cut.svg
new file mode 100644
index 000000000..c5c952742
--- /dev/null
+++ b/resources/icons/cut.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="cut">
+	<g>
+		<path fill="#ED6B21" d="M118.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S118.95,65.5,118.12,65.5z M98.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S98.95,65.5,98.12,65.5z M78.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S78.95,65.5,78.12,65.5z M58.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S58.95,65.5,58.12,65.5z M38.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S38.95,65.5,38.12,65.5z M18.12,65.5h-10c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5
+			S18.95,65.5,18.12,65.5z"/>
+	</g>
+	<g>
+		<g>
+			<path fill="#FFFFFF" d="M108.79,51.6H19.21c-1.93,0-3.5-1.57-3.5-3.5V10.12c0-1.93,1.57-3.5,3.5-3.5h89.57
+				c1.93,0,3.5,1.57,3.5,3.5V48.1C112.29,50.03,110.71,51.6,108.79,51.6z M19.21,9.62c-0.27,0-0.5,0.23-0.5,0.5V48.1
+				c0,0.27,0.23,0.5,0.5,0.5h89.57c0.27,0,0.5-0.23,0.5-0.5V10.12c0-0.27-0.23-0.5-0.5-0.5H19.21z"/>
+		</g>
+		<g>
+			<path fill="#FFFFFF" d="M108.79,121.38H19.21c-1.93,0-3.5-1.57-3.5-3.5V79.4c0-1.93,1.57-3.5,3.5-3.5h89.57
+				c1.93,0,3.5,1.57,3.5,3.5v38.49C112.29,119.81,110.71,121.38,108.79,121.38z M19.21,78.9c-0.27,0-0.5,0.23-0.5,0.5v38.49
+				c0,0.27,0.23,0.5,0.5,0.5h89.57c0.27,0,0.5-0.23,0.5-0.5V79.4c0-0.27-0.23-0.5-0.5-0.5H19.21z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/delete_all.svg b/resources/icons/delete_all.svg
new file mode 100644
index 000000000..80e2e503c
--- /dev/null
+++ b/resources/icons/delete_all.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="DELETE_ALL_1_">
+	<path fill="#FFFFFF" d="M103.52,43.87l-13.31,69.97H37.79L24.48,43.87H103.52 M108.77,37.87H19.23c-1.1,0-1.83,0.88-1.63,1.96
+		l14.84,78.04c0.21,1.08,1.27,1.96,2.37,1.96h58.36c1.1,0,2.17-0.88,2.37-1.96l14.84-78.04C110.6,38.75,109.87,37.87,108.77,37.87
+		L108.77,37.87z"/>
+	<g>
+		<path fill="#ED6B21" d="M89.38,22.97c-1.1,0-2-0.9-2-2v-10.9c0-1.1-0.9-2-2-2H42.62c-1.1,0-2,0.9-2,2v10.9c0,1.1-0.9,2-2,2H19.23
+			c-1.1,0-2,0.9-2,2v3.45c0,1.1,0.9,2,2,2h89.54c1.1,0,2-0.9,2-2v-3.45c0-1.1-0.9-2-2-2H89.38z M79.59,20.97c0,1.1-0.9,2-2,2H50.41
+			c-1.1,0-2-0.9-2-2v-3.45c0-1.1,0.9-2,2-2h27.18c1.1,0,2,0.9,2,2V20.97z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M93.17,73.5H34.83c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h58.34c0.83,0,1.5,0.67,1.5,1.5
+			S94,73.5,93.17,73.5z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.14,89.45H37.96c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h52.18c0.83,0,1.5,0.67,1.5,1.5
+			S90.97,89.45,90.14,89.45z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M87.1,105.4H40.9c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h46.2c0.83,0,1.5,0.67,1.5,1.5
+			S87.93,105.4,87.1,105.4z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M96.2,57.56H31.8c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h64.4c0.83,0,1.5,0.67,1.5,1.5
+			S97.03,57.56,96.2,57.56z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/editor.svg b/resources/icons/editor.svg
new file mode 100644
index 000000000..5866ce055
--- /dev/null
+++ b/resources/icons/editor.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="editor">
+	<g>
+		<path fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
+			M118.68,8.83L92.1,37.03c-0.75,0.8-2.27,1.46-3.37,1.46H9.44"/>
+	</g>
+	<g>
+		
+			<line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="90.72" y1="118.69" x2="90.72" y2="38.81"/>
+	</g>
+	<g>
+		<path fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
+			M119.88,91.51v-81.4c0-1.1-0.9-2-2-2H42.92c-1.1,0-2.66,0.61-3.47,1.36L9.59,37.13c-0.81,0.75-1.47,2.26-1.47,3.36v77.39
+			c0,1.1,0.9,2,2,2h78.61c1.1,0,2.65-0.63,3.44-1.39l27.67-26.82"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/gizmos.png b/resources/icons/gizmos.png
new file mode 100644
index 000000000..448e826b8
Binary files /dev/null and b/resources/icons/gizmos.png differ
diff --git a/resources/icons/instance_add.svg b/resources/icons/instance_add.svg
new file mode 100644
index 000000000..5ef492cfa
--- /dev/null
+++ b/resources/icons/instance_add.svg
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="ADD_INSTANCE">
+	<g>
+		<path fill="#ED6B21" d="M88.01,57.95c0-1.1-0.9-2-2-2H74c-1.1,0-2-0.9-2-2V41.94c0-1.1-0.9-2-2-2H58c-1.1,0-2,0.9-2,2v12.01
+			c0,1.1-0.9,2-2,2H41.99c-1.1,0-2,0.9-2,2v12.01c0,1.1,0.9,2,2,2H54c1.1,0,2,0.9,2,2v12.01c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2
+			V73.95c0-1.1,0.9-2,2-2h12.01c1.1,0,2-0.9,2-2V57.95z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M67.06,119.73c-2.1,0-3.87-1.64-3.99-3.77c-0.13-2.21,1.56-4.1,3.76-4.23c1.85-0.11,3.71-0.32,5.53-0.64
+			c2.17-0.38,4.25,1.07,4.63,3.25s-1.07,4.25-3.25,4.63c-2.12,0.37-4.29,0.63-6.45,0.75C67.22,119.73,67.14,119.73,67.06,119.73z
+			 M55.05,119.05c-0.23,0-0.46-0.02-0.69-0.06c-2.13-0.37-4.26-0.87-6.32-1.49c-2.12-0.63-3.32-2.86-2.69-4.98s2.86-3.32,4.98-2.69
+			c1.77,0.53,3.59,0.96,5.41,1.27c2.18,0.38,3.63,2.45,3.25,4.63C58.65,117.68,56.96,119.05,55.05,119.05z M84.58,115.58
+			c-1.55,0-3.02-0.9-3.67-2.41c-0.88-2.03,0.06-4.38,2.08-5.26c1.69-0.73,3.36-1.57,4.96-2.5c1.91-1.11,4.36-0.46,5.47,1.46
+			c1.11,1.91,0.46,4.36-1.46,5.47c-1.87,1.08-3.82,2.07-5.8,2.92C85.65,115.47,85.11,115.58,84.58,115.58z M38.12,112.91
+			c-0.68,0-1.37-0.17-2-0.54c-1.87-1.08-3.69-2.28-5.43-3.57c-1.77-1.32-2.14-3.82-0.82-5.6c1.32-1.77,3.82-2.14,5.6-0.82
+			c1.49,1.11,3.05,2.13,4.65,3.06c1.91,1.1,2.57,3.55,1.47,5.46C40.84,112.2,39.5,112.91,38.12,112.91z M99.61,105.67
+			c-1.06,0-2.12-0.42-2.91-1.25c-1.52-1.61-1.45-4.14,0.16-5.66c1.35-1.27,2.63-2.64,3.82-4.05c1.42-1.69,3.94-1.91,5.64-0.49
+			c1.69,1.42,1.91,3.94,0.49,5.64c-1.39,1.65-2.88,3.24-4.45,4.72C101.58,105.3,100.59,105.67,99.61,105.67z M24.32,101.35
+			c-1.14,0-2.27-0.48-3.06-1.42c-1.39-1.65-2.7-3.4-3.89-5.2c-1.22-1.84-0.71-4.32,1.13-5.54c1.84-1.22,4.32-0.71,5.54,1.13
+			c1.02,1.54,2.14,3.04,3.33,4.46c1.42,1.69,1.21,4.21-0.48,5.64C26.14,101.04,25.23,101.35,24.32,101.35z M110.36,91.23
+			c-0.6,0-1.22-0.14-1.79-0.43c-1.97-0.99-2.77-3.4-1.78-5.37c0.83-1.65,1.57-3.37,2.2-5.11c0.75-2.08,3.05-3.15,5.13-2.39
+			c2.08,0.75,3.15,3.05,2.39,5.13c-0.74,2.03-1.61,4.04-2.58,5.97C113.24,90.42,111.83,91.23,110.36,91.23z M15.28,85.78
+			c-1.63,0-3.16-1-3.76-2.63c-0.74-2.03-1.37-4.12-1.87-6.22c-0.51-2.15,0.82-4.31,2.97-4.82s4.31,0.82,4.82,2.97
+			c0.43,1.8,0.97,3.59,1.6,5.32c0.76,2.08-0.31,4.37-2.38,5.13C16.2,85.7,15.73,85.78,15.28,85.78z M115.53,73.97
+			c-0.15,0-0.31-0.01-0.46-0.03c-2.19-0.25-3.77-2.24-3.52-4.43c0.21-1.83,0.32-3.7,0.32-5.56v-0.21c0-2.21,1.79-4,4-4s4,1.79,4,4
+			v0.15c0,2.22-0.12,4.4-0.37,6.53C119.26,72.47,117.53,73.97,115.53,73.97z M12.13,68.05c-2.21,0-4-1.79-4-4h4l-4-0.05
+			c0-2.18,0.12-4.33,0.36-6.42c0.25-2.19,2.24-3.76,4.43-3.52c2.2,0.25,3.77,2.23,3.52,4.43c-0.21,1.8-0.31,3.64-0.31,5.46v0.1
+			C16.13,66.26,14.34,68.05,12.13,68.05z M114.43,55.8c-1.81,0-3.45-1.23-3.89-3.07c-0.43-1.8-0.98-3.59-1.61-5.32
+			c-0.76-2.07,0.3-4.37,2.37-5.14c2.07-0.76,4.37,0.3,5.14,2.37c0.74,2.02,1.38,4.11,1.88,6.22c0.52,2.15-0.81,4.31-2.95,4.82
+			C115.06,55.76,114.74,55.8,114.43,55.8z M15.21,50.31c-0.45,0-0.91-0.08-1.36-0.24c-2.08-0.75-3.15-3.04-2.4-5.12
+			c0.73-2.03,1.6-4.04,2.56-5.97C15,37,17.4,36.2,19.38,37.19c1.98,0.99,2.77,3.39,1.79,5.37c-0.83,1.65-1.57,3.37-2.19,5.11
+			C18.38,49.3,16.85,50.31,15.21,50.31z M107.24,39.3c-1.29,0-2.57-0.63-3.34-1.79c-1.02-1.54-2.15-3.04-3.34-4.45
+			c-1.43-1.69-1.22-4.21,0.47-5.64s4.21-1.22,5.64,0.47c1.39,1.65,2.71,3.39,3.9,5.19c1.22,1.84,0.72,4.32-1.12,5.54
+			C108.77,39.08,108,39.3,107.24,39.3z M24.19,34.7c-0.91,0-1.82-0.31-2.56-0.93c-1.69-1.42-1.92-3.94-0.5-5.63
+			c1.38-1.66,2.88-3.25,4.44-4.73c1.6-1.52,4.13-1.45,5.65,0.15s1.45,4.13-0.15,5.65c-1.34,1.27-2.62,2.64-3.81,4.06
+			C26.47,34.21,25.33,34.7,24.19,34.7z M94.83,26.24c-0.83,0-1.66-0.26-2.38-0.79c-1.49-1.1-3.05-2.13-4.66-3.05
+			c-1.92-1.1-2.58-3.54-1.48-5.46c1.1-1.91,3.54-2.58,5.46-1.48c1.87,1.07,3.7,2.27,5.44,3.56c1.78,1.31,2.15,3.82,0.83,5.6
+			C97.27,25.68,96.06,26.24,94.83,26.24z M37.95,23.09c-1.38,0-2.72-0.71-3.46-1.99c-1.11-1.91-0.46-4.36,1.44-5.47
+			c1.86-1.08,3.81-2.07,5.79-2.93c2.03-0.88,4.38,0.05,5.26,2.07c0.88,2.03-0.05,4.38-2.07,5.26c-1.69,0.74-3.36,1.58-4.96,2.51
+			C39.33,22.92,38.64,23.09,37.95,23.09z M78.72,18.21c-0.38,0-0.76-0.05-1.13-0.17c-1.77-0.52-3.59-0.95-5.42-1.26
+			c-2.18-0.37-3.64-2.44-3.26-4.62s2.45-3.64,4.62-3.26c2.13,0.37,4.26,0.86,6.33,1.47c2.12,0.63,3.33,2.85,2.7,4.97
+			C82.04,17.08,80.45,18.21,78.72,18.21z M54.84,16.89c-1.9,0-3.59-1.36-3.93-3.3c-0.39-2.17,1.06-4.25,3.24-4.64
+			c2.12-0.38,4.29-0.63,6.45-0.76c2.19-0.14,4.1,1.55,4.23,3.75c0.13,2.21-1.55,4.1-3.75,4.23c-1.85,0.11-3.71,0.33-5.52,0.66
+			C55.31,16.87,55.07,16.89,54.84,16.89z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/instance_remove.svg b/resources/icons/instance_remove.svg
new file mode 100644
index 000000000..466752ea8
--- /dev/null
+++ b/resources/icons/instance_remove.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="REMOVE_INSTANCE">
+	<g>
+		<path fill="#ED6B21" d="M88.01,57.95c0-1.1-0.9-2-2-2H41.99c-1.1,0-2,0.9-2,2v12.01c0,1.1,0.9,2,2,2h44.02c1.1,0,2-0.9,2-2V57.95z
+			"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M67.06,119.73c-2.1,0-3.87-1.64-3.99-3.77c-0.13-2.21,1.56-4.1,3.76-4.23c1.85-0.11,3.71-0.32,5.53-0.64
+			c2.17-0.38,4.25,1.07,4.63,3.25s-1.07,4.25-3.25,4.63c-2.12,0.37-4.29,0.63-6.45,0.75C67.22,119.73,67.14,119.73,67.06,119.73z
+			 M55.05,119.05c-0.23,0-0.46-0.02-0.69-0.06c-2.13-0.37-4.26-0.87-6.32-1.49c-2.12-0.63-3.32-2.86-2.69-4.98s2.86-3.32,4.98-2.69
+			c1.77,0.53,3.59,0.96,5.41,1.27c2.18,0.38,3.63,2.45,3.25,4.63C58.65,117.68,56.96,119.05,55.05,119.05z M84.58,115.58
+			c-1.55,0-3.02-0.9-3.67-2.41c-0.88-2.03,0.06-4.38,2.08-5.26c1.69-0.73,3.36-1.57,4.96-2.5c1.91-1.11,4.36-0.46,5.47,1.46
+			c1.11,1.91,0.46,4.36-1.46,5.47c-1.87,1.08-3.82,2.07-5.8,2.92C85.65,115.47,85.11,115.58,84.58,115.58z M38.12,112.91
+			c-0.68,0-1.37-0.17-2-0.54c-1.87-1.08-3.69-2.28-5.43-3.57c-1.77-1.32-2.14-3.82-0.82-5.6c1.32-1.77,3.82-2.14,5.6-0.82
+			c1.49,1.11,3.05,2.13,4.65,3.06c1.91,1.1,2.57,3.55,1.47,5.46C40.84,112.2,39.5,112.91,38.12,112.91z M99.61,105.67
+			c-1.06,0-2.12-0.42-2.91-1.25c-1.52-1.61-1.45-4.14,0.16-5.66c1.35-1.27,2.63-2.64,3.82-4.05c1.42-1.69,3.94-1.91,5.64-0.49
+			c1.69,1.42,1.91,3.94,0.49,5.64c-1.39,1.65-2.88,3.24-4.45,4.72C101.58,105.3,100.59,105.67,99.61,105.67z M24.32,101.35
+			c-1.14,0-2.27-0.48-3.06-1.42c-1.39-1.65-2.7-3.4-3.89-5.2c-1.22-1.84-0.71-4.32,1.13-5.54c1.84-1.22,4.32-0.71,5.54,1.13
+			c1.02,1.54,2.14,3.04,3.33,4.46c1.42,1.69,1.21,4.21-0.48,5.64C26.14,101.04,25.23,101.35,24.32,101.35z M110.36,91.23
+			c-0.6,0-1.22-0.14-1.79-0.43c-1.97-0.99-2.77-3.4-1.78-5.37c0.83-1.65,1.57-3.37,2.2-5.11c0.75-2.08,3.05-3.15,5.13-2.39
+			c2.08,0.75,3.15,3.05,2.39,5.13c-0.74,2.03-1.61,4.04-2.58,5.97C113.24,90.42,111.83,91.23,110.36,91.23z M15.28,85.78
+			c-1.63,0-3.16-1-3.76-2.63c-0.74-2.03-1.37-4.12-1.87-6.22c-0.51-2.15,0.82-4.31,2.97-4.82s4.31,0.82,4.82,2.97
+			c0.43,1.8,0.97,3.59,1.6,5.32c0.76,2.08-0.31,4.37-2.38,5.13C16.2,85.7,15.73,85.78,15.28,85.78z M115.53,73.97
+			c-0.15,0-0.31-0.01-0.46-0.03c-2.19-0.25-3.77-2.24-3.52-4.43c0.21-1.83,0.32-3.7,0.32-5.56v-0.21c0-2.21,1.79-4,4-4s4,1.79,4,4
+			v0.15c0,2.22-0.12,4.4-0.37,6.53C119.26,72.47,117.53,73.97,115.53,73.97z M12.13,68.05c-2.21,0-4-1.79-4-4h4l-4-0.05
+			c0-2.18,0.12-4.33,0.36-6.42c0.25-2.19,2.24-3.76,4.43-3.52c2.2,0.25,3.77,2.23,3.52,4.43c-0.21,1.8-0.31,3.64-0.31,5.46v0.1
+			C16.13,66.26,14.34,68.05,12.13,68.05z M114.43,55.8c-1.81,0-3.45-1.23-3.89-3.07c-0.43-1.8-0.98-3.59-1.61-5.32
+			c-0.76-2.07,0.3-4.37,2.37-5.14c2.07-0.76,4.37,0.3,5.14,2.37c0.74,2.02,1.38,4.11,1.88,6.22c0.52,2.15-0.81,4.31-2.95,4.82
+			C115.06,55.76,114.74,55.8,114.43,55.8z M15.21,50.31c-0.45,0-0.91-0.08-1.36-0.24c-2.08-0.75-3.15-3.04-2.4-5.12
+			c0.73-2.03,1.6-4.04,2.56-5.97C15,37,17.4,36.2,19.38,37.19c1.98,0.99,2.77,3.39,1.79,5.37c-0.83,1.65-1.57,3.37-2.19,5.11
+			C18.38,49.3,16.85,50.31,15.21,50.31z M107.24,39.3c-1.29,0-2.57-0.63-3.34-1.79c-1.02-1.54-2.15-3.04-3.34-4.45
+			c-1.43-1.69-1.22-4.21,0.47-5.64s4.21-1.22,5.64,0.47c1.39,1.65,2.71,3.39,3.9,5.19c1.22,1.84,0.72,4.32-1.12,5.54
+			C108.77,39.08,108,39.3,107.24,39.3z M24.19,34.7c-0.91,0-1.82-0.31-2.56-0.93c-1.69-1.42-1.92-3.94-0.5-5.63
+			c1.38-1.66,2.88-3.25,4.44-4.73c1.6-1.52,4.13-1.45,5.65,0.15s1.45,4.13-0.15,5.65c-1.34,1.27-2.62,2.64-3.81,4.06
+			C26.47,34.21,25.33,34.7,24.19,34.7z M94.83,26.24c-0.83,0-1.66-0.26-2.38-0.79c-1.49-1.1-3.05-2.13-4.66-3.05
+			c-1.92-1.1-2.58-3.54-1.48-5.46c1.1-1.91,3.54-2.58,5.46-1.48c1.87,1.07,3.7,2.27,5.44,3.56c1.78,1.31,2.15,3.82,0.83,5.6
+			C97.27,25.68,96.06,26.24,94.83,26.24z M37.95,23.09c-1.38,0-2.72-0.71-3.46-1.99c-1.11-1.91-0.46-4.36,1.44-5.47
+			c1.86-1.08,3.81-2.07,5.79-2.93c2.03-0.88,4.38,0.05,5.26,2.07c0.88,2.03-0.05,4.38-2.07,5.26c-1.69,0.74-3.36,1.58-4.96,2.51
+			C39.33,22.92,38.64,23.09,37.95,23.09z M78.72,18.21c-0.38,0-0.76-0.05-1.13-0.17c-1.77-0.52-3.59-0.95-5.42-1.26
+			c-2.18-0.37-3.64-2.44-3.26-4.62s2.45-3.64,4.62-3.26c2.13,0.37,4.26,0.86,6.33,1.47c2.12,0.63,3.33,2.85,2.7,4.97
+			C82.04,17.08,80.45,18.21,78.72,18.21z M54.84,16.89c-1.9,0-3.59-1.36-3.93-3.3c-0.39-2.17,1.06-4.25,3.24-4.64
+			c2.12-0.38,4.29-0.63,6.45-0.76c2.19-0.14,4.1,1.55,4.23,3.75c0.13,2.21-1.55,4.1-3.75,4.23c-1.85,0.11-3.71,0.33-5.52,0.66
+			C55.31,16.87,55.07,16.89,54.84,16.89z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/layers.svg b/resources/icons/layers.svg
new file mode 100644
index 000000000..7718a8cbd
--- /dev/null
+++ b/resources/icons/layers.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g>
+	<g>
+		<rect x="7.98" y="105" fill="#FFFFFF" width="112.04" height="15"/>
+	</g>
+	<g>
+		<rect x="7.98" y="85.67" fill="#FFFFFF" width="112.04" height="13"/>
+	</g>
+	<g>
+		<rect x="7.98" y="66.33" fill="#FFFFFF" width="112.04" height="11"/>
+	</g>
+	<g>
+		<rect x="7.98" y="47" fill="#ED6B21" width="112.04" height="9"/>
+	</g>
+	<g>
+		<rect x="7.98" y="27.67" fill="#ED6B21" width="112.04" height="7"/>
+	</g>
+	<g>
+		<rect x="7.98" y="8.33" fill="#ED6B21" width="112.04" height="5"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/move.svg b/resources/icons/move.svg
new file mode 100644
index 000000000..019ea8ca7
--- /dev/null
+++ b/resources/icons/move.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="move">
+	<g>
+		<path fill="#FFFFFF" d="M83.47,86.79H44.53c-1.83,0-3.32-1.49-3.32-3.32V44.53c0-1.83,1.49-3.32,3.32-3.32h38.94
+			c1.83,0,3.32,1.49,3.32,3.32v38.94C86.79,85.3,85.3,86.79,83.47,86.79z M44.53,44.21c-0.17,0-0.32,0.15-0.32,0.32v38.94
+			c0,0.17,0.15,0.32,0.32,0.32h38.94c0.17,0,0.32-0.15,0.32-0.32V44.53c0-0.17-0.15-0.32-0.32-0.32H44.53z"/>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#ED6B21" d="M76.81,28.66H51.19c-1.06,0-1.9-0.46-2.31-1.25c-0.4-0.8-0.28-1.74,0.35-2.6L61.72,7.7
+					c0.57-0.78,1.4-1.22,2.28-1.22c0,0,0,0,0,0c0.89,0,1.72,0.45,2.28,1.22l12.48,17.1c0.63,0.86,0.75,1.81,0.35,2.6
+					C78.71,28.2,77.87,28.66,76.81,28.66z M52.33,25.66l23.34,0L64,9.67L52.33,25.66z"/>
+			</g>
+		</g>
+		<g>
+			<g>
+				<path fill="#ED6B21" d="M26.44,79.35c-0.54,0-1.1-0.2-1.63-0.58L7.7,66.28c-0.78-0.57-1.22-1.4-1.22-2.28s0.45-1.72,1.22-2.29
+					l17.1-12.48c0.86-0.62,1.81-0.75,2.6-0.35s1.25,1.25,1.25,2.31v25.61c0,1.06-0.46,1.9-1.25,2.31
+					C27.1,79.27,26.77,79.35,26.44,79.35z M9.67,64l15.99,11.67l0-23.34L9.67,64z"/>
+			</g>
+		</g>
+		<g>
+			<g>
+				<path fill="#ED6B21" d="M64,121.52c-0.89,0-1.72-0.45-2.28-1.22l-12.48-17.1c-0.63-0.86-0.75-1.81-0.35-2.6s1.25-1.25,2.31-1.25
+					h25.61c1.06,0,1.9,0.46,2.31,1.25c0.4,0.8,0.28,1.74-0.35,2.6l-12.48,17.1C65.72,121.07,64.89,121.52,64,121.52L64,121.52z
+					 M52.33,102.34L64,118.33l11.67-15.99L52.33,102.34z M76.87,102.34L76.87,102.34L76.87,102.34z"/>
+			</g>
+		</g>
+		<g>
+			<g>
+				<path fill="#ED6B21" d="M101.56,79.35c-0.34,0-0.67-0.08-0.97-0.23c-0.8-0.41-1.25-1.25-1.25-2.31V51.19
+					c0-1.06,0.46-1.9,1.25-2.31c0.8-0.41,1.75-0.28,2.6,0.35l17.1,12.48c0.78,0.57,1.22,1.4,1.22,2.29s-0.45,1.72-1.22,2.28
+					l-17.1,12.48C102.67,79.15,102.1,79.35,101.56,79.35z M102.34,52.33l0,23.34L118.33,64L102.34,52.33z"/>
+			</g>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/place.svg b/resources/icons/place.svg
new file mode 100644
index 000000000..6acc2451e
--- /dev/null
+++ b/resources/icons/place.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="place">
+	<g>
+		<path fill="#FFFFFF" d="M101.56,93.65c-0.28,0-0.57-0.04-0.85-0.1L37.65,77.82c-0.9-0.22-1.67-0.79-2.15-1.59s-0.62-1.74-0.4-2.65
+			l15.72-63.06c0.47-1.87,2.37-3.02,4.24-2.55l63.06,15.72c1.87,0.47,3.02,2.37,2.55,4.24l-15.72,63.06h0
+			c-0.23,0.91-0.79,1.67-1.59,2.15C102.8,93.47,102.18,93.65,101.56,93.65z M54.21,10.87c-0.22,0-0.43,0.15-0.49,0.38L38.01,74.31
+			c-0.04,0.17,0.02,0.31,0.06,0.38c0.04,0.07,0.13,0.19,0.31,0.23l63.06,15.72c0.17,0.04,0.31-0.02,0.38-0.06
+			c0.07-0.04,0.19-0.13,0.23-0.3c0,0,0,0,0,0l15.72-63.06c0.07-0.26-0.1-0.54-0.37-0.61L54.33,10.88
+			C54.29,10.87,54.25,10.87,54.21,10.87z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M118.02,120.54H9.98c-1.93,0-3.5-1.57-3.5-3.5v-4c0-1.93,1.57-3.5,3.5-3.5h108.04c1.93,0,3.5,1.57,3.5,3.5
+			v4C121.52,118.97,119.95,120.54,118.02,120.54z M9.98,112.54c-0.27,0-0.5,0.23-0.5,0.5v4c0,0.27,0.23,0.5,0.5,0.5h108.04
+			c0.27,0,0.5-0.23,0.5-0.5v-4c0-0.27-0.23-0.5-0.5-0.5H9.98z"/>
+	</g>
+	<g>
+		<g>
+			<path fill="#ED6B21" d="M15.99,103.92c-0.08,0-0.15,0-0.23-0.01c-0.92-0.09-1.69-0.72-2.11-1.73L7.42,87.2
+				c-0.41-0.98-0.33-1.97,0.22-2.71c0.55-0.74,1.48-1.11,2.53-1L25.29,85c1.06,0.11,1.89,0.65,2.28,1.48
+				c0.39,0.84,0.27,1.82-0.32,2.71l-9.08,13.43C17.61,103.46,16.82,103.92,15.99,103.92z M10.4,86.52l5.72,13.77l8.36-12.35
+				L10.4,86.52z M24.81,87.43L24.81,87.43z"/>
+		</g>
+		<g>
+			<path fill="#ED6B21" d="M17.54,85.9c-0.83,0-1.5-0.67-1.5-1.5c0-8.88,8.1-24.47,17.34-25.5c0.82-0.09,1.56,0.5,1.66,1.33
+				c0.09,0.82-0.5,1.56-1.33,1.66c-6.94,0.77-14.67,14.08-14.67,22.52C19.04,85.22,18.37,85.9,17.54,85.9z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/preview.svg b/resources/icons/preview.svg
new file mode 100644
index 000000000..658bba2c6
--- /dev/null
+++ b/resources/icons/preview.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="preview">
+	<g>
+		<path fill="#FFFFFF" d="M90.72,121.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12l-29.16,28.57C91.49,121.23,91.11,121.38,90.72,121.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,111.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.14
+			c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12l-29.16,28.57C91.49,111.23,91.11,111.38,90.72,111.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,101.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.14
+			c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12l-29.16,28.57C91.49,101.23,91.11,101.38,90.72,101.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,91.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12L91.77,90.95C91.49,91.23,91.11,91.38,90.72,91.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,81.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,80.95C91.49,81.23,91.11,81.38,90.72,81.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,71.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,70.95C91.49,71.23,91.11,71.38,90.72,71.38z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M90.72,61.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,60.95C91.49,61.23,91.11,61.38,90.72,61.38z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M90.72,51.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
+			c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12L91.77,50.95C91.49,51.23,91.11,51.38,90.72,51.38z"/>
+	</g>
+	<g>
+		<g>
+			<path fill="#FFFFFF" d="M88.72,41.38H9.18c-1.68,0-2.22-0.95-2.37-1.36s-0.37-1.48,0.89-2.59L38.43,10.5
+				c1.1-0.96,3.03-1.69,4.49-1.69h75.85c1.65,0,2.22,0.94,2.38,1.34s0.42,1.47-0.75,2.63c0,0,0,0,0,0L93.2,39.55
+				C92.14,40.59,90.21,41.38,88.72,41.38z M11.17,38.38h77.55c0.71,0,1.87-0.47,2.37-0.97l26.01-25.6H42.92
+				c-0.74,0-1.96,0.46-2.51,0.95L11.17,38.38z M118.89,11.82C118.89,11.82,118.89,11.82,118.89,11.82
+				C118.89,11.82,118.89,11.82,118.89,11.82z M119.34,11.71L119.34,11.71L119.34,11.71z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/remove.svg b/resources/icons/remove.svg
new file mode 100644
index 000000000..acd21256c
--- /dev/null
+++ b/resources/icons/remove.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<path fill="#FFFFFF" d="M38.11,44.25H25.75c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72H38.1c0.95,0,1.72-0.77,1.72-1.72
+	C39.83,45.02,39.06,44.25,38.11,44.25z M45.89,45.97c0,0.95,0.77,1.72,1.72,1.72h12.35c0.95,0,1.72-0.77,1.72-1.72
+	s-0.77-1.72-1.72-1.72H47.61C46.66,44.25,45.89,45.02,45.89,45.97z M68.11,43.6c-0.33,0.28-0.52,0.65-0.59,1.04
+	c-0.59,0.27-1,0.87-1,1.56v5.6c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-5.34c0.12-0.06,0.24-0.13,0.35-0.22
+	c0.13-0.11,0.25-0.23,0.36-0.34l8.27-8.77c0.65-0.69,0.62-1.78-0.07-2.43s-1.78-0.62-2.43,0.07l-8.27,8.78
+	C68.16,43.56,68.14,43.58,68.11,43.6z M68.25,76.84c-0.95,0-1.72,0.77-1.72,1.72V89.1c0,0.95,0.77,1.72,1.72,1.72
+	c0.95,0,1.72-0.77,1.72-1.72V78.56C69.97,77.61,69.2,76.84,68.25,76.84z M69.97,59.91c0-0.95-0.77-1.72-1.72-1.72
+	c-0.95,0-1.72,0.77-1.72,1.72v10.54c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72V59.91z M88.92,56.35
+	c-0.95,0-1.72,0.77-1.72,1.72v3.4c0,0.34-0.02,0.63-0.04,0.85c-0.51,0.55-0.62,1.38-0.22,2.06c0.32,0.54,0.89,0.84,1.48,0.84
+	c0.3,0,0.6-0.08,0.88-0.24l0.25-0.15c0.67-0.4,1.09-1.1,1.09-3.35v-3.4C90.64,57.12,89.87,56.35,88.92,56.35z M41.81,26.17h11.3
+	c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3c-0.95,0-1.72,0.77-1.72,1.72S40.86,26.17,41.81,26.17z M87.2,22.73h-5.39
+	c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h2.75l-1.58,1.68c-0.65,0.69-0.62,1.78,0.07,2.43c0.33,0.31,0.76,0.47,1.18,0.47
+	c0.46,0,0.91-0.18,1.25-0.54l1.72-1.82v0.99c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-3.21
+	C90.64,24.27,89.09,22.73,87.2,22.73z M61.81,26.17h11.3c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3
+	c-0.95,0-1.72,0.77-1.72,1.72S60.86,26.17,61.81,26.17z M9.71,67.54c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72
+	s-1.72,0.77-1.72,1.72v11.3C7.99,66.77,8.76,67.54,9.71,67.54z M24.65,33.86c0.42,0,0.84-0.15,1.17-0.46l7.04-6.52
+	c0.14-0.13,0.46-0.34,0.9-0.51c0.89-0.34,1.34-1.33,1-2.22s-1.33-1.34-2.22-1c-0.8,0.3-1.52,0.73-2.03,1.2l-7.04,6.52
+	c-0.7,0.65-0.74,1.74-0.09,2.43C23.73,33.68,24.19,33.86,24.65,33.86z M70.35,99.28l-0.37,0.36v-2.43c0-0.95-0.77-1.72-1.72-1.72
+	c-0.95,0-1.72,0.77-1.72,1.72v4.72H61.3c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h5.23c1.4,0,3.15-0.7,4.16-1.66l2.03-1.94
+	c0.69-0.66,0.71-1.75,0.06-2.43C72.13,98.65,71.03,98.63,70.35,99.28z M52.6,101.93H41.3c-0.95,0-1.72,0.77-1.72,1.72
+	s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S53.55,101.93,52.6,101.93z M88.92,36.35c-0.95,0-1.72,0.77-1.72,1.72v11.3
+	c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-11.3C90.64,37.12,89.87,36.35,88.92,36.35z M32.61,101.93H21.3
+	c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S33.56,101.93,32.61,101.93z M9.71,87.54
+	c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v11.3C7.99,86.77,8.76,87.54,9.71,87.54z
+	 M12.61,101.93h-1.18v-7.42c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v7.42c0,1.9,1.54,3.44,3.44,3.44h1.18
+	c0.95,0,1.72-0.77,1.72-1.72S13.56,101.93,12.61,101.93z M19.53,36.88c-0.65-0.7-1.74-0.74-2.43-0.09l-7.3,6.76
+	c-0.55,0.51-0.93,1.15-1.16,1.6C8.22,46,8.56,47.03,9.41,47.46c0.25,0.12,0.51,0.18,0.77,0.18h0.01c0.14,0.04,0.29,0.07,0.45,0.07
+	h5.6c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-2.13l5.33-4.94C20.14,38.66,20.18,37.57,19.53,36.88z M80.7,89.4l-4.05,3.86
+	c-0.69,0.66-0.71,1.75-0.06,2.43c0.34,0.35,0.79,0.53,1.25,0.53c0.43,0,0.86-0.16,1.19-0.48l4.05-3.86
+	c0.69-0.66,0.71-1.75,0.06-2.43C82.48,88.77,81.39,88.75,80.7,89.4z"/>
+<g>
+	<path fill="#ED6B21" d="M98.82,101.06c-11.63,0-21.09-9.46-21.09-21.09s9.46-21.09,21.09-21.09s21.09,9.46,21.09,21.09
+		S110.45,101.06,98.82,101.06z M98.82,62.32c-9.73,0-17.65,7.92-17.65,17.65s7.92,17.65,17.65,17.65s17.65-7.92,17.65-17.65
+		S108.55,62.32,98.82,62.32z"/>
+</g>
+<g>
+	<path fill="#ED6B21" d="M110.44,81.84c0,1.1-0.9,2-2,2H89.2c-1.1,0-2-0.9-2-2v-3.75c0-1.1,0.9-2,2-2h19.25c1.1,0,2,0.9,2,2
+		L110.44,81.84L110.44,81.84z"/>
+</g>
+</svg>
diff --git a/resources/icons/rotate.svg b/resources/icons/rotate.svg
new file mode 100644
index 000000000..508c4f39d
--- /dev/null
+++ b/resources/icons/rotate.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="rotate">
+	<g>
+		<path fill="#FFFFFF" d="M66.98,120.65c-0.9,0-1.79-0.34-2.47-1.02L25.27,80.4c-0.66-0.66-1.02-1.54-1.02-2.47s0.36-1.82,1.02-2.47
+			L64.5,36.22c1.37-1.36,3.58-1.36,4.95,0l39.23,39.23c1.36,1.36,1.36,3.58,0,4.95l-39.23,39.23
+			C68.77,120.31,67.88,120.65,66.98,120.65z M66.98,38.19c-0.13,0-0.26,0.05-0.35,0.14L27.39,77.57c-0.13,0.12-0.14,0.28-0.14,0.35
+			s0.02,0.23,0.14,0.35l39.23,39.23c0.19,0.19,0.52,0.19,0.71,0l39.23-39.23c0.19-0.19,0.19-0.52,0-0.71L67.33,38.34
+			C67.24,38.24,67.11,38.19,66.98,38.19z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M11.27,78.49c-0.65,0-1.25-0.43-1.44-1.08c-1.45-5.02-2.19-10.21-2.19-15.41
+			c0-30.59,24.89-55.48,55.48-55.48c15.38,0,29.68,6.15,40.27,17.33c0.57,0.6,0.54,1.55-0.06,2.12c-0.6,0.57-1.55,0.54-2.12-0.06
+			C91.2,15.34,77.67,9.52,63.12,9.52c-28.94,0-52.48,23.54-52.48,52.48c0,4.92,0.7,9.82,2.07,14.58c0.23,0.8-0.23,1.63-1.03,1.86
+			C11.55,78.47,11.41,78.49,11.27,78.49z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M117.27,42.19c-0.22,0-0.44-0.02-0.67-0.07l-23.34-4.67c-1.07-0.21-1.84-0.84-2.11-1.73
+			c-0.27-0.88,0.02-1.83,0.8-2.61l18.98-18.98c0.77-0.77,1.73-1.07,2.61-0.8c0.88,0.27,1.51,1.04,1.73,2.11v0l4.67,23.34
+			c0.2,1.01-0.06,1.97-0.71,2.62C118.72,41.92,118.03,42.19,117.27,42.19z M94.64,34.66l22.29,4.47l-4.45-22.3L94.64,34.66z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/scale.svg b/resources/icons/scale.svg
new file mode 100644
index 000000000..ee9cef95a
--- /dev/null
+++ b/resources/icons/scale.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="scale">
+	<g>
+		<path fill="#FFFFFF" d="M118.05,121.55H57.99c-1.93,0-3.5-1.57-3.5-3.5V57.99c0-1.93,1.57-3.5,3.5-3.5h60.06
+			c1.93,0,3.5,1.57,3.5,3.5v60.06C121.55,119.98,119.98,121.55,118.05,121.55z M57.99,57.49c-0.27,0-0.5,0.23-0.5,0.5v60.06
+			c0,0.27,0.23,0.5,0.5,0.5h60.06c0.27,0,0.5-0.23,0.5-0.5V57.99c0-0.27-0.23-0.5-0.5-0.5H57.99z"/>
+	</g>
+	<g>
+		<g>
+			<path fill="#ED6B21" d="M43.54,121.55h-10.5c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10.5c0.83,0,1.5,0.67,1.5,1.5
+				S44.37,121.55,43.54,121.55z"/>
+		</g>
+		<g>
+			<path fill="#ED6B21" d="M18.35,121.55h-8.4c-1.93,0-3.5-1.57-3.5-3.5v-10.5c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v10.5
+				c0,0.27,0.23,0.5,0.5,0.5h8.4c0.83,0,1.5,0.67,1.5,1.5S19.18,121.55,18.35,121.55z M7.95,94.36c-0.83,0-1.5-0.67-1.5-1.5V70.82
+				c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v22.04C9.45,93.69,8.78,94.36,7.95,94.36z M7.95,57.63c-0.83,0-1.5-0.67-1.5-1.5V34.1
+				c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v22.04C9.45,56.96,8.78,57.63,7.95,57.63z M7.95,20.91c-0.83,0-1.5-0.67-1.5-1.5V9.95
+				c0-1.93,1.57-3.5,3.5-3.5h9.44c0.83,0,1.5,0.67,1.5,1.5s-0.67,1.5-1.5,1.5H9.95c-0.27,0-0.5,0.23-0.5,0.5v9.46
+				C9.45,20.24,8.78,20.91,7.95,20.91z M120.05,19.83c-0.83,0-1.5-0.67-1.5-1.5V9.95c0-0.27-0.23-0.5-0.5-0.5h-10.52
+				c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h10.52c1.93,0,3.5,1.57,3.5,3.5v8.38C121.55,19.16,120.88,19.83,120.05,19.83z
+				 M92.84,9.45H70.81c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h22.04c0.83,0,1.5,0.67,1.5,1.5S93.67,9.45,92.84,9.45z
+				 M56.12,9.45H34.08c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h22.04c0.83,0,1.5,0.67,1.5,1.5S56.94,9.45,56.12,9.45z"/>
+		</g>
+		<g>
+			<path fill="#ED6B21" d="M120.05,45.04c-0.83,0-1.5-0.67-1.5-1.5v-10.5c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v10.5
+				C121.55,44.37,120.88,45.04,120.05,45.04z"/>
+		</g>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M49.38,44.41c0.78-0.78,0.78-2.05,0-2.83l-9.27-9.27c-0.78-0.78-0.78-2.05,0-2.83l4.95-4.95
+			c0.78-0.78,0.51-1.41-0.59-1.41H25.13c-1.1,0-2,0.9-2,2v19.34c0,1.1,0.64,1.36,1.41,0.59l4.95-4.95c0.78-0.78,2.05-0.78,2.83,0
+			l9.27,9.27c0.78,0.78,2.05,0.78,2.83,0L49.38,44.41z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/sla_supports.svg b/resources/icons/sla_supports.svg
new file mode 100644
index 000000000..119fb6afc
--- /dev/null
+++ b/resources/icons/sla_supports.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="SLA_supports">
+	<g>
+		<path fill="#FFFFFF" d="M117.02,121.54H11.12c-1.93,0-3.5-1.57-3.5-3.5v-3.99c0-1.93,1.57-3.5,3.5-3.5h105.9
+			c1.93,0,3.5,1.57,3.5,3.5v3.99C120.52,119.97,118.95,121.54,117.02,121.54z M11.12,113.55c-0.27,0-0.5,0.23-0.5,0.5v3.99
+			c0,0.27,0.23,0.5,0.5,0.5h105.9c0.27,0,0.5-0.23,0.5-0.5v-3.99c0-0.27-0.23-0.5-0.5-0.5H11.12z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M32.08,108.06c-0.83,0-1.5-0.67-1.5-1.5v-18.8c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v18.8
+			C33.58,107.39,32.9,108.06,32.08,108.06z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M48.02,108.06c-0.83,0-1.5-0.67-1.5-1.5v-8.14c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v8.14
+			C49.52,107.39,48.85,108.06,48.02,108.06z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M88.04,108.06c-0.83,0-1.5-0.67-1.5-1.5V93.09c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v13.47
+			C89.54,107.39,88.87,108.06,88.04,108.06z"/>
+	</g>
+	<path fill="#FFFFFF" d="M70.36,95.12l-6.29,4.2l-14.45-9.63l-2.5,2.6l15.96,10.64c0.3,0.2,0.64,0.3,0.99,0.3s0.69-0.1,0.99-0.3
+		l7.9-5.27L70.36,95.12z"/>
+	<polygon fill="#FFFFFF" points="88.97,86.99 86.35,84.46 77.91,90.09 80.5,92.63 	"/>
+	<path fill="#FFFFFF" d="M103.99,35.1L65.05,9.14c-0.6-0.4-1.37-0.4-1.97,0L24.14,35.1c-0.49,0.33-0.79,0.88-0.79,1.48v38.91
+		c0,0.59,0.3,1.15,0.79,1.48l15.47,10.32l2.5-2.6L26.9,74.54V37.53l37.16-24.78l37.16,24.78v37.01l-7.32,4.88l2.61,2.53l7.46-4.98
+		c0.49-0.33,0.79-0.88,0.79-1.48V36.58C104.78,35.99,104.49,35.43,103.99,35.1z"/>
+	<g>
+		<path fill="#ED6B21" d="M96.16,108.06c-0.83,0-1.5-0.67-1.5-1.5V87.93L79,73.22c-0.6-0.57-0.63-1.52-0.07-2.12
+			c0.57-0.6,1.52-0.63,2.12-0.07l16.13,15.15c0.3,0.28,0.47,0.68,0.47,1.09v19.27C97.66,107.39,96.99,108.06,96.16,108.06z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M40.08,108.06c-0.83,0-1.5-0.67-1.5-1.5V93.29c0-0.39,0.15-0.76,0.41-1.04l16.13-16.91
+			c0.57-0.6,1.52-0.62,2.12-0.05c0.6,0.57,0.62,1.52,0.05,2.12L41.58,93.89v12.67C41.58,107.39,40.91,108.06,40.08,108.06z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M80.13,108.06c-0.83,0-1.5-0.67-1.5-1.5v-7.65L62.94,83.19c-0.59-0.59-0.58-1.54,0-2.12
+			c0.59-0.58,1.54-0.59,2.12,0l16.13,16.15c0.28,0.28,0.44,0.66,0.44,1.06v8.27C81.63,107.39,80.96,108.06,80.13,108.06z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/split_objects.svg b/resources/icons/split_objects.svg
new file mode 100644
index 000000000..a7ccc5df8
--- /dev/null
+++ b/resources/icons/split_objects.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="OBJECTS">
+	<g>
+		<path fill="#FFFFFF" d="M34.63,91.95h-17.3c-4.96,0-9-4.04-9-9V17.28c0-4.96,4.04-9,9-9H83c4.96,0,9,4.04,9,9v17.3
+			c0,1.66-1.34,3-3,3s-3-1.34-3-3v-17.3c0-1.65-1.35-3-3-3H17.32c-1.65,0-3,1.35-3,3v65.67c0,1.65,1.35,3,3,3h17.3
+			c1.66,0,3,1.34,3,3S36.28,91.95,34.63,91.95z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M114.89,42.35H47.57c-2.85,0-5.18,2.33-5.18,5.18v67.32c0,2.85,2.33,5.18,5.18,5.18h67.32
+			c2.85,0,5.18-2.33,5.18-5.18V47.52C120.07,44.68,117.74,42.35,114.89,42.35z M101.82,94.28c0,12.63-6.35,18.27-20.89,18.27
+			s-20.42-5.64-20.42-18.27v-25.9c0-12.95,5.64-18.27,20.42-18.27c14.77,0,20.89,5.32,20.89,18.27V94.28z"/>
+		<path fill="#ED6B21" d="M80.93,59.8c-7.94,0-9.45,3.58-9.45,9.14v24.78c0,5.8,1.51,9.13,9.45,9.13s9.93-3.33,9.93-9.13V68.94
+			C90.86,63.38,89.43,59.8,80.93,59.8z"/>
+	</g>
+</g>
+</svg>
diff --git a/resources/icons/split_parts.svg b/resources/icons/split_parts.svg
new file mode 100644
index 000000000..82a292770
--- /dev/null
+++ b/resources/icons/split_parts.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="PARTS">
+	<g>
+		<path fill="#FFFFFF" d="M34.63,91.95h-17.3c-4.96,0-9-4.04-9-9V17.28c0-4.96,4.04-9,9-9H83c4.96,0,9,4.04,9,9v17.3
+			c0,1.66-1.34,3-3,3s-3-1.34-3-3v-17.3c0-1.65-1.35-3-3-3H17.32c-1.65,0-3,1.35-3,3v65.67c0,1.65,1.35,3,3,3h17.3
+			c1.66,0,3,1.34,3,3S36.28,91.95,34.63,91.95z"/>
+	</g>
+	<g>
+		<path fill="#ED6B21" d="M114.91,42.32H47.57c-2.85,0-5.18,2.33-5.18,5.18v67.34c0,2.85,2.33,5.18,5.18,5.18h67.34
+			c2.85,0,5.18-2.33,5.18-5.18V47.5C120.09,44.65,117.76,42.32,114.91,42.32z M99.95,74.39c0,12.84-7.27,18.81-22.04,18.81h-4.28
+			v19.05H62.25V50.09h15.66c15.02,0,22.04,5.41,22.04,18.57C99.95,68.66,99.95,74.39,99.95,74.39z"/>
+		<path fill="#ED6B21" d="M78.07,60.26h-4.52v22.2h4.36c8.08,0,10.74-2.74,10.74-8.64v-4.6C88.65,63.33,86.71,60.26,78.07,60.26z"/>
+	</g>
+</g>
+</svg>
diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp
index 755ca5ffa..e978b5838 100644
--- a/src/libslic3r/Technologies.hpp
+++ b/src/libslic3r/Technologies.hpp
@@ -42,15 +42,6 @@
 #define ENABLE_VOLUMES_CENTERING_FIXES (1 && ENABLE_1_42_0_ALPHA4)
 
 
-//====================
-// 1.42.0.alpha5 techs
-//====================
-#define ENABLE_1_42_0_ALPHA5 1
-
-// Toolbar items hidden/shown in dependence of the user mode
-#define ENABLE_MODE_AWARE_TOOLBAR_ITEMS (1 && ENABLE_1_42_0_ALPHA5)
-
-
 //====================
 // 1.42.0.alpha7 techs
 //====================
@@ -59,4 +50,13 @@
 // Printbed textures generated from svg files
 #define ENABLE_TEXTURES_FROM_SVG (1 && ENABLE_1_42_0_ALPHA7)
 
+
+//====================
+// 1.42.0.alpha8 techs
+//====================
+#define ENABLE_1_42_0_ALPHA8 1
+
+// Toolbars and Gizmos use icons imported from svg files
+#define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG)
+
 #endif // _technologies_h_
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 2ad9ec851..aacc6f0e3 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -2416,85 +2416,49 @@ void GLCanvas3D::Selection::_ensure_on_bed()
     }
 }
 
+#if ENABLE_SVG_ICONS
+const float GLCanvas3D::Gizmos::Default_Icons_Size = 64;
+#endif // ENABLE_SVG_ICONS
+
 GLCanvas3D::Gizmos::Gizmos()
     : m_enabled(false)
+#if ENABLE_SVG_ICONS
+    , m_icons_texture_dirty(true)
+#endif // ENABLE_SVG_ICONS
     , m_current(Undefined)
+#if ENABLE_SVG_ICONS
+    , m_overlay_icons_size(Default_Icons_Size)
+    , m_overlay_scale(1.0f)
+    , m_overlay_border(5.0f)
+    , m_overlay_gap_y(5.0f)
+{
+}
+#else
 {
     set_overlay_scale(1.0);
 }
+#endif // ENABLE_SVG_ICONS
 
 GLCanvas3D::Gizmos::~Gizmos()
 {
-    _reset();
+    reset();
 }
 
 bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent)
 {
-    GLGizmoBase* gizmo = new GLGizmoMove3D(parent);
-    if (gizmo == nullptr)
-        return false;
+#if !ENABLE_SVG_ICONS
+    m_icons_texture.metadata.filename = "gizmos.png";
+    m_icons_texture.metadata.icon_size = 64;
 
-    if (!gizmo->init())
-        return false;
-
-    m_gizmos.insert(GizmosMap::value_type(Move, gizmo));
-
-    gizmo = new GLGizmoScale3D(parent);
-    if (gizmo == nullptr)
-        return false;
-
-    if (!gizmo->init())
-        return false;
-
-    m_gizmos.insert(GizmosMap::value_type(Scale, gizmo));
-
-    gizmo = new GLGizmoRotate3D(parent);
-    if (gizmo == nullptr)
+    if (!m_icons_texture.metadata.filename.empty())
     {
-        _reset();
-        return false;
+        if (!m_icons_texture.texture.load_from_file(resources_dir() + "/icons/" + m_icons_texture.metadata.filename, false))
+        {
+            reset();
+            return false;
+        }
     }
-
-    if (!gizmo->init())
-    {
-        _reset();
-        return false;
-    }
-
-    m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo));
-
-    gizmo = new GLGizmoFlatten(parent);
-    if (gizmo == nullptr)
-        return false;
-
-    if (!gizmo->init()) {
-        _reset();
-        return false;
-    }
-
-    m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo));
-
-    gizmo = new GLGizmoCut(parent);
-    if (gizmo == nullptr)
-        return false;
-
-    if (!gizmo->init()) {
-        _reset();
-        return false;
-    }
-
-    m_gizmos.insert(GizmosMap::value_type(Cut, gizmo));
-
-    gizmo = new GLGizmoSlaSupports(parent);
-    if (gizmo == nullptr)
-        return false;
-
-    if (!gizmo->init()) {
-        _reset();
-        return false;
-    }
-
-    m_gizmos.insert(GizmosMap::value_type(SlaSupports, gizmo));
+#endif // !ENABLE_SVG_ICONS
 
     m_background_texture.metadata.filename = "toolbar_background.png";
     m_background_texture.metadata.left = 16;
@@ -2506,11 +2470,101 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent)
     {
         if (!m_background_texture.texture.load_from_file(resources_dir() + "/icons/" + m_background_texture.metadata.filename, false))
         {
-            _reset();
+            reset();
             return false;
         }
     }
 
+#if ENABLE_SVG_ICONS
+    GLGizmoBase* gizmo = new GLGizmoMove3D(parent, "move.svg", 0);
+#else
+    GLGizmoBase* gizmo = new GLGizmoMove3D(parent, 0);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+        return false;
+
+    if (!gizmo->init())
+        return false;
+
+    m_gizmos.insert(GizmosMap::value_type(Move, gizmo));
+
+#if ENABLE_SVG_ICONS
+    gizmo = new GLGizmoScale3D(parent, "scale.svg", 1);
+#else
+    gizmo = new GLGizmoScale3D(parent, 1);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+        return false;
+
+    if (!gizmo->init())
+        return false;
+
+    m_gizmos.insert(GizmosMap::value_type(Scale, gizmo));
+
+#if ENABLE_SVG_ICONS
+    gizmo = new GLGizmoRotate3D(parent, "rotate.svg", 2);
+#else
+    gizmo = new GLGizmoRotate3D(parent, 2);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+    {
+        reset();
+        return false;
+    }
+
+    if (!gizmo->init())
+    {
+        reset();
+        return false;
+    }
+
+    m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo));
+
+#if ENABLE_SVG_ICONS
+    gizmo = new GLGizmoFlatten(parent, "place.svg", 3);
+#else
+    gizmo = new GLGizmoFlatten(parent, 3);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+        return false;
+
+    if (!gizmo->init()) {
+        reset();
+        return false;
+    }
+
+    m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo));
+
+#if ENABLE_SVG_ICONS
+    gizmo = new GLGizmoCut(parent, "cut.svg", 4);
+#else
+    gizmo = new GLGizmoCut(parent, 4);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+        return false;
+
+    if (!gizmo->init()) {
+        reset();
+        return false;
+    }
+
+    m_gizmos.insert(GizmosMap::value_type(Cut, gizmo));
+
+#if ENABLE_SVG_ICONS
+    gizmo = new GLGizmoSlaSupports(parent, "sla_supports.svg", 5);
+#else
+    gizmo = new GLGizmoSlaSupports(parent, 5);
+#endif // ENABLE_SVG_ICONS
+    if (gizmo == nullptr)
+        return false;
+
+    if (!gizmo->init()) {
+        reset();
+        return false;
+    }
+
+    m_gizmos.insert(GizmosMap::value_type(SlaSupports, gizmo));
+
     return true;
 }
 
@@ -2524,11 +2578,30 @@ void GLCanvas3D::Gizmos::set_enabled(bool enable)
     m_enabled = enable;
 }
 
+#if ENABLE_SVG_ICONS
+void GLCanvas3D::Gizmos::set_overlay_icon_size(float size)
+{
+    if (m_overlay_icons_size != size)
+    {
+        m_overlay_icons_size = size;
+        m_icons_texture_dirty = true;
+    }
+}
+#endif // ENABLE_SVG_ICONS
+
 void GLCanvas3D::Gizmos::set_overlay_scale(float scale)
 {
+#if ENABLE_SVG_ICONS
+    if (m_overlay_scale != scale)
+    {
+        m_overlay_scale = scale;
+        m_icons_texture_dirty = true;
+    }
+#else
     m_overlay_icons_scale = scale;
     m_overlay_border = 5.0f * scale;
     m_overlay_gap_y = 5.0f * scale;
+#endif // ENABLE_SVG_ICONS
 }
 
 std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const GLCanvas3D::Selection& selection)
@@ -2539,23 +2612,39 @@ std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, con
         return name;
 
     float cnv_h = (float)canvas.get_canvas_size().get_height();
-    float height = _get_total_overlay_height();
+    float height = get_total_overlay_height();
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_overlay_icons_size * m_overlay_scale;
+    float scaled_border = m_overlay_border * m_overlay_scale;
+    float scaled_gap_y = m_overlay_gap_y * m_overlay_scale;
+    float scaled_stride_y = scaled_icons_size + scaled_gap_y;
+    float top_y = 0.5f * (cnv_h - height) + scaled_border;
+#else
     float top_y = 0.5f * (cnv_h - height) + m_overlay_border;
+    float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale;
+#endif // ENABLE_SVG_ICONS
+
     for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
     {
         if ((it->second == nullptr) || !it->second->is_selectable())
             continue;
 
-        float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale;
-
-        bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size);
+#if ENABLE_SVG_ICONS
+        bool inside = (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
+#else
+        bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
+#endif // ENABLE_SVG_ICONS
         if (inside)
             name = it->second->get_name();
 
         if (it->second->is_activable(selection) && (it->second->get_state() != GLGizmoBase::On))
             it->second->set_state(inside ? GLGizmoBase::Hover : GLGizmoBase::Off);
 
-        top_y += (icon_size + m_overlay_gap_y);
+#if ENABLE_SVG_ICONS
+        top_y += scaled_stride_y;
+#else
+        top_y += (scaled_icons_size + m_overlay_gap_y);
+#endif // ENABLE_SVG_ICONS
     }
 
     return name;
@@ -2567,17 +2656,29 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec
         return;
 
     float cnv_h = (float)canvas.get_canvas_size().get_height();
-    float height = _get_total_overlay_height();
+    float height = get_total_overlay_height();
+
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_overlay_icons_size * m_overlay_scale;
+    float scaled_border = m_overlay_border * m_overlay_scale;
+    float scaled_gap_y = m_overlay_gap_y * m_overlay_scale;
+    float scaled_stride_y = scaled_icons_size + scaled_gap_y;
+    float top_y = 0.5f * (cnv_h - height) + scaled_border;
+#else
     float top_y = 0.5f * (cnv_h - height) + m_overlay_border;
+    float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale;
+#endif // ENABLE_SVG_ICONS
 
     for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
     {
         if ((it->second == nullptr) || !it->second->is_selectable())
             continue;
 
-        float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale;
-
-        bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size);
+#if ENABLE_SVG_ICONS
+        bool inside = (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
+#else
+        bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
+#endif // ENABLE_SVG_ICONS
         if (it->second->is_activable(selection) && inside)
         {
             if ((it->second->get_state() == GLGizmoBase::On))
@@ -2594,7 +2695,11 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec
         else
             it->second->set_state(GLGizmoBase::Off);
 
-        top_y += (icon_size + m_overlay_gap_y);
+#if ENABLE_SVG_ICONS
+        top_y += scaled_stride_y;
+#else
+        top_y += (scaled_icons_size + m_overlay_gap_y);
+#endif // ENABLE_SVG_ICONS
     }
 
     GizmosMap::iterator it = m_gizmos.find(m_current);
@@ -2665,19 +2770,36 @@ bool GLCanvas3D::Gizmos::overlay_contains_mouse(const GLCanvas3D& canvas, const
         return false;
 
     float cnv_h = (float)canvas.get_canvas_size().get_height();
-    float height = _get_total_overlay_height();
+    float height = get_total_overlay_height();
+
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_overlay_icons_size * m_overlay_scale;
+    float scaled_border = m_overlay_border * m_overlay_scale;
+    float scaled_gap_y = m_overlay_gap_y * m_overlay_scale;
+    float scaled_stride_y = scaled_icons_size + scaled_gap_y;
+    float top_y = 0.5f * (cnv_h - height) + scaled_border;
+#else
     float top_y = 0.5f * (cnv_h - height) + m_overlay_border;
+    float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale;
+#endif // ENABLE_SVG_ICONS
+
     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
     {
         if ((it->second == nullptr) || !it->second->is_selectable())
             continue;
 
-        float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale;
-
-        if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size))
+#if ENABLE_SVG_ICONS
+        if ((scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size))
+#else
+        if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size))
+#endif // ENABLE_SVG_ICONS
             return true;
 
-        top_y += (icon_size + m_overlay_gap_y);
+#if ENABLE_SVG_ICONS
+        top_y += scaled_stride_y;
+#else
+        top_y += (scaled_icons_size + m_overlay_gap_y);
+#endif // ENABLE_SVG_ICONS
     }
 
     return false;
@@ -2688,7 +2810,7 @@ bool GLCanvas3D::Gizmos::grabber_contains_mouse() const
     if (!m_enabled)
         return false;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     return (curr != nullptr) ? (curr->get_hover_id() != -1) : false;
 }
 
@@ -2697,7 +2819,7 @@ void GLCanvas3D::Gizmos::update(const Linef3& mouse_ray, const Selection& select
     if (!m_enabled)
         return;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     if (curr != nullptr)
         curr->update(GLGizmoBase::UpdateData(mouse_ray, mouse_pos, shift_down), selection);
 }
@@ -2712,7 +2834,7 @@ bool GLCanvas3D::Gizmos::is_running() const
     if (!m_enabled)
         return false;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     return (curr != nullptr) ? (curr->get_state() == GLGizmoBase::On) : false;
 }
 
@@ -2762,7 +2884,7 @@ bool GLCanvas3D::Gizmos::is_dragging() const
     if (!m_enabled)
         return false;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     return (curr != nullptr) ? curr->is_dragging() : false;
 }
 
@@ -2771,7 +2893,7 @@ void GLCanvas3D::Gizmos::start_dragging(const GLCanvas3D::Selection& selection)
     if (!m_enabled)
         return;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     if (curr != nullptr)
         curr->start_dragging(selection);
 }
@@ -2781,7 +2903,7 @@ void GLCanvas3D::Gizmos::stop_dragging()
     if (!m_enabled)
         return;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     if (curr != nullptr)
         curr->stop_dragging();
 }
@@ -2881,7 +3003,7 @@ void GLCanvas3D::Gizmos::render_current_gizmo(const GLCanvas3D::Selection& selec
     if (!m_enabled)
         return;
 
-    _render_current_gizmo(selection);
+    do_render_current_gizmo(selection);
 }
 
 void GLCanvas3D::Gizmos::render_current_gizmo_for_picking_pass(const GLCanvas3D::Selection& selection) const
@@ -2889,7 +3011,7 @@ void GLCanvas3D::Gizmos::render_current_gizmo_for_picking_pass(const GLCanvas3D:
     if (!m_enabled)
         return;
 
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     if (curr != nullptr)
         curr->render_for_picking(selection);
 }
@@ -2899,12 +3021,17 @@ void GLCanvas3D::Gizmos::render_overlay(const GLCanvas3D& canvas, const GLCanvas
     if (!m_enabled)
         return;
 
+#if ENABLE_SVG_ICONS
+    if (m_icons_texture_dirty)
+        generate_icons_texture();
+#endif // ENABLE_SVG_ICONS
+
     ::glDisable(GL_DEPTH_TEST);
 
     ::glPushMatrix();
     ::glLoadIdentity();
 
-    _render_overlay(canvas, selection);
+    do_render_overlay(canvas, selection);
 
     ::glPopMatrix();
 }
@@ -2918,7 +3045,7 @@ void GLCanvas3D::Gizmos::create_external_gizmo_widgets(wxWindow *parent)
 }
 #endif // not ENABLE_IMGUI
 
-void GLCanvas3D::Gizmos::_reset()
+void GLCanvas3D::Gizmos::reset()
 {
     for (GizmosMap::value_type& gizmo : m_gizmos)
     {
@@ -2929,7 +3056,7 @@ void GLCanvas3D::Gizmos::_reset()
     m_gizmos.clear();
 }
 
-void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanvas3D::Selection& selection) const
+void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCanvas3D::Selection& selection) const
 {
     if (m_gizmos.empty())
         return;
@@ -2941,15 +3068,19 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva
     float zoom = canvas.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
 
-    float height = _get_total_overlay_height();
+    float height = get_total_overlay_height();
+#if ENABLE_SVG_ICONS
+    float scaled_border = m_overlay_border * m_overlay_scale * inv_zoom;
+#else
     float scaled_border = m_overlay_border * inv_zoom;
+#endif // ENABLE_SVG_ICONS
 
     float top_x = (-0.5f * cnv_w) * inv_zoom;
     float top_y = (0.5f * height) * inv_zoom;
 
     float left = top_x;
     float top = top_y;
-    float right = left + _get_total_overlay_width() * inv_zoom;
+    float right = left + get_total_overlay_width() * inv_zoom;
     float bottom = top - height * inv_zoom;
 
     // renders background
@@ -3018,68 +3149,159 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva
         }
     }
 
+#if ENABLE_SVG_ICONS
+    top_x += scaled_border;
+    top_y -= scaled_border;
+    float scaled_gap_y = m_overlay_gap_y * m_overlay_scale * inv_zoom;
+
+    float scaled_icons_size = m_overlay_icons_size * m_overlay_scale * inv_zoom;
+    float scaled_stride_y = scaled_icons_size + scaled_gap_y;
+    unsigned int icons_texture_id = m_icons_texture.get_id();
+    unsigned int tex_width = m_icons_texture.get_width();
+    unsigned int tex_height = m_icons_texture.get_height();
+    float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f;
+    float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f;
+#else
     top_x += m_overlay_border * inv_zoom;
     top_y -= m_overlay_border * inv_zoom;
     float scaled_gap_y = m_overlay_gap_y * inv_zoom;
+
+    float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale * inv_zoom;
+    unsigned int icons_texture_id = m_icons_texture.texture.get_id();
+    unsigned int texture_size = m_icons_texture.texture.get_width();
+    float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f;
+#endif // ENABLE_SVG_ICONS
+
+#if ENABLE_SVG_ICONS
+    if ((icons_texture_id == 0) || (tex_width <= 0) || (tex_height <= 0))
+        return;
+#endif // ENABLE_SVG_ICONS
+
     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
     {
         if ((it->second == nullptr) || !it->second->is_selectable())
             continue;
 
-        float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale * inv_zoom;
-        GLTexture::render_texture(it->second->get_texture_id(), top_x, top_x + icon_size, top_y - icon_size, top_y);
+        unsigned int sprite_id = it->second->get_sprite_id();
+        GLGizmoBase::EState state = it->second->get_state();
+
+#if ENABLE_SVG_ICONS
+        float u_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_width;
+        float v_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_height;
+        float top = sprite_id * v_icon_size;
+        float left = state * u_icon_size;
+        float bottom = top + v_icon_size;
+        float right = left + u_icon_size;
+#else
+        float uv_icon_size = (float)m_icons_texture.metadata.icon_size * inv_texture_size;
+        float top = sprite_id * uv_icon_size;
+        float left = state * uv_icon_size;
+        float bottom = top + uv_icon_size;
+        float right = left + uv_icon_size;
+#endif // ENABLE_SVG_ICONS
+
+        GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } });
 #if ENABLE_IMGUI
         if (it->second->get_state() == GLGizmoBase::On) {
             float toolbar_top = (float)cnv_h - canvas.m_view_toolbar->get_height();
+#if ENABLE_SVG_ICONS
+            it->second->render_input_window(2.0f * scaled_border + scaled_icons_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection);
+#else
             it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection);
+#endif // ENABLE_SVG_ICONS
         }
 #endif // ENABLE_IMGUI
-        top_y -= (icon_size + scaled_gap_y);
+#if ENABLE_SVG_ICONS
+        top_y -= scaled_stride_y;
+#else
+        top_y -= (scaled_icons_size + scaled_gap_y);
+#endif // ENABLE_SVG_ICONS
     }
 }
 
-void GLCanvas3D::Gizmos::_render_current_gizmo(const GLCanvas3D::Selection& selection) const
+void GLCanvas3D::Gizmos::do_render_current_gizmo(const GLCanvas3D::Selection& selection) const
 {
-    GLGizmoBase* curr = _get_current();
+    GLGizmoBase* curr = get_current();
     if (curr != nullptr)
         curr->render(selection);
 }
 
-float GLCanvas3D::Gizmos::_get_total_overlay_height() const
+float GLCanvas3D::Gizmos::get_total_overlay_height() const
 {
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_overlay_icons_size * m_overlay_scale;
+    float scaled_border = m_overlay_border * m_overlay_scale;
+    float scaled_gap_y = m_overlay_gap_y * m_overlay_scale;
+    float scaled_stride_y = scaled_icons_size + scaled_gap_y;
+    float height = 2.0f * scaled_border;
+#else
     float height = 2.0f * m_overlay_border;
 
+    float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale;
+#endif // ENABLE_SVG_ICONS
+
     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
     {
         if ((it->second == nullptr) || !it->second->is_selectable())
             continue;
 
-        height += (float)it->second->get_textures_size() * m_overlay_icons_scale + m_overlay_gap_y;
+#if ENABLE_SVG_ICONS
+        height += scaled_stride_y;
+#else
+        height += (scaled_icons_size + m_overlay_gap_y);
+#endif // ENABLE_SVG_ICONS
     }
 
+#if ENABLE_SVG_ICONS
+    return height - scaled_gap_y;
+#else
     return height - m_overlay_gap_y;
+#endif // ENABLE_SVG_ICONS
 }
 
-float GLCanvas3D::Gizmos::_get_total_overlay_width() const
+float GLCanvas3D::Gizmos::get_total_overlay_width() const
 {
-    float max_icon_width = 0.0f;
-    for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
-    {
-        if ((it->second == nullptr) || !it->second->is_selectable())
-            continue;
-
-        max_icon_width = std::max(max_icon_width, (float)it->second->get_textures_size() * m_overlay_icons_scale);
-    }
-
-    return max_icon_width + 2.0f * m_overlay_border;
+#if ENABLE_SVG_ICONS
+    return (2.0f * m_overlay_border + m_overlay_icons_size) * m_overlay_scale;
+#else
+    return (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale + 2.0f * m_overlay_border;
+#endif // ENABLE_SVG_ICONS
 }
 
-GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const
+GLGizmoBase* GLCanvas3D::Gizmos::get_current() const
 {
     GizmosMap::const_iterator it = m_gizmos.find(m_current);
     return (it != m_gizmos.end()) ? it->second : nullptr;
 }
 
+#if ENABLE_SVG_ICONS
+bool GLCanvas3D::Gizmos::generate_icons_texture() const
+{
+    std::string path = resources_dir() + "/icons/";
+    std::vector<std::string> filenames;
+    for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
+    {
+        if (it->second != nullptr)
+        {
+            const std::string& icon_filename = it->second->get_icon_filename();
+            if (!icon_filename.empty())
+                filenames.push_back(path + icon_filename);
+        }
+    }
+
+    std::vector<std::pair<int, bool>> states;
+    states.push_back(std::make_pair(1, false));
+    states.push_back(std::make_pair(0, false));
+    states.push_back(std::make_pair(0, true));
+
+    bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_overlay_icons_size * m_overlay_scale));
+    if (res)
+        m_icons_texture_dirty = false;
+
+    return res;
+}
+#endif // ENABLE_SVG_ICONS
+
 const unsigned char GLCanvas3D::WarningTexture::Background_Color[3] = { 9, 91, 134 };
 const unsigned char GLCanvas3D::WarningTexture::Opacity = 255;
 
@@ -3188,7 +3410,7 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanva
     ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data());
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
     ::glBindTexture(GL_TEXTURE_2D, 0);
 
     return true;
@@ -3441,7 +3663,7 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c
     ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data());
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
     ::glBindTexture(GL_TEXTURE_2D, 0);
 
     return true;
@@ -3509,7 +3731,11 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
 #endif
     , m_in_render(false)
     , m_bed(nullptr)
+#if ENABLE_SVG_ICONS
+    , m_toolbar(GLToolbar::Normal, "Top")
+#else
     , m_toolbar(GLToolbar::Normal)
+#endif // ENABLE_SVG_ICONS
     , m_view_toolbar(nullptr)
     , m_use_clipping_planes(false)
     , m_sidebar_field("")
@@ -3922,7 +4148,6 @@ void GLCanvas3D::update_volumes_colors_by_extruder()
         m_volumes.update_colors_by_extruder(m_config);
 }
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 void GLCanvas3D::update_toolbar_items_visibility()
 {
     ConfigOptionMode mode = wxGetApp().get_mode();
@@ -3931,7 +4156,6 @@ void GLCanvas3D::update_toolbar_items_visibility()
     m_toolbar.set_item_visible("splitvolumes", mode != comSimple);
     m_dirty = true;
 }
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
 // Returns a Rect object denoting size and position of the Reset button used by a gizmo.
 // Returns in either screen or viewport coords.
@@ -4045,7 +4269,9 @@ void GLCanvas3D::render()
     _render_gizmos_overlay();
     _render_warning_texture();
     _render_legend_texture();
+#if !ENABLE_SVG_ICONS
     _resize_toolbars();
+#endif // !ENABLE_SVG_ICONS
     _render_toolbar();
     _render_view_toolbar();
     if (m_layers_editing.last_object_id >= 0)
@@ -5713,16 +5939,11 @@ bool GLCanvas3D::_init_toolbar()
     if (!m_toolbar.is_enabled())
         return true;
 
+#if !ENABLE_SVG_ICONS
     ItemsIconsTexture::Metadata icons_data;
     icons_data.filename = "toolbar.png";
-    icons_data.icon_size = 36;
-    icons_data.icon_border_size = 1;
-    icons_data.icon_gap_size = 1;
-
-//    icons_data.filename = "toolbar141.png";
-//    icons_data.icon_size = 52;
-//    icons_data.icon_border_size = 0;
-//    icons_data.icon_gap_size = 0;
+    icons_data.icon_size = 37;
+#endif // !ENABLE_SVG_ICONS
 
     BackgroundTexture::Metadata background_data;
     background_data.filename = "toolbar_background.png";
@@ -5731,7 +5952,11 @@ bool GLCanvas3D::_init_toolbar()
     background_data.right = 16;
     background_data.bottom = 16;
 
+#if ENABLE_SVG_ICONS
+    if (!m_toolbar.init(background_data))
+#else
     if (!m_toolbar.init(icons_data, background_data))
+#endif // ENABLE_SVG_ICONS
     {
         // unable to init the toolbar texture, disable it
         m_toolbar.set_enabled(false);
@@ -5748,6 +5973,9 @@ bool GLCanvas3D::_init_toolbar()
     GLToolbarItem::Data item;
 
     item.name = "add";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "add.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]";
     item.sprite_id = 0;
     item.action_event = EVT_GLTOOLBAR_ADD;
@@ -5755,6 +5983,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "delete";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "remove.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Delete") + " [Del]";
     item.sprite_id = 1;
     item.action_event = EVT_GLTOOLBAR_DELETE;
@@ -5762,6 +5993,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "deleteall";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "delete_all.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]";
     item.sprite_id = 2;
     item.action_event = EVT_GLTOOLBAR_DELETE_ALL;
@@ -5769,6 +6003,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "arrange";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "arrange.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Arrange [A]");
     item.sprite_id = 3;
     item.action_event = EVT_GLTOOLBAR_ARRANGE;
@@ -5779,6 +6016,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "more";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "instance_add.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Add instance [+]");
     item.sprite_id = 4;
     item.action_event = EVT_GLTOOLBAR_MORE;
@@ -5786,6 +6026,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "fewer";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "instance_remove.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Remove instance [-]");
     item.sprite_id = 5;
     item.action_event = EVT_GLTOOLBAR_FEWER;
@@ -5796,6 +6039,9 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "splitobjects";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "split_objects.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Split to objects");
     item.sprite_id = 6;
     item.action_event = EVT_GLTOOLBAR_SPLIT_OBJECTS;
@@ -5803,8 +6049,11 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "splitvolumes";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "split_parts.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Split to parts");
-    item.sprite_id = 8;
+    item.sprite_id = 7;
     item.action_event = EVT_GLTOOLBAR_SPLIT_VOLUMES;
     if (!m_toolbar.add_item(item))
         return false;
@@ -5813,8 +6062,11 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "layersediting";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "layers.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Layers editing");
-    item.sprite_id = 7;
+    item.sprite_id = 8;
     item.is_toggable = true;
     item.action_event = EVT_GLTOOLBAR_LAYERSEDITING;
     if (!m_toolbar.add_item(item))
@@ -5822,9 +6074,7 @@ bool GLCanvas3D::_init_toolbar()
 
     enable_toolbar_item("add", true);
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     update_toolbar_items_visibility();
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
     return true;
 }
@@ -6304,11 +6554,63 @@ void GLCanvas3D::_render_gizmos_overlay() const
 
 void GLCanvas3D::_render_toolbar() const
 {
+#if ENABLE_SVG_ICONS
+#if ENABLE_RETINA_GL
+    m_toolbar.set_scale(m_retina_helper->get_scale_factor());
+#else
+    m_toolbar.set_scale(m_canvas->GetContentScaleFactor());
+#endif // ENABLE_RETINA_GL
+
+    Size cnv_size = get_canvas_size();
+    float zoom = get_camera_zoom();
+    float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+
+    GLToolbar::Layout::EOrientation orientation = m_toolbar.get_layout_orientation();
+
+    float top = 0.0f;
+    float left = 0.0f;
+    switch (m_toolbar.get_layout_type())
+    {
+    default:
+    case GLToolbar::Layout::Horizontal:
+    {
+        // centers the toolbar on the top edge of the 3d scene
+        if (orientation == GLToolbar::Layout::Top)
+        {
+            top = 0.5f * (float)cnv_size.get_height() * inv_zoom;
+            left = -0.5f * m_toolbar.get_width() * inv_zoom;
+        }
+        else
+        {
+            top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom;
+            left = -0.5f * m_toolbar.get_width() * inv_zoom;
+        }
+        break;
+    }
+    case GLToolbar::Layout::Vertical:
+    {
+        // centers the toolbar on the right edge of the 3d scene
+        if (orientation == GLToolbar::Layout::Left)
+        {
+            top = 0.5f * m_toolbar.get_height() * inv_zoom;
+            left = (-0.5f * (float)cnv_size.get_width()) * inv_zoom;
+        }
+        else
+        {
+            top = 0.5f * m_toolbar.get_height() * inv_zoom;
+            left = (0.5f * (float)cnv_size.get_width() - m_toolbar.get_width()) * inv_zoom;
+        }
+        break;
+    }
+    }
+    m_toolbar.set_position(top, left);
+#else
 #if ENABLE_RETINA_GL
     m_toolbar.set_icons_scale(m_retina_helper->get_scale_factor());
 #else
     m_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor());
 #endif /* __WXMSW__ */
+#endif // ENABLE_SVG_ICONS
 
     m_toolbar.render(*this);
 }
@@ -6316,11 +6618,28 @@ void GLCanvas3D::_render_toolbar() const
 void GLCanvas3D::_render_view_toolbar() const
 {
     if (m_view_toolbar != nullptr) {
+#if ENABLE_SVG_ICONS
+#if ENABLE_RETINA_GL
+        m_view_toolbar->set_scale(m_retina_helper->get_scale_factor());
+#else
+        m_view_toolbar->set_scale(m_canvas->GetContentScaleFactor());
+#endif // ENABLE_RETINA_GL
+
+        Size cnv_size = get_canvas_size();
+        float zoom = get_camera_zoom();
+        float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+
+        // places the toolbar on the bottom-left corner of the 3d scene
+        float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom;
+        float left = -0.5f * (float)cnv_size.get_width() * inv_zoom;
+        m_view_toolbar->set_position(top, left);
+#else
 #if ENABLE_RETINA_GL
         m_view_toolbar->set_icons_scale(m_retina_helper->get_scale_factor());
 #else
         m_view_toolbar->set_icons_scale(m_canvas->GetContentScaleFactor());
 #endif /* __WXMSW__ */
+#endif // ENABLE_SVG_ICONS
         m_view_toolbar->render(*this);
     }
 }
@@ -7809,6 +8128,7 @@ bool GLCanvas3D::_is_any_volume_outside() const
     return false;
 }
 
+#if !ENABLE_SVG_ICONS
 void GLCanvas3D::_resize_toolbars() const
 {
     Size cnv_size = get_canvas_size();
@@ -7876,6 +8196,7 @@ void GLCanvas3D::_resize_toolbars() const
         m_view_toolbar->set_position(top, left);
     }
 }
+#endif // !ENABLE_SVG_ICONS
 
 const Print* GLCanvas3D::fff_print() const
 {
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index 06fda3e5c..d47b7c976 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -688,6 +688,10 @@ private:
     class Gizmos
     {
     public:
+#if ENABLE_SVG_ICONS
+        static const float Default_Icons_Size;
+#endif // ENABLE_SVG_ICONS
+
         enum EType : unsigned char
         {
             Undefined,
@@ -704,10 +708,21 @@ private:
         bool m_enabled;
         typedef std::map<EType, GLGizmoBase*> GizmosMap;
         GizmosMap m_gizmos;
+#if ENABLE_SVG_ICONS
+        mutable GLTexture m_icons_texture;
+        mutable bool m_icons_texture_dirty;
+#else
+        ItemsIconsTexture m_icons_texture;
+#endif // ENABLE_SVG_ICONS
         BackgroundTexture m_background_texture;
         EType m_current;
 
+#if ENABLE_SVG_ICONS
+        float m_overlay_icons_size;
+        float m_overlay_scale;
+#else
         float m_overlay_icons_scale;
+#endif // ENABLE_SVG_ICONS
         float m_overlay_border;
         float m_overlay_gap_y;
 
@@ -720,6 +735,9 @@ private:
         bool is_enabled() const;
         void set_enabled(bool enable);
 
+#if ENABLE_SVG_ICONS
+        void set_overlay_icon_size(float size);
+#endif // ENABLE_SVG_ICONS
         void set_overlay_scale(float scale);
 
         std::string update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection);
@@ -769,15 +787,19 @@ private:
 #endif // not ENABLE_IMGUI
 
     private:
-        void _reset();
+        void reset();
 
-        void _render_overlay(const GLCanvas3D& canvas, const Selection& selection) const;
-        void _render_current_gizmo(const Selection& selection) const;
+        void do_render_overlay(const GLCanvas3D& canvas, const Selection& selection) const;
+        void do_render_current_gizmo(const Selection& selection) const;
 
-        float _get_total_overlay_height() const;
-        float _get_total_overlay_width() const;
+        float get_total_overlay_height() const;
+        float get_total_overlay_width() const;
 
-        GLGizmoBase* _get_current() const;
+        GLGizmoBase* get_current() const;
+
+#if ENABLE_SVG_ICONS
+        bool generate_icons_texture() const;
+#endif // ENABLE_SVG_ICONS
     };
 
     struct SlaCap
@@ -984,9 +1006,7 @@ public:
 
     void update_volumes_colors_by_extruder();
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     void update_toolbar_items_visibility();
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
 #if !ENABLE_IMGUI
     Rect get_gizmo_reset_rect(const GLCanvas3D& canvas, bool viewport) const;
@@ -1148,7 +1168,9 @@ private:
 
     bool _is_any_volume_outside() const;
 
+#if !ENABLE_SVG_ICONS
     void _resize_toolbars() const;
+#endif // !ENABLE_SVG_ICONS
 
     static std::vector<float> _parse_colors(const std::vector<std::string>& colors);
 
diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp
index b2686e1f3..d4b2bf526 100644
--- a/src/slic3r/GUI/GLGizmo.cpp
+++ b/src/slic3r/GUI/GLGizmo.cpp
@@ -159,11 +159,19 @@ void GLGizmoBase::Grabber::render_face(float half_size) const
     ::glEnd();
 }
 
-GLGizmoBase::GLGizmoBase(GLCanvas3D& parent)
+#if ENABLE_SVG_ICONS
+GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+#else
+GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id)
+#endif // ENABLE_SVG_ICONS
     : m_parent(parent)
     , m_group_id(-1)
     , m_state(Off)
     , m_shortcut_key(0)
+#if ENABLE_SVG_ICONS
+    , m_icon_filename(icon_filename)
+#endif // ENABLE_SVG_ICONS
+    , m_sprite_id(sprite_id)
     , m_hover_id(-1)
     , m_dragging(false)
 #if ENABLE_IMGUI
@@ -306,7 +314,11 @@ const unsigned int GLGizmoRotate::SnapRegionsCount = 8;
 const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius
 
 GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+    : GLGizmoBase(parent, "", -1)
+#else
+    : GLGizmoBase(parent, -1)
+#endif // ENABLE_SVG_ICONS
     , m_axis(axis)
     , m_angle(0.0)
     , m_quadric(nullptr)
@@ -323,7 +335,11 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis)
 }
 
 GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other)
-    : GLGizmoBase(other.m_parent)
+#if ENABLE_SVG_ICONS
+    : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id)
+#else
+    : GLGizmoBase(other.m_parent, other.m_sprite_id)
+#endif // ENABLE_SVG_ICONS
     , m_axis(other.m_axis)
     , m_angle(other.m_angle)
     , m_quadric(nullptr)
@@ -695,8 +711,13 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons
     return transform(mouse_ray, m).intersect_plane(0.0);
 }
 
-GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
 {
     m_gizmos.emplace_back(parent, GLGizmoRotate::X);
     m_gizmos.emplace_back(parent, GLGizmoRotate::Y);
@@ -721,17 +742,6 @@ bool GLGizmoRotate3D::on_init()
         m_gizmos[i].set_highlight_color(AXES_COLOR[i]);
     }
 
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "rotate_off.png", false))
-        return false;
-
-    if (!m_textures[Hover].load_from_file(path + "rotate_hover.png", false))
-        return false;
-
-    if (!m_textures[On].load_from_file(path + "rotate_on.png", false))
-        return false;
-
     m_shortcut_key = WXK_CONTROL_R;
 
     return true;
@@ -786,8 +796,13 @@ void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limi
 
 const float GLGizmoScale3D::Offset = 5.0f;
 
-GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
     , m_scale(Vec3d::Ones())
     , m_snap_step(0.05)
     , m_starting_scale(Vec3d::Ones())
@@ -796,17 +811,6 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent)
 
 bool GLGizmoScale3D::on_init()
 {
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "scale_off.png", false))
-        return false;
-
-    if (!m_textures[Hover].load_from_file(path + "scale_hover.png", false))
-        return false;
-
-    if (!m_textures[On].load_from_file(path + "scale_on.png", false))
-        return false;
-
     for (int i = 0; i < 10; ++i)
     {
         m_grabbers.push_back(Grabber());
@@ -1143,8 +1147,13 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const
 
 const double GLGizmoMove3D::Offset = 10.0;
 
-GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
     , m_displacement(Vec3d::Zero())
     , m_snap_step(1.0)
     , m_starting_drag_position(Vec3d::Zero())
@@ -1165,17 +1174,6 @@ GLGizmoMove3D::~GLGizmoMove3D()
 
 bool GLGizmoMove3D::on_init()
 {
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "move_off.png", false))
-        return false;
-
-    if (!m_textures[Hover].load_from_file(path + "move_hover.png", false))
-        return false;
-
-    if (!m_textures[On].load_from_file(path + "move_on.png", false))
-        return false;
-
     for (int i = 0; i < 3; ++i)
     {
         m_grabbers.push_back(Grabber());
@@ -1391,8 +1389,13 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box
         ::glDisable(GL_LIGHTING);
 }
 
-GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
     , m_normal(Vec3d::Zero())
     , m_starting_center(Vec3d::Zero())
 {
@@ -1400,19 +1403,7 @@ GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent)
 
 bool GLGizmoFlatten::on_init()
 {
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "layflat_off.png", false))
-        return false;
-
-    if (!m_textures[Hover].load_from_file(path + "layflat_hover.png", false))
-        return false;
-
-    if (!m_textures[On].load_from_file(path + "layflat_on.png", false))
-        return false;
-
     m_shortcut_key = WXK_CONTROL_F;
-
     return true;
 }
 
@@ -1742,8 +1733,14 @@ Vec3d GLGizmoFlatten::get_flattening_normal() const
     return out;
 }
 
-GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent)
-    : GLGizmoBase(parent), m_starting_center(Vec3d::Zero()), m_quadric(nullptr)
+#if ENABLE_SVG_ICONS
+GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
+    , m_starting_center(Vec3d::Zero()), m_quadric(nullptr)
 {
     m_quadric = ::gluNewQuadric();
     if (m_quadric != nullptr)
@@ -1760,19 +1757,7 @@ GLGizmoSlaSupports::~GLGizmoSlaSupports()
 
 bool GLGizmoSlaSupports::on_init()
 {
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "sla_support_points_off.png", false))
-        return false;
-
-    if (!m_textures[Hover].load_from_file(path + "sla_support_points_hover.png", false))
-        return false;
-
-    if (!m_textures[On].load_from_file(path + "sla_support_points_on.png", false))
-        return false;
-
     m_shortcut_key = WXK_CONTROL_L;
-
     return true;
 }
 
@@ -2651,8 +2636,13 @@ const double GLGizmoCut::Offset = 10.0;
 const double GLGizmoCut::Margin = 20.0;
 const std::array<float, 3> GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 };
 
-GLGizmoCut::GLGizmoCut(GLCanvas3D& parent)
-    : GLGizmoBase(parent)
+#if ENABLE_SVG_ICONS
+GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+    : GLGizmoBase(parent, icon_filename, sprite_id)
+#else
+GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id)
+    : GLGizmoBase(parent, sprite_id)
+#endif // ENABLE_SVG_ICONS
     , m_cut_z(0.0)
     , m_max_z(0.0)
 #if !ENABLE_IMGUI
@@ -2685,26 +2675,8 @@ void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent)
 
 bool GLGizmoCut::on_init()
 {
-    // TODO: icon
-
-    std::string path = resources_dir() + "/icons/overlay/";
-
-    if (!m_textures[Off].load_from_file(path + "cut_off.png", false)) {
-        return false;
-    }
-
-    if (!m_textures[Hover].load_from_file(path + "cut_hover.png", false)) {
-        return false;
-    }
-
-    if (!m_textures[On].load_from_file(path + "cut_on.png", false)) {
-        return false;
-    }
-
     m_grabbers.emplace_back();
-
     m_shortcut_key = WXK_CONTROL_C;
-
     return true;
 }
 
diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp
index 9d7472d21..fc8d40a65 100644
--- a/src/slic3r/GUI/GLGizmo.hpp
+++ b/src/slic3r/GUI/GLGizmo.hpp
@@ -87,8 +87,10 @@ protected:
     int m_group_id;
     EState m_state;
     int m_shortcut_key;
-    // textures are assumed to be square and all with the same size in pixels, no internal check is done
-    GLTexture m_textures[Num_States];
+#if ENABLE_SVG_ICONS
+    std::string m_icon_filename;
+#endif // ENABLE_SVG_ICONS
+    unsigned int m_sprite_id;
     int m_hover_id;
     bool m_dragging;
     float m_base_color[3];
@@ -100,7 +102,11 @@ protected:
 #endif // ENABLE_IMGUI
 
 public:
-    explicit GLGizmoBase(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
     virtual ~GLGizmoBase() {}
 
     bool init() { return on_init(); }
@@ -116,11 +122,14 @@ public:
     int get_shortcut_key() const { return m_shortcut_key; }
     void set_shortcut_key(int key) { m_shortcut_key = key; }
 
+#if ENABLE_SVG_ICONS
+    const std::string& get_icon_filename() const { return m_icon_filename; }
+#endif // ENABLE_SVG_ICONS
+
     bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); }
     bool is_selectable() const { return on_is_selectable(); }
 
-    unsigned int get_texture_id() const { return m_textures[m_state].get_id(); }
-    int get_textures_size() const { return m_textures[Off].get_width(); }
+    unsigned int get_sprite_id() const { return m_sprite_id; }
 
     int get_hover_id() const { return m_hover_id; }
     void set_hover_id(int id);
@@ -244,7 +253,11 @@ class GLGizmoRotate3D : public GLGizmoBase
     std::vector<GLGizmoRotate> m_gizmos;
 
 public:
-    explicit GLGizmoRotate3D(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
 
     Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); }
     void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); }
@@ -315,7 +328,11 @@ class GLGizmoScale3D : public GLGizmoBase
     BoundingBoxf3 m_starting_box;
 
 public:
-    explicit GLGizmoScale3D(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
 
     double get_snap_step(double step) const { return m_snap_step; }
     void set_snap_step(double step) { m_snap_step = step; }
@@ -362,7 +379,11 @@ class GLGizmoMove3D : public GLGizmoBase
     GLUquadricObj* m_quadric;
 
 public:
-    explicit GLGizmoMove3D(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
     virtual ~GLGizmoMove3D();
 
     double get_snap_step(double step) const { return m_snap_step; }
@@ -417,7 +438,11 @@ private:
     bool is_plane_update_necessary() const;
 
 public:
-    explicit GLGizmoFlatten(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
 
     void set_flattening_data(const ModelObject* model_object);
     Vec3d get_flattening_normal() const;
@@ -437,7 +462,7 @@ protected:
     }
 };
 
-
+#define SLAGIZMO_IMGUI_MODAL 0
 
 class GLGizmoSlaSupports : public GLGizmoBase
 {
@@ -465,7 +490,11 @@ private:
     mutable Vec3d m_starting_center;
 
 public:
-    explicit GLGizmoSlaSupports(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
     virtual ~GLGizmoSlaSupports();
     void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection);
     bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down);
@@ -560,7 +589,11 @@ class GLGizmoCut : public GLGizmoBase
 #endif // not ENABLE_IMGUI
 
 public:
-    explicit GLGizmoCut(GLCanvas3D& parent);
+#if ENABLE_SVG_ICONS
+    GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+#else
+    GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id);
+#endif // ENABLE_SVG_ICONS
 
 #if !ENABLE_IMGUI
     virtual void create_external_gizmo_widgets(wxWindow *parent);
diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp
index 19eff88e0..ab83d8051 100644
--- a/src/slic3r/GUI/GLTexture.cpp
+++ b/src/slic3r/GUI/GLTexture.cpp
@@ -6,19 +6,17 @@
 #include <wx/image.h>
 
 #include <boost/filesystem.hpp>
-#if ENABLE_TEXTURES_FROM_SVG
 #include <boost/algorithm/string/predicate.hpp>
-#endif // ENABLE_TEXTURES_FROM_SVG
 
 #include <vector>
 #include <algorithm>
 
-#if ENABLE_TEXTURES_FROM_SVG
 #define NANOSVG_IMPLEMENTATION
 #include "nanosvg/nanosvg.h"
 #define NANOSVGRAST_IMPLEMENTATION
 #include "nanosvg/nanosvgrast.h"
-#endif // ENABLE_TEXTURES_FROM_SVG
+
+#include "libslic3r/Utils.hpp"
 
 #include "libslic3r/Utils.hpp"
 
@@ -40,7 +38,6 @@ GLTexture::~GLTexture()
     reset();
 }
 
-#if ENABLE_TEXTURES_FROM_SVG
 bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps)
 {
     reset();
@@ -66,25 +63,20 @@ bool GLTexture::load_from_svg_file(const std::string& filename, bool use_mipmaps
     else
         return false;
 }
-#else
-bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps)
+
+bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::string>& filenames, const std::vector<std::pair<int, bool>>& states, unsigned int sprite_size_px)
 {
     reset();
 
-    if (!boost::filesystem::exists(filename))
+    if (filenames.empty() || states.empty() || (sprite_size_px == 0))
         return false;
 
-    // Load a PNG with an alpha channel.
-    wxImage image;
-	if (!image.LoadFile(wxString::FromUTF8(filename.c_str()), wxBITMAP_TYPE_PNG))
-    {
-        reset();
-        return false;
-    }
-
-    m_width = image.GetWidth();
-    m_height = image.GetHeight();
+    m_width = (int)(sprite_size_px * states.size());
+    m_height = (int)(sprite_size_px * filenames.size());
     int n_pixels = m_width * m_height;
+    int sprite_n_pixels = sprite_size_px * sprite_size_px;
+    int sprite_bytes = sprite_n_pixels * 4;
+    int sprite_stride = sprite_size_px * 4;
 
     if (n_pixels <= 0)
     {
@@ -92,52 +84,136 @@ bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps)
         return false;
     }
 
-    // Get RGB & alpha raw data from wxImage, pack them into an array.
-    unsigned char* img_rgb = image.GetData();
-    if (img_rgb == nullptr)
+    std::vector<unsigned char> data(n_pixels * 4, 0);
+    std::vector<unsigned char> sprite_data(sprite_bytes, 0);
+    std::vector<unsigned char> sprite_white_only_data(sprite_bytes, 0);
+    std::vector<unsigned char> sprite_gray_only_data(sprite_bytes, 0);
+    std::vector<unsigned char> output_data(sprite_bytes, 0);
+
+    NSVGrasterizer* rast = nsvgCreateRasterizer();
+    if (rast == nullptr)
     {
         reset();
         return false;
     }
 
-    unsigned char* img_alpha = image.GetAlpha();
-
-    std::vector<unsigned char> data(n_pixels * 4, 0);
-    for (int i = 0; i < n_pixels; ++i)
+    int sprite_id = -1;
+    for (const std::string& filename : filenames)
     {
-        int data_id = i * 4;
-        int img_id = i * 3;
-        data[data_id + 0] = img_rgb[img_id + 0];
-        data[data_id + 1] = img_rgb[img_id + 1];
-        data[data_id + 2] = img_rgb[img_id + 2];
-        data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255;
+        ++sprite_id;
+
+        if (!boost::filesystem::exists(filename))
+            continue;
+
+        if (!boost::algorithm::iends_with(filename, ".svg"))
+            continue;
+
+        NSVGimage* image = nsvgParseFromFile(filename.c_str(), "px", 96.0f);
+        if (image == nullptr)
+            continue;
+
+        float scale = (float)sprite_size_px / std::max(image->width, image->height);
+
+        nsvgRasterize(rast, image, 0, 0, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride);
+
+        // makes white only copy of the sprite
+        ::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes);
+        for (int i = 0; i < sprite_n_pixels; ++i)
+        {
+            int offset = i * 4;
+            if (sprite_white_only_data.data()[offset] != 0)
+                ::memset((void*)&sprite_white_only_data.data()[offset], 255, 3);
+        }
+
+        // makes gray only copy of the sprite
+        ::memcpy((void*)sprite_gray_only_data.data(), (const void*)sprite_data.data(), sprite_bytes);
+        for (int i = 0; i < sprite_n_pixels; ++i)
+        {
+            int offset = i * 4;
+            if (sprite_gray_only_data.data()[offset] != 0)
+                ::memset((void*)&sprite_gray_only_data.data()[offset], 128, 3);
+        }
+
+        int sprite_offset_px = sprite_id * sprite_size_px * m_width;
+        int state_id = -1;
+        for (const std::pair<int, bool>& state : states)
+        {
+            ++state_id;
+
+            // select the sprite variant
+            std::vector<unsigned char>* src = nullptr;
+            switch (state.first)
+            {
+            case 1: { src = &sprite_white_only_data; break; }
+            case 2: { src = &sprite_gray_only_data; break; }
+            default: { src = &sprite_data; break; }
+            }
+
+            ::memcpy((void*)output_data.data(), (const void*)src->data(), sprite_bytes);
+            // applies background, if needed
+            if (state.second)
+            {
+                for (int i = 0; i < sprite_n_pixels; ++i)
+                {
+                    int offset = i * 4;
+                    float alpha = (float)output_data.data()[offset + 3] / 255.0f;
+                    output_data.data()[offset + 0] = (unsigned char)(output_data.data()[offset + 0] * alpha);
+                    output_data.data()[offset + 1] = (unsigned char)(output_data.data()[offset + 1] * alpha);
+                    output_data.data()[offset + 2] = (unsigned char)(output_data.data()[offset + 2] * alpha);
+                    output_data.data()[offset + 3] = (unsigned char)(128 * (1.0f - alpha) + output_data.data()[offset + 3] * alpha);
+                }
+            }
+
+            int state_offset_px = sprite_offset_px + state_id * sprite_size_px;
+            for (int j = 0; j < sprite_size_px; ++j)
+            {
+                ::memcpy((void*)&data.data()[(state_offset_px + j * m_width) * 4], (const void*)&output_data.data()[j * sprite_stride], sprite_stride);
+            }
+        }
+
+        nsvgDelete(image);
     }
 
+    nsvgDeleteRasterizer(rast);
+
     // sends data to gpu
     ::glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
     ::glGenTextures(1, &m_id);
     ::glBindTexture(GL_TEXTURE_2D, m_id);
     ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data());
-    if (use_mipmaps)
-    {
-        // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards
-        unsigned int levels_count = generate_mipmaps(image);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1 + levels_count);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-    }
-    else
-    {
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
-    }
+    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
     ::glBindTexture(GL_TEXTURE_2D, 0);
 
-    m_source = filename;
+    m_source = filenames.front();
+    
+#if 0
+    // debug output
+    static int pass = 0;
+    ++pass;
+
+    wxImage output(m_width, m_height);
+    output.InitAlpha();
+
+    for (int h = 0; h < m_height; ++h)
+    {
+        int px_h = h * m_width;
+        for (int w = 0; w < m_width; ++w)
+        {
+            int offset = (px_h + w) * 4;
+            output.SetRGB(w, h, data.data()[offset + 0], data.data()[offset + 1], data.data()[offset + 2]);
+            output.SetAlpha(w, h, data.data()[offset + 3]);
+        }
+    }
+
+    std::string out_filename = resources_dir() + "/icons/test_" + std::to_string(pass) + ".png";
+    output.SaveFile(out_filename, wxBITMAP_TYPE_PNG);
+#endif // 0
+
     return true;
 }
-#endif // ENABLE_TEXTURES_FROM_SVG
 
 void GLTexture::reset()
 {
@@ -216,7 +292,6 @@ unsigned int GLTexture::generate_mipmaps(wxImage& image)
     return (unsigned int)level;
 }
 
-#if ENABLE_TEXTURES_FROM_SVG
 bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps)
 {
     // Load a PNG with an alpha channel.
@@ -267,13 +342,13 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps)
     {
         // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards
         unsigned int levels_count = generate_mipmaps(image);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1 + levels_count);
+        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, levels_count);
         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
     }
     else
     {
         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
     }
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
@@ -342,13 +417,13 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, uns
             ::glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data());
         }
 
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1 + level);
+        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
     }
     else
     {
         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+        ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
     }
     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
@@ -361,7 +436,6 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, uns
 
     return true;
 }
-#endif // ENABLE_TEXTURES_FROM_SVG
 
 } // namespace GUI
 } // namespace Slic3r
diff --git a/src/slic3r/GUI/GLTexture.hpp b/src/slic3r/GUI/GLTexture.hpp
index af41ac342..017255647 100644
--- a/src/slic3r/GUI/GLTexture.hpp
+++ b/src/slic3r/GUI/GLTexture.hpp
@@ -38,9 +38,16 @@ namespace GUI {
         virtual ~GLTexture();
 
         bool load_from_file(const std::string& filename, bool use_mipmaps);
-#if ENABLE_TEXTURES_FROM_SVG
         bool load_from_svg_file(const std::string& filename, bool use_mipmaps, unsigned int max_size_px);
-#endif // ENABLE_TEXTURES_FROM_SVG
+        // meanings of states: (std::pair<int, bool>)
+        // first field (int):
+        // 0 -> no changes
+        // 1 -> use white only color variant
+        // 2 -> use gray only color variant
+        // second field (bool):
+        // false -> no changes
+        // true -> add background color
+        bool load_from_svg_files_as_sprites_array(const std::vector<std::string>& filenames, const std::vector<std::pair<int, bool>>& states, unsigned int sprite_size_px);
         void reset();
 
         unsigned int get_id() const { return m_id; }
@@ -54,11 +61,9 @@ namespace GUI {
 
     protected:
         unsigned int generate_mipmaps(wxImage& image);
-#if ENABLE_TEXTURES_FROM_SVG
     private:
         bool load_from_png(const std::string& filename, bool use_mipmaps);
         bool load_from_svg(const std::string& filename, bool use_mipmaps, unsigned int max_size_px);
-#endif // ENABLE_TEXTURES_FROM_SVG
     };
 
 } // namespace GUI
diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp
index 8d04868f8..1b8ccc165 100644
--- a/src/slic3r/GUI/GLToolbar.cpp
+++ b/src/slic3r/GUI/GLToolbar.cpp
@@ -32,12 +32,13 @@ wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent);
 
 GLToolbarItem::Data::Data()
     : name("")
+#if ENABLE_SVG_ICONS
+    , icon_filename("")
+#endif // ENABLE_SVG_ICONS
     , tooltip("")
     , sprite_id(-1)
     , is_toggable(false)
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     , visible(true)
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 {
 }
 
@@ -53,26 +54,24 @@ void GLToolbarItem::do_action(wxEvtHandler *target)
     wxPostEvent(target, SimpleEvent(m_data.action_event));
 }
 
-void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const
+void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const
 {
-    GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(texture_size, border_size, icon_size, gap_size));
+    GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(tex_width, tex_height, icon_size));
 }
 
-GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const
+GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const
 {
     GLTexture::Quad_UVs uvs;
 
-    float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f;
+    float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f;
+    float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f;
 
-    float scaled_icon_size = (float)icon_size * inv_texture_size;
-    float scaled_border_size = (float)border_size * inv_texture_size;
-    float scaled_gap_size = (float)gap_size * inv_texture_size;
-    float stride = scaled_icon_size + scaled_gap_size;
-
-    float left = scaled_border_size + (float)m_state * stride;
-    float right = left + scaled_icon_size;
-    float top = scaled_border_size + (float)m_data.sprite_id * stride;
-    float bottom = top + scaled_icon_size;
+    float scaled_icon_width = (float)icon_size * inv_tex_width;
+    float scaled_icon_height = (float)icon_size * inv_tex_height;
+    float left = (float)m_state * scaled_icon_width;
+    float right = left + scaled_icon_width;
+    float top = (float)m_data.sprite_id * scaled_icon_height;
+    float bottom = top + scaled_icon_height;
 
     uvs.left_top = { left, top };
     uvs.left_bottom = { left, bottom };
@@ -82,13 +81,13 @@ GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned i
     return uvs;
 }
 
+#if !ENABLE_SVG_ICONS
 ItemsIconsTexture::Metadata::Metadata()
     : filename("")
     , icon_size(0)
-    , icon_border_size(0)
-    , icon_gap_size(0)
 {
 }
+#endif // !ENABLE_SVG_ICONS
 
 BackgroundTexture::Metadata::Metadata()
     : filename("")
@@ -99,6 +98,10 @@ BackgroundTexture::Metadata::Metadata()
 {
 }
 
+#if ENABLE_SVG_ICONS
+const float GLToolbar::Default_Icons_Size = 64.0f;
+#endif // ENABLE_SVG_ICONS
+
 GLToolbar::Layout::Layout()
     : type(Horizontal)
     , orientation(Center)
@@ -107,16 +110,31 @@ GLToolbar::Layout::Layout()
     , border(0.0f)
     , separator_size(0.0f)
     , gap_size(0.0f)
+#if ENABLE_SVG_ICONS
+    , icons_size(Default_Icons_Size)
+    , scale(1.0f)
+#else
     , icons_scale(1.0f)
+#endif // ENABLE_SVG_ICONS
     , width(0.0f)
     , height(0.0f)
     , dirty(true)
 {
 }
 
+#if ENABLE_SVG_ICONS
+GLToolbar::GLToolbar(GLToolbar::EType type, const std::string& name)
+#else
 GLToolbar::GLToolbar(GLToolbar::EType type)
+#endif // ENABLE_SVG_ICONS
     : m_type(type)
+#if ENABLE_SVG_ICONS
+    , m_name(name)
+#endif // ENABLE_SVG_ICONS
     , m_enabled(false)
+#if ENABLE_SVG_ICONS
+    , m_icons_texture_dirty(true)
+#endif // ENABLE_SVG_ICONS
 {
 }
 
@@ -128,8 +146,19 @@ GLToolbar::~GLToolbar()
     }
 }
 
+#if ENABLE_SVG_ICONS
+bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture)
+#else
 bool GLToolbar::init(const ItemsIconsTexture::Metadata& icons_texture, const BackgroundTexture::Metadata& background_texture)
+#endif // ENABLE_SVG_ICONS
 {
+#if ENABLE_SVG_ICONS
+    if (m_background_texture.texture.get_id() != 0)
+        return true;
+
+    std::string path = resources_dir() + "/icons/";
+    bool res = false;
+#else
     if (m_icons_texture.texture.get_id() != 0)
         return true;
 
@@ -137,6 +166,7 @@ bool GLToolbar::init(const ItemsIconsTexture::Metadata& icons_texture, const Bac
     bool res = !icons_texture.filename.empty() && m_icons_texture.texture.load_from_file(path + icons_texture.filename, false);
     if (res)
         m_icons_texture.metadata = icons_texture;
+#endif // ENABLE_SVG_ICONS
 
     if (!background_texture.filename.empty())
         res = m_background_texture.texture.load_from_file(path + background_texture.filename, false);
@@ -192,11 +222,33 @@ void GLToolbar::set_gap_size(float size)
     m_layout.dirty = true;
 }
 
+#if ENABLE_SVG_ICONS
+void GLToolbar::set_icons_size(float size)
+{
+    if (m_layout.icons_size != size)
+    {
+        m_layout.icons_size = size;
+        m_layout.dirty = true;
+        m_icons_texture_dirty = true;
+    }
+}
+
+void GLToolbar::set_scale(float scale)
+{
+    if (m_layout.scale != scale)
+    {
+        m_layout.scale = scale;
+        m_layout.dirty = true;
+        m_icons_texture_dirty = true;
+    }
+}
+#else
 void GLToolbar::set_icons_scale(float scale)
 {
     m_layout.icons_scale = scale;
     m_layout.dirty = true;
 }
+#endif // ENABLE_SVG_ICONS
 
 bool GLToolbar::is_enabled() const
 {
@@ -308,7 +360,6 @@ bool GLToolbar::is_item_disabled(const std::string& name) const
     return false;
 }
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 bool GLToolbar::is_item_visible(const std::string& name) const
 {
     for (GLToolbarItem* item : m_items)
@@ -346,7 +397,6 @@ void GLToolbar::set_item_visible(const std::string& name, bool visible)
     }
 
 }
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
 std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent)
 {
@@ -417,6 +467,11 @@ void GLToolbar::render(const GLCanvas3D& parent) const
     if (!m_enabled || m_items.empty())
         return;
 
+#if ENABLE_SVG_ICONS
+    if (m_icons_texture_dirty)
+        generate_icons_texture();
+#endif // ENABLE_SVG_ICONS
+
     ::glDisable(GL_DEPTH_TEST);
 
     ::glPushMatrix();
@@ -461,12 +516,20 @@ float GLToolbar::get_width_horizontal() const
 
 float GLToolbar::get_width_vertical() const
 {
+#if ENABLE_SVG_ICONS
+    return (2.0f * m_layout.border + m_layout.icons_size) * m_layout.scale;
+#else
     return 2.0f * m_layout.border * m_layout.icons_scale + m_icons_texture.metadata.icon_size * m_layout.icons_scale;
+#endif // ENABLE_SVG_ICONS
 }
 
 float GLToolbar::get_height_horizontal() const
 {
+#if ENABLE_SVG_ICONS
+    return (2.0f * m_layout.border + m_layout.icons_size) * m_layout.scale;
+#else
     return 2.0f * m_layout.border * m_layout.icons_scale + m_icons_texture.metadata.icon_size * m_layout.icons_scale;
+#endif // ENABLE_SVG_ICONS
 }
 
 float GLToolbar::get_height_vertical() const
@@ -476,13 +539,29 @@ float GLToolbar::get_height_vertical() const
 
 float GLToolbar::get_main_size() const
 {
+#if ENABLE_SVG_ICONS
+    float size = 2.0f * m_layout.border;
+    for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i)
+    {
+        if (!m_items[i]->is_visible())
+            continue;
+
+        if (m_items[i]->is_separator())
+            size += m_layout.separator_size;
+        else
+            size += (float)m_layout.icons_size;
+    }
+
+    if (m_items.size() > 1)
+        size += ((float)m_items.size() - 1.0f) * m_layout.gap_size;
+
+    size *= m_layout.scale;
+#else
     float size = 2.0f * m_layout.border * m_layout.icons_scale;
     for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i)
     {
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!m_items[i]->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (m_items[i]->is_separator())
             size += m_layout.separator_size * m_layout.icons_scale;
@@ -492,6 +571,7 @@ float GLToolbar::get_main_size() const
 
     if (m_items.size() > 1)
         size += ((float)m_items.size() - 1.0f) * m_layout.gap_size * m_layout.icons_scale;
+#endif // ENABLE_SVG_ICONS
 
     return size;
 }
@@ -502,12 +582,20 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = m_layout.scale * inv_zoom;
+#else
     float factor = m_layout.icons_scale * inv_zoom;
+#endif // ENABLE_SVG_ICONS
 
     Size cnv_size = parent.get_canvas_size();
     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom);
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
@@ -522,10 +610,8 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
         
     for (GLToolbarItem* item : m_items)
     {
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             left += separator_stride;
@@ -601,16 +687,23 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = m_layout.scale * inv_zoom;
+#else
     float factor = m_layout.icons_scale * inv_zoom;
+#endif // ENABLE_SVG_ICONS
 
     Size cnv_size = parent.get_canvas_size();
     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom);
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
-
     float separator_stride = scaled_separator_size + scaled_gap_size;
     float icon_stride = scaled_icons_size + scaled_gap_size;
 
@@ -621,10 +714,8 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
 
     for (GLToolbarItem* item : m_items)
     {
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             top -= separator_stride;
@@ -700,16 +791,23 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = m_layout.scale * inv_zoom;
+#else
     float factor = m_layout.icons_scale * inv_zoom;
+#endif // ENABLE_SVG_ICONS
 
     Size cnv_size = parent.get_canvas_size();
     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom);
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
-
     float separator_stride = scaled_separator_size + scaled_gap_size;
     float icon_stride = scaled_icons_size + scaled_gap_size;
 
@@ -722,10 +820,8 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3
     {
         ++id;
         
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             left += separator_stride;
@@ -733,7 +829,7 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3
         {
             float right = left + scaled_icons_size;
             float bottom = top - scaled_icons_size;
-            
+
             if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top))
                 return id;
             
@@ -750,12 +846,20 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D&
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = m_layout.scale * inv_zoom;
+#else
     float factor = m_layout.icons_scale * inv_zoom;
+#endif // ENABLE_SVG_ICONS
 
     Size cnv_size = parent.get_canvas_size();
     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom);
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
@@ -772,10 +876,8 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D&
     {
         ++id;
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             top -= separator_stride;
@@ -796,17 +898,34 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D&
 
 void GLToolbar::render_horizontal(const GLCanvas3D& parent) const
 {
+#if ENABLE_SVG_ICONS
+    unsigned int tex_id = m_icons_texture.get_id();
+    int tex_width = m_icons_texture.get_width();
+    int tex_height = m_icons_texture.get_height();
+#else
     unsigned int tex_id = m_icons_texture.texture.get_id();
-    int tex_size = m_icons_texture.texture.get_width();
+    int tex_width = m_icons_texture.texture.get_width();
+    int tex_height = m_icons_texture.texture.get_height();
+#endif // ENABLE_SVG_ICONS
 
-    if ((tex_id == 0) || (tex_size <= 0))
+#if !ENABLE_SVG_ICONS
+    if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0))
         return;
+#endif // !ENABLE_SVG_ICONS
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = inv_zoom * m_layout.scale;
+#else
     float factor = inv_zoom * m_layout.icons_scale;
+#endif // ENABLE_SVG_ICONS
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
@@ -907,19 +1026,26 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const
     left += scaled_border;
     top -= scaled_border;
 
+#if ENABLE_SVG_ICONS
+    if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0))
+        return;
+#endif // ENABLE_SVG_ICONS
+
     // renders icons
     for (const GLToolbarItem* item : m_items)
     {
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             left += separator_stride;
         else
         {
-            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size);
+#if ENABLE_SVG_ICONS
+            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale));
+#else
+            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size);
+#endif // ENABLE_SVG_ICONS
             left += icon_stride;
         }
     }
@@ -927,17 +1053,34 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const
 
 void GLToolbar::render_vertical(const GLCanvas3D& parent) const
 {
+#if ENABLE_SVG_ICONS
+    unsigned int tex_id = m_icons_texture.get_id();
+    int tex_width = m_icons_texture.get_width();
+    int tex_height = m_icons_texture.get_height();
+#else
     unsigned int tex_id = m_icons_texture.texture.get_id();
-    int tex_size = m_icons_texture.texture.get_width();
+    int tex_width = m_icons_texture.texture.get_width();
+    int tex_height = m_icons_texture.texture.get_height();
+#endif // ENABLE_SVG_ICONS
 
-    if ((tex_id == 0) || (tex_size <= 0))
+#if !ENABLE_SVG_ICONS
+    if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0))
         return;
+#endif // !ENABLE_SVG_ICONS
 
     float zoom = parent.get_camera_zoom();
     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+#if ENABLE_SVG_ICONS
+    float factor = inv_zoom * m_layout.scale;
+#else
     float factor = inv_zoom * m_layout.icons_scale;
+#endif // ENABLE_SVG_ICONS
 
+#if ENABLE_SVG_ICONS
+    float scaled_icons_size = m_layout.icons_size * factor;
+#else
     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_layout.icons_scale * factor;
+#endif // ENABLE_SVG_ICONS
     float scaled_separator_size = m_layout.separator_size * factor;
     float scaled_gap_size = m_layout.gap_size * factor;
     float scaled_border = m_layout.border * factor;
@@ -1038,23 +1181,68 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const
     left += scaled_border;
     top -= scaled_border;
 
+#if ENABLE_SVG_ICONS
+    if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0))
+        return;
+#endif // ENABLE_SVG_ICONS
+
     // renders icons
     for (const GLToolbarItem* item : m_items)
     {
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         if (!item->is_visible())
             continue;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         if (item->is_separator())
             top -= separator_stride;
         else
         {
-            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size);
+#if ENABLE_SVG_ICONS
+            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale));
+#else
+            item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size);
+#endif // ENABLE_SVG_ICONS
             top -= icon_stride;
         }
     }
 }
 
+#if ENABLE_SVG_ICONS
+bool GLToolbar::generate_icons_texture() const
+{
+    std::string path = resources_dir() + "/icons/";
+    std::vector<std::string> filenames;
+    for (GLToolbarItem* item : m_items)
+    {
+        const std::string& icon_filename = item->get_icon_filename();
+        if (!icon_filename.empty())
+            filenames.push_back(path + icon_filename);
+    }
+
+    std::vector<std::pair<int, bool>> states;
+    if (m_name == "Top")
+    {
+        states.push_back(std::make_pair(1, false));
+        states.push_back(std::make_pair(0, false));
+        states.push_back(std::make_pair(2, false));
+        states.push_back(std::make_pair(0, false));
+        states.push_back(std::make_pair(0, false));
+    }
+    else if (m_name == "View")
+    {
+        states.push_back(std::make_pair(1, false));
+        states.push_back(std::make_pair(1, true));
+        states.push_back(std::make_pair(1, false));
+        states.push_back(std::make_pair(0, false));
+        states.push_back(std::make_pair(1, true));
+    }
+
+    bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_layout.icons_size * m_layout.scale));
+    if (res)
+        m_icons_texture_dirty = false;
+
+    return res;
+}
+#endif // ENABLE_SVG_ICONS
+
 } // namespace GUI
 } // namespace Slic3r
diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp
index 951d5e072..4ca72fc4a 100644
--- a/src/slic3r/GUI/GLToolbar.hpp
+++ b/src/slic3r/GUI/GLToolbar.hpp
@@ -51,13 +51,14 @@ public:
     struct Data
     {
         std::string name;
+#if ENABLE_SVG_ICONS
+        std::string icon_filename;
+#endif // ENABLE_SVG_ICONS
         std::string tooltip;
         unsigned int sprite_id;
         bool is_toggable;
         wxEventType action_event;
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
         bool visible;
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
         Data();
     };
@@ -74,6 +75,9 @@ public:
     void set_state(EState state) { m_state = state; }
 
     const std::string& get_name() const { return m_data.name; }
+#if ENABLE_SVG_ICONS
+    const std::string& get_icon_filename() const { return m_data.icon_filename; }
+#endif // ENABLE_SVG_ICONS
     const std::string& get_tooltip() const { return m_data.tooltip; }
 
     void do_action(wxEvtHandler *target);
@@ -84,18 +88,17 @@ public:
     bool is_pressed() const { return (m_state == Pressed) || (m_state == HoverPressed); }
 
     bool is_toggable() const { return m_data.is_toggable; }
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     bool is_visible() const { return m_data.visible; }
     void set_visible(bool visible) { m_data.visible = visible; }
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     bool is_separator() const { return m_type == Separator; }
 
-    void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const;
+    void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const;
 
 private:
-    GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const;
+    GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const;
 };
 
+#if !ENABLE_SVG_ICONS
 // items icon textures are assumed to be square and all with the same size in pixels, no internal check is done
 // icons are layed-out into the texture starting from the top-left corner in the same order as enum GLToolbarItem::EState
 // from left to right
@@ -107,10 +110,6 @@ struct ItemsIconsTexture
         std::string filename;
         // size of the square icons, in pixels
         unsigned int icon_size;
-        // size of the border, in pixels
-        unsigned int icon_border_size;
-        // distance between two adjacent icons (to avoid filtering artifacts), in pixels
-        unsigned int icon_gap_size;
 
         Metadata();
     };
@@ -118,6 +117,7 @@ struct ItemsIconsTexture
     GLTexture texture;
     Metadata metadata;
 };
+#endif // !ENABLE_SVG_ICONS
 
 struct BackgroundTexture
 {
@@ -144,6 +144,10 @@ struct BackgroundTexture
 class GLToolbar
 {
 public:
+#if ENABLE_SVG_ICONS
+    static const float Default_Icons_Size;
+#endif // ENABLE_SVG_ICONS
+
     enum EType : unsigned char
     {
         Normal,
@@ -177,7 +181,12 @@ public:
         float border;
         float separator_size;
         float gap_size;
+#if ENABLE_SVG_ICONS
+        float icons_size;
+        float scale;
+#else
         float icons_scale;
+#endif // ENABLE_SVG_ICONS
 
         float width;
         float height;
@@ -190,18 +199,34 @@ private:
     typedef std::vector<GLToolbarItem*> ItemsList;
 
     EType m_type;
+#if ENABLE_SVG_ICONS
+    std::string m_name;
+#endif // ENABLE_SVG_ICONS
     bool m_enabled;
+#if ENABLE_SVG_ICONS
+    mutable GLTexture m_icons_texture;
+    mutable bool m_icons_texture_dirty;
+#else
     ItemsIconsTexture m_icons_texture;
+#endif // ENABLE_SVG_ICONS
     BackgroundTexture m_background_texture;
     mutable Layout m_layout;
 
     ItemsList m_items;
 
 public:
+#if ENABLE_SVG_ICONS
+    GLToolbar(EType type, const std::string& name);
+#else
     explicit GLToolbar(EType type);
+#endif // ENABLE_SVG_ICONS
     ~GLToolbar();
 
+#if ENABLE_SVG_ICONS
+    bool init(const BackgroundTexture::Metadata& background_texture);
+#else
     bool init(const ItemsIconsTexture::Metadata& icons_texture, const BackgroundTexture::Metadata& background_texture);
+#endif // ENABLE_SVG_ICONS
 
     Layout::EType get_layout_type() const;
     void set_layout_type(Layout::EType type);
@@ -212,7 +237,12 @@ public:
     void set_border(float border);
     void set_separator_size(float size);
     void set_gap_size(float size);
+#if ENABLE_SVG_ICONS
+    void set_icons_size(float size);
+    void set_scale(float scale);
+#else
     void set_icons_scale(float scale);
+#endif // ENABLE_SVG_ICONS
 
     bool is_enabled() const;
     void set_enabled(bool enable);
@@ -229,10 +259,8 @@ public:
 
     bool is_item_pressed(const std::string& name) const;
     bool is_item_disabled(const std::string& name) const;
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     bool is_item_visible(const std::string& name) const;
     void set_item_visible(const std::string& name, bool visible);
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
     std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent);
 
@@ -257,6 +285,10 @@ private:
 
     void render_horizontal(const GLCanvas3D& parent) const;
     void render_vertical(const GLCanvas3D& parent) const;
+
+#if ENABLE_SVG_ICONS
+    bool generate_icons_texture() const;
+#endif // ENABLE_SVG_ICONS
 };
 
 } // namespace GUI
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index 0857265f3..c2ff7bfb7 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -259,7 +259,7 @@ void ObjectList::update_extruder_values_for_items(const int max_extruder)
 void ObjectList::update_objects_list_extruder_column(int extruders_count)
 {
     if (!this) return; // #ys_FIXME
-    if (wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
+    if (printer_technology() == ptSLA)
         extruders_count = 1;
 
     wxDataViewChoiceRenderer* ch_render = dynamic_cast<wxDataViewChoiceRenderer*>(GetColumn(1)->GetRenderer());
@@ -452,7 +452,7 @@ void ObjectList::show_context_menu()
 
         wxMenu* menu = type & itInstance ? &m_menu_instance :
                        m_objects_model->GetParent(item) != wxDataViewItem(0) ? &m_menu_part :
-                       wxGetApp().plater()->printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object;
+                       printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object;
 
         if (!(type & itInstance))
             append_menu_item_settings(menu);
@@ -597,7 +597,7 @@ void ObjectList::OnDrop(wxDataViewEvent &event)
 
 std::vector<std::string> ObjectList::get_options(const bool is_part)
 {
-    if (wxGetApp().plater()->printer_technology() == ptSLA) {
+    if (printer_technology() == ptSLA) {
         SLAPrintObjectConfig full_sla_config;
         auto options = full_sla_config.keys();
         options.erase(find(options.begin(), options.end(), "layer_height"));
@@ -616,7 +616,7 @@ std::vector<std::string> ObjectList::get_options(const bool is_part)
     
 const std::vector<std::string>& ObjectList::get_options_for_bundle(const wxString& bundle_name)
 {
-    const FreqSettingsBundle& bundle = wxGetApp().plater()->printer_technology() == ptSLA ? 
+    const FreqSettingsBundle& bundle = printer_technology() == ptSLA ? 
                                        FREQ_SETTINGS_BUNDLE_SLA : FREQ_SETTINGS_BUNDLE_FFF;
 
     for (auto& it : bundle)
@@ -626,7 +626,7 @@ const std::vector<std::string>& ObjectList::get_options_for_bundle(const wxStrin
     }
 #if 0
     // if "Quick menu" is selected
-    FreqSettingsBundle& bundle_quick = wxGetApp().plater()->printer_technology() == ptSLA ?
+    FreqSettingsBundle& bundle_quick = printer_technology() == ptSLA ?
                                        m_freq_settings_sla: m_freq_settings_fff;
 
     for (auto& it : bundle_quick)
@@ -644,7 +644,7 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const
 {
     auto options = get_options(is_part);
 
-    auto extruders_cnt = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA ? 1 :
+    auto extruders_cnt = printer_technology() == ptSLA ? 1 :
         wxGetApp().preset_bundle->printers.get_edited_preset().config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
 
     DynamicPrintConfig config;
@@ -667,6 +667,11 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const
     }
 }
 
+Slic3r::PrinterTechnology ObjectList::printer_technology() const 
+{
+    return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
+}
+
 void ObjectList::get_settings_choice(const wxString& category_name)
 {
     wxArrayString names;
@@ -705,7 +710,7 @@ void ObjectList::get_settings_choice(const wxString& category_name)
     if (selection_cnt > 0) 
     {
         // Add selected items to the "Quick menu"
-        FreqSettingsBundle& freq_settings = wxGetApp().plater()->printer_technology() == ptSLA ?
+        FreqSettingsBundle& freq_settings = printer_technology() == ptSLA ?
                                             m_freq_settings_sla : m_freq_settings_fff;
         bool changed_existing = false;
 
@@ -751,7 +756,9 @@ void ObjectList::get_settings_choice(const wxString& category_name)
     for (auto sel : selections)
         selected_options.push_back((*settings_list)[sel].first);
 
-    const DynamicPrintConfig& from_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
+    const DynamicPrintConfig& from_config = printer_technology() == ptFFF ? 
+                                            wxGetApp().preset_bundle->prints.get_edited_preset().config : 
+                                            wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
 
     for (auto& setting : (*settings_list))
     {
@@ -1065,10 +1072,10 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu)
 void ObjectList::create_freq_settings_popupmenu(wxMenu *menu)
 {
     // Add default settings bundles
-    const FreqSettingsBundle& bundle = wxGetApp().plater()->printer_technology() == ptFFF ?
+    const FreqSettingsBundle& bundle = printer_technology() == ptFFF ?
                                      FREQ_SETTINGS_BUNDLE_FFF : FREQ_SETTINGS_BUNDLE_SLA;
 
-    auto extruders_cnt = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA ? 1 :
+    auto extruders_cnt = printer_technology() == ptSLA ? 1 :
                          wxGetApp().preset_bundle->printers.get_edited_preset().config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
 
     for (auto& it : bundle) {
@@ -1081,7 +1088,7 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu)
     }
 #if 0
     // Add "Quick" settings bundles
-    const FreqSettingsBundle& bundle_quick = wxGetApp().plater()->printer_technology() == ptFFF ?
+    const FreqSettingsBundle& bundle_quick = printer_technology() == ptFFF ?
                                              m_freq_settings_fff : m_freq_settings_sla;
 
     for (auto& it : bundle_quick) {
diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp
index 7d14eb13f..9e24b4b49 100644
--- a/src/slic3r/GUI/GUI_ObjectList.hpp
+++ b/src/slic3r/GUI/GUI_ObjectList.hpp
@@ -284,6 +284,8 @@ private:
     std::vector<std::string>        get_options(const bool is_part);
     const std::vector<std::string>& get_options_for_bundle(const wxString& bundle_name);
     void                            get_options_menu(settings_menu_hierarchy& settings_menu, const bool is_part);
+
+    PrinterTechnology printer_technology() const ;
 };
 
 
diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp
index f85df395d..d48bb5f49 100644
--- a/src/slic3r/GUI/GUI_Preview.cpp
+++ b/src/slic3r/GUI/GUI_Preview.cpp
@@ -137,13 +137,11 @@ void View3D::mirror_selection(Axis axis)
         m_canvas->mirror_selection(axis);
 }
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 void View3D::update_toolbar_items_visibility()
 {
     if (m_canvas != nullptr)
         m_canvas->update_toolbar_items_visibility();
 }
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 
 void View3D::enable_toolbar_item(const std::string& name, bool enable)
 {
diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp
index d3cb4e5bf..1d65aff1b 100644
--- a/src/slic3r/GUI/GUI_Preview.hpp
+++ b/src/slic3r/GUI/GUI_Preview.hpp
@@ -60,9 +60,7 @@ public:
     void delete_selected();
     void mirror_selection(Axis axis);
 
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     void update_toolbar_items_visibility();
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     void enable_toolbar_item(const std::string& name, bool enable);
     int check_volumes_outside_state() const;
 
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index e90752e19..4e3ed4797 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -1178,7 +1178,11 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
     , sidebar(new Sidebar(q))
     , delayed_scene_refresh(false)
     , project_filename(wxEmptyString)
+#if ENABLE_SVG_ICONS
+    , view_toolbar(GLToolbar::Radio, "View")
+#else
     , view_toolbar(GLToolbar::Radio)
+#endif // ENABLE_SVG_ICONS
 {
     arranging.store(false);
     rotoptimizing.store(false);
@@ -2624,11 +2628,11 @@ bool Plater::priv::complit_init_part_menu()
 
 void Plater::priv::init_view_toolbar()
 {
+#if !ENABLE_SVG_ICONS
     ItemsIconsTexture::Metadata icons_data;
     icons_data.filename = "view_toolbar.png";
     icons_data.icon_size = 64;
-    icons_data.icon_border_size = 0;
-    icons_data.icon_gap_size = 0;
+#endif // !ENABLE_SVG_ICONS
 
     BackgroundTexture::Metadata background_data;
     background_data.filename = "toolbar_background.png";
@@ -2637,7 +2641,11 @@ void Plater::priv::init_view_toolbar()
     background_data.right = 16;
     background_data.bottom = 16;
 
+#if ENABLE_SVG_ICONS
+    if (!view_toolbar.init(background_data))
+#else
     if (!view_toolbar.init(icons_data, background_data))
+#endif // ENABLE_SVG_ICONS
         return;
 
     view_toolbar.set_layout_orientation(GLToolbar::Layout::Bottom);
@@ -2647,6 +2655,9 @@ void Plater::priv::init_view_toolbar()
     GLToolbarItem::Data item;
 
     item.name = "3D";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "editor.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]";
     item.sprite_id = 0;
     item.action_event = EVT_GLVIEWTOOLBAR_3D;
@@ -2655,6 +2666,9 @@ void Plater::priv::init_view_toolbar()
         return;
 
     item.name = "Preview";
+#if ENABLE_SVG_ICONS
+    item.icon_filename = "preview.svg";
+#endif // ENABLE_SVG_ICONS
     item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]";
     item.sprite_id = 1;
     item.action_event = EVT_GLVIEWTOOLBAR_PREVIEW;
@@ -2750,10 +2764,8 @@ void Plater::priv::set_bed_shape(const Pointfs& shape)
 void Plater::priv::update_object_menu()
 {
     sidebar->obj_list()->append_menu_items_add_volume(&object_menu);
-#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS
     if (view3D != nullptr)
         view3D->update_toolbar_items_visibility();
-#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS
 }
 
 // Plater / Public