diff --git a/build/vs2010/Lol.sln b/build/vs2010/Lol.sln
index bbc7a86c..5e8247d4 100644
--- a/build/vs2010/Lol.sln
+++ b/build/vs2010/Lol.sln
@@ -168,6 +168,7 @@ Global
 		{EF1A4E80-63FA-4EB0-B834-12B6C500F31C}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|PS3.ActiveCfg = Debug|PS3
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|PS3.Build.0 = Debug|PS3
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -179,6 +180,7 @@ Global
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|Any CPU.ActiveCfg = Release|Win32
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|PS3.ActiveCfg = Release|PS3
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|PS3.Build.0 = Release|PS3
 		{17F0F184-4436-4D08-B8AA-16572EA238DB}.Release|Win32.ActiveCfg = Release|Win32
@@ -204,6 +206,7 @@ Global
 		{9C66B179-0737-4BDA-AB42-2ADE478A9008}.Release|Xbox 360.ActiveCfg = Release|Xbox 360
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|PS3.ActiveCfg = Debug|PS3
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|PS3.Build.0 = Debug|PS3
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -215,6 +218,7 @@ Global
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|Any CPU.ActiveCfg = Release|Win32
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|PS3.ActiveCfg = Release|PS3
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|PS3.Build.0 = Release|PS3
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|Win32.ActiveCfg = Release|Win32
@@ -226,6 +230,7 @@ Global
 		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|PS3.ActiveCfg = Debug|PS3
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|PS3.Build.0 = Debug|PS3
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -237,6 +242,7 @@ Global
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|Any CPU.ActiveCfg = Release|Win32
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|PS3.ActiveCfg = Release|PS3
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|PS3.Build.0 = Release|PS3
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|Win32.ActiveCfg = Release|Win32
@@ -248,6 +254,7 @@ Global
 		{83D3B207-C601-4025-8F41-01DEDC354661}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|PS3.ActiveCfg = Debug|PS3
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|PS3.Build.0 = Debug|PS3
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -259,6 +266,7 @@ Global
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|Any CPU.ActiveCfg = Release|Win32
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|PS3.ActiveCfg = Release|PS3
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|PS3.Build.0 = Release|PS3
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|Win32.ActiveCfg = Release|Win32
@@ -270,6 +278,7 @@ Global
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|PS3.ActiveCfg = Debug|PS3
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|PS3.Build.0 = Debug|PS3
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -281,6 +290,7 @@ Global
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|Any CPU.ActiveCfg = Release|Win32
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|PS3.ActiveCfg = Release|PS3
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|PS3.Build.0 = Release|PS3
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|Win32.ActiveCfg = Release|Win32
@@ -292,6 +302,7 @@ Global
 		{80F81C11-8DA2-4990-91CB-9807783BA46E}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|PS3.ActiveCfg = Debug|PS3
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|PS3.Build.0 = Debug|PS3
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -303,6 +314,7 @@ Global
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|Any CPU.ActiveCfg = Release|Win32
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|Mixed Platforms.Deploy.0 = Release|Win32
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|PS3.ActiveCfg = Release|PS3
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|PS3.Build.0 = Release|PS3
@@ -315,6 +327,7 @@ Global
 		{B92ABADC-45BE-4CC5-B724-9426053123A1}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|PS3.ActiveCfg = Debug|PS3
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|PS3.Build.0 = Debug|PS3
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -326,6 +339,7 @@ Global
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|Any CPU.ActiveCfg = Release|Win32
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|PS3.ActiveCfg = Release|PS3
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|PS3.Build.0 = Release|PS3
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|Win32.ActiveCfg = Release|Win32
@@ -337,6 +351,7 @@ Global
 		{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|PS3.ActiveCfg = Debug|PS3
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|PS3.Build.0 = Debug|PS3
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -348,6 +363,7 @@ Global
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|Any CPU.ActiveCfg = Release|Win32
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|PS3.ActiveCfg = Release|PS3
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|PS3.Build.0 = Release|PS3
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|Win32.ActiveCfg = Release|Win32
@@ -359,6 +375,7 @@ Global
 		{1C5B8702-290C-42DA-AA9E-671348F5B747}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|PS3.ActiveCfg = Debug|PS3
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|PS3.Build.0 = Debug|PS3
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -370,6 +387,7 @@ Global
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|Any CPU.ActiveCfg = Release|Win32
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|PS3.ActiveCfg = Release|PS3
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|PS3.Build.0 = Release|PS3
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|Win32.ActiveCfg = Release|Win32
@@ -381,6 +399,7 @@ Global
 		{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|PS3.ActiveCfg = Debug|PS3
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|PS3.Build.0 = Debug|PS3
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -392,6 +411,7 @@ Global
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|Any CPU.ActiveCfg = Release|Win32
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|PS3.ActiveCfg = Release|PS3
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|PS3.Build.0 = Release|PS3
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|Win32.ActiveCfg = Release|Win32
@@ -403,6 +423,7 @@ Global
 		{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|PS3.ActiveCfg = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|PS3.Build.0 = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -414,6 +435,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|Any CPU.ActiveCfg = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|PS3.ActiveCfg = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|PS3.Build.0 = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|Win32.ActiveCfg = Release|Win32
@@ -425,6 +447,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A5F40FECB52}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|PS3.ActiveCfg = Debug|PS3
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Win32.ActiveCfg = Debug|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Win32.Build.0 = Debug|Win32
@@ -433,6 +456,7 @@ Global
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Any CPU.ActiveCfg = Release|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|PS3.ActiveCfg = Release|PS3
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Win32.ActiveCfg = Release|Win32
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Win32.Build.0 = Release|Win32
@@ -441,6 +465,7 @@ Global
 		{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}.Release|Xbox 360.ActiveCfg = Release|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|PS3.ActiveCfg = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|PS3.Build.0 = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -452,6 +477,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|Any CPU.ActiveCfg = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|PS3.ActiveCfg = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|PS3.Build.0 = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|Win32.ActiveCfg = Release|Win32
@@ -463,6 +489,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A5F43FECB52}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|PS3.ActiveCfg = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|PS3.Build.0 = Debug|PS3
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -474,6 +501,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|Any CPU.ActiveCfg = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|PS3.ActiveCfg = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|PS3.Build.0 = Release|PS3
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|Win32.ActiveCfg = Release|Win32
@@ -485,6 +513,7 @@ Global
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|PS3.ActiveCfg = Debug|PS3
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|PS3.Build.0 = Debug|PS3
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -496,6 +525,7 @@ Global
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|Any CPU.ActiveCfg = Release|Win32
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|PS3.ActiveCfg = Release|PS3
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|PS3.Build.0 = Release|PS3
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|Win32.ActiveCfg = Release|Win32
@@ -507,6 +537,7 @@ Global
 		{BCEE0132-8E24-49BE-AFEB-96DAD14396BA}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|PS3.ActiveCfg = Debug|PS3
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|PS3.Build.0 = Debug|PS3
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -518,6 +549,7 @@ Global
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|Any CPU.ActiveCfg = Release|Win32
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|PS3.ActiveCfg = Release|PS3
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|PS3.Build.0 = Release|PS3
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|Win32.ActiveCfg = Release|Win32
@@ -529,6 +561,7 @@ Global
 		{A69411B3-6DE8-404E-8E70-0D3375A7492A}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|PS3.ActiveCfg = Debug|PS3
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|PS3.Build.0 = Debug|PS3
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -540,6 +573,7 @@ Global
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|Any CPU.ActiveCfg = Release|Win32
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|PS3.ActiveCfg = Release|PS3
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|PS3.Build.0 = Release|PS3
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|Win32.ActiveCfg = Release|Win32
@@ -551,6 +585,7 @@ Global
 		{C2E01551-B636-4324-8461-71811DF6FBB5}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|PS3.ActiveCfg = Debug|PS3
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|PS3.Build.0 = Debug|PS3
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -562,6 +597,7 @@ Global
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|Any CPU.ActiveCfg = Release|Win32
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|PS3.ActiveCfg = Release|PS3
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|PS3.Build.0 = Release|PS3
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|Win32.ActiveCfg = Release|Win32
@@ -573,6 +609,7 @@ Global
 		{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|Any CPU.ActiveCfg = Debug|Win32
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|PS3.ActiveCfg = Debug|PS3
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|PS3.Build.0 = Debug|PS3
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -584,6 +621,7 @@ Global
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|Any CPU.ActiveCfg = Release|Win32
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|PS3.ActiveCfg = Release|PS3
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|PS3.Build.0 = Release|PS3
 		{5A77DCDD-2CBA-43E9-8B45-00C281443F77}.Release|Win32.ActiveCfg = Release|Win32
@@ -636,8 +674,8 @@ Global
 		{834852DB-EDB6-4FD0-BCF9-45CD01126962}.Release|Xbox 360.Build.0 = Release|Xbox 360
 		{834852DB-EDB6-4FD0-BCF9-45CD01126962}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
-		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|PS3.ActiveCfg = Debug|x64
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Win32.ActiveCfg = Debug|Win32
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Win32.Build.0 = Debug|Win32
@@ -645,8 +683,8 @@ Global
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|x64.Build.0 = Debug|x64
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Debug|Xbox 360.ActiveCfg = Debug|x64
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Any CPU.ActiveCfg = Release|x64
-		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Mixed Platforms.ActiveCfg = Release|x64
-		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Mixed Platforms.Build.0 = Release|x64
+		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|PS3.ActiveCfg = Release|x64
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Win32.ActiveCfg = Release|Win32
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Win32.Build.0 = Release|Win32
@@ -654,8 +692,8 @@ Global
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|x64.Build.0 = Release|x64
 		{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Xbox 360.ActiveCfg = Release|x64
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
-		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|PS3.ActiveCfg = Debug|x64
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Win32.ActiveCfg = Debug|Win32
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Win32.Build.0 = Debug|Win32
@@ -663,8 +701,8 @@ Global
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|x64.Build.0 = Debug|x64
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Xbox 360.ActiveCfg = Debug|x64
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Any CPU.ActiveCfg = Release|x64
-		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.ActiveCfg = Release|x64
-		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.Build.0 = Release|x64
+		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|PS3.ActiveCfg = Release|x64
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Win32.ActiveCfg = Release|Win32
 		{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Win32.Build.0 = Release|Win32
@@ -688,8 +726,8 @@ Global
 		{9C66B179-0737-4BDA-AB42-2ADE478A9008} = {08C6A854-533D-4A1E-924E-C4A62281869F}
 		{EF1A4E80-63FA-4EB0-B834-12B6C500F31C} = {08C6A854-533D-4A1E-924E-C4A62281869F}
 		{17F0F184-4436-4D08-B8AA-16572EA238DB} = {2F87CEAB-4818-443C-A5E3-6C34E7D967EC}
-		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E}
 		{83D3B207-C601-4025-8F41-01DEDC354661} = {1AFD580B-98B8-4689-B661-38C41132C60E}
+		{9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E}
 		{B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {E0491194-35E3-4513-9D31-608EA3165ECF}
 		{80F81C11-8DA2-4990-91CB-9807783BA46E} = {E0491194-35E3-4513-9D31-608EA3165ECF}
 		{EE203B88-44CF-4859-9D42-7A1F43FECB52} = {E0491194-35E3-4513-9D31-608EA3165ECF}
diff --git a/src/easymesh/easymesh-parser.y b/src/easymesh/easymesh-parser.y
index 6878f1a3..a41c5396 100644
--- a/src/easymesh/easymesh-parser.y
+++ b/src/easymesh/easymesh-parser.y
@@ -44,9 +44,9 @@
 
 %token T_COLOR T_BGCOLOR
 
-%token T_TRANSLATEX T_ROTATEX T_TAPERX T_SCALEX T_MIRRORX
-%token T_TRANSLATEY T_ROTATEY T_TAPERY T_SCALEY T_MIRRORY
-%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_SCALEZ T_MIRRORZ
+%token T_TRANSLATEX T_ROTATEX T_TAPERX T_TWISTX T_SHEARX T_STRETCHX T_BENDXY T_BENDXZ T_SCALEX T_MIRRORX
+%token T_TRANSLATEY T_ROTATEY T_TAPERY T_TWISTY T_SHEARY T_STRETCHY T_BENDYX T_BENDYZ T_SCALEY T_MIRRORY
+%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_TWISTZ T_SHEARZ T_STRETCHZ T_BENDZX T_BENDZY T_SCALEZ T_MIRRORZ
 %token T_TRANSLATE T_SCALE T_TOGGLESCALEWINDING T_RADIALJITTER
 %token T_CSGUNION T_CSGSUBSTRACT T_CSGSUBSTRACTLOSS T_CSGAND T_CSGXOR
 %token T_CHAMFER
@@ -126,8 +126,29 @@ transform_command:
   | T_ROTATEY args1        { mc.m_mesh.RotateY($2.f0); }
   | T_ROTATEZ args1        { mc.m_mesh.RotateZ($2.f0); }
   | T_TAPERX args3         { mc.m_mesh.TaperX($2.f0, $2.f1, $2.f2); }
+  |  T_TAPERX args4        { mc.m_mesh.TaperX($2.f0, $2.f1, $2.f2, $2.f3); }
   | T_TAPERY args3         { mc.m_mesh.TaperY($2.f0, $2.f1, $2.f2); }
+  |  T_TAPERY args4        { mc.m_mesh.TaperY($2.f0, $2.f1, $2.f2, $2.f3); }
   | T_TAPERZ args3         { mc.m_mesh.TaperZ($2.f0, $2.f1, $2.f2); }
+  |  T_TAPERZ args4        { mc.m_mesh.TaperZ($2.f0, $2.f1, $2.f2, $2.f3); }
+  | T_TWISTX args2         { mc.m_mesh.TwistX($2.f0, $2.f1); }
+  | T_TWISTY args2         { mc.m_mesh.TwistY($2.f0, $2.f1); }
+  | T_TWISTZ args2         { mc.m_mesh.TwistZ($2.f0, $2.f1); }
+  | T_SHEARX args3         { mc.m_mesh.ShearX($2.f0, $2.f1, $2.f2); }
+  |  T_SHEARX args4        { mc.m_mesh.ShearX($2.f0, $2.f1, $2.f2, $2.f3); }
+  | T_SHEARY args3         { mc.m_mesh.ShearY($2.f0, $2.f1, $2.f2); }
+  |  T_SHEARY args4        { mc.m_mesh.ShearY($2.f0, $2.f1, $2.f2, $2.f3); }
+  | T_SHEARZ args3         { mc.m_mesh.ShearZ($2.f0, $2.f1, $2.f2); }
+  |  T_SHEARZ args4        { mc.m_mesh.ShearZ($2.f0, $2.f1, $2.f2, $2.f3); }
+  | T_STRETCHX args3       { mc.m_mesh.StretchX($2.f0, $2.f1, $2.f2); }
+  | T_STRETCHY args3       { mc.m_mesh.StretchY($2.f0, $2.f1, $2.f2); }
+  | T_STRETCHZ args3       { mc.m_mesh.StretchZ($2.f0, $2.f1, $2.f2); }
+  | T_BENDXY args2         { mc.m_mesh.BendXY($2.f0, $2.f1); }
+  | T_BENDXZ args2         { mc.m_mesh.BendXZ($2.f0, $2.f1); }
+  | T_BENDYX args2         { mc.m_mesh.BendYX($2.f0, $2.f1); }
+  | T_BENDYZ args2         { mc.m_mesh.BendYZ($2.f0, $2.f1); }
+  | T_BENDZX args2         { mc.m_mesh.BendZX($2.f0, $2.f1); }
+  | T_BENDZY args2         { mc.m_mesh.BendZY($2.f0, $2.f1); }
   | T_SCALEX args1         { mc.m_mesh.Scale(vec3($2.f0, 1.0, 1.0)); }
   | T_SCALEY args1         { mc.m_mesh.Scale(vec3(1.0, $2.f0, 1.0)); }
   | T_SCALEZ args1         { mc.m_mesh.Scale(vec3(1.0, 1.0, $2.f0)); }
diff --git a/src/easymesh/easymesh-scanner.l b/src/easymesh/easymesh-scanner.l
index 104a66a0..d47230e7 100644
--- a/src/easymesh/easymesh-scanner.l
+++ b/src/easymesh/easymesh-scanner.l
@@ -62,6 +62,21 @@ rz    { return token::T_ROTATEZ; }
 tax   { return token::T_TAPERX; }
 tay   { return token::T_TAPERY; }
 taz   { return token::T_TAPERZ; }
+twx   { return token::T_TWISTX; }
+twy   { return token::T_TWISTY; }
+twz   { return token::T_TWISTZ; }
+shx   { return token::T_SHEARX; }
+shy   { return token::T_SHEARY; }
+shz   { return token::T_SHEARZ; }
+stx   { return token::T_STRETCHX; }
+sty   { return token::T_STRETCHY; }
+stz   { return token::T_STRETCHZ; }
+bdxy  { return token::T_BENDXY; }
+bdxz  { return token::T_BENDXZ; }
+bdyx  { return token::T_BENDYX; }
+bdyz  { return token::T_BENDYZ; }
+bdzx  { return token::T_BENDZX; }
+bdzy  { return token::T_BENDZY; }
 sx    { return token::T_SCALEX; }
 sy    { return token::T_SCALEY; }
 sz    { return token::T_SCALEZ; }
diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp
index af794032..e0f8a491 100644
--- a/src/easymesh/easymesh.cpp
+++ b/src/easymesh/easymesh.cpp
@@ -929,34 +929,78 @@ void EasyMesh::RadialJitter(float r)
 }
 
 //-----------------------------------------------------------------------------
-void EasyMesh::TaperX(float y, float z, float xoff)
-{
-    /* FIXME: this code breaks normals! */
-    for (int i = m_cursors.Last().m1; i < m_vert.Count(); i++)
-    {
-        m_vert[i].m1.y *= 1.f + (y * abs(m_vert[i].m1.x) + xoff);
-        m_vert[i].m1.z *= 1.f + (z * abs(m_vert[i].m1.x) + xoff);
-    }
-}
+void EasyMesh::TaperX(float ny, float nz, float xoff, int absolute) { DoMeshTransform(MeshTransform::Taper, Axis::X, Axis::X, ny, nz, xoff, absolute); }
+void EasyMesh::TaperY(float nx, float nz, float yoff, int absolute) { DoMeshTransform(MeshTransform::Taper, Axis::Y, Axis::Y, nz, nx, yoff, absolute); }
+void EasyMesh::TaperZ(float nx, float ny, float zoff, int absolute) { DoMeshTransform(MeshTransform::Taper, Axis::Z, Axis::Z, nx, ny, zoff, absolute); }
 
 //-----------------------------------------------------------------------------
-void EasyMesh::TaperY(float x, float z, float yoff)
-{
-    for (int i = m_cursors.Last().m1; i < m_vert.Count(); i++)
-    {
-        m_vert[i].m1.x *= 1.f + (x * abs(m_vert[i].m1.y) + yoff);
-        m_vert[i].m1.z *= 1.f + (z * abs(m_vert[i].m1.y) + yoff);
-    }
-}
+void EasyMesh::TwistX(float t, float toff) { DoMeshTransform(MeshTransform::Twist, Axis::X, Axis::X, t, t, toff, 0); }
+void EasyMesh::TwistY(float t, float toff) { DoMeshTransform(MeshTransform::Twist, Axis::Y, Axis::Y, t, t, toff, 0); }
+void EasyMesh::TwistZ(float t, float toff) { DoMeshTransform(MeshTransform::Twist, Axis::Z, Axis::Z, t, t, toff, 0); }
+
+//-----------------------------------------------------------------------------
+void EasyMesh::ShearX(float ny, float nz, float xoff, int absolute) { DoMeshTransform(MeshTransform::Shear, Axis::X, Axis::X, ny, nz, xoff, absolute); }
+void EasyMesh::ShearY(float nx, float nz, float yoff, int absolute) { DoMeshTransform(MeshTransform::Shear, Axis::Y, Axis::Y, nz, nx, yoff, absolute); }
+void EasyMesh::ShearZ(float nx, float ny, float zoff, int absolute) { DoMeshTransform(MeshTransform::Shear, Axis::Z, Axis::Z, nx, ny, zoff, absolute); }
+
+//-----------------------------------------------------------------------------
+void EasyMesh::StretchX(float ny, float nz, float xoff) { DoMeshTransform(MeshTransform::Stretch, Axis::X, Axis::X, ny, nz, xoff, 0); }
+void EasyMesh::StretchY(float nx, float nz, float yoff) { DoMeshTransform(MeshTransform::Stretch, Axis::Y, Axis::Y, nz, nx, yoff, 0); }
+void EasyMesh::StretchZ(float nx, float ny, float zoff) { DoMeshTransform(MeshTransform::Stretch, Axis::Z, Axis::Z, nx, ny, zoff, 0); }
+
+//-----------------------------------------------------------------------------
+void EasyMesh::BendXY(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::X, Axis::Y, t, t, toff, 0); }
+void EasyMesh::BendXZ(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::X, Axis::Z, t, t, toff, 0); }
+void EasyMesh::BendYX(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::Y, Axis::X, t, t, toff, 0); }
+void EasyMesh::BendYZ(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::Y, Axis::Z, t, t, toff, 0); }
+void EasyMesh::BendZX(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::Z, Axis::X, t, t, toff, 0); }
+void EasyMesh::BendZY(float t, float toff) { DoMeshTransform(MeshTransform::Bend, Axis::Z, Axis::Y, t, t, toff, 0); }
 
 //-----------------------------------------------------------------------------
-void EasyMesh::TaperZ(float x, float y, float zoff)
+void EasyMesh::DoMeshTransform(MeshTransform ct, Axis axis0, Axis axis1, float n0, float n1, float noff, int absolute)
 {
     for (int i = m_cursors.Last().m1; i < m_vert.Count(); i++)
     {
-        m_vert[i].m1.x *= 1.f + (x * abs(m_vert[i].m1.z) + zoff);
-        m_vert[i].m1.y *= 1.f + (y * abs(m_vert[i].m1.z) + zoff);
+        switch (ct)
+        {
+            case MeshTransform::Taper:
+            {
+                float value = m_vert[i].m1[axis0];
+                if (absolute) value = abs(value);
+                m_vert[i].m1[(axis0 + 1) % 3] *= max(0.f, 1.f + (n0 * value + noff));
+                m_vert[i].m1[(axis0 + 2) % 3] *= max(0.f, 1.f + (n1 * value + noff));
+                break;
+            }
+            case MeshTransform::Twist:
+            {
+                vec3 rotaxis = vec3(1.f); rotaxis[(axis0 + 1) % 3] = .0f; rotaxis[(axis0 + 2) % 3] = .0f;
+                m_vert[i].m1 = mat3::rotate(m_vert[i].m1[axis0] * n0 + noff, rotaxis) * m_vert[i].m1;
+                break;
+            }
+            case MeshTransform::Shear:
+            {
+                float value = m_vert[i].m1[axis0];
+                if (absolute) value = abs(value);
+                m_vert[i].m1[(axis0 + 1) % 3] += (n0 * value + noff);
+                m_vert[i].m1[(axis0 + 2) % 3] += (n1 * value + noff);
+                break;
+            }
+            case MeshTransform::Stretch:
+            {
+                //float value = abs(m_vert[i].m1[axis0]);
+                //m_vert[i].m1[(axis0 + 1) % 3] += (lol::pow(value, n0) + noff);
+                //m_vert[i].m1[(axis0 + 2) % 3] += (lol::pow(value, n1) + noff);
+                break;
+            }
+            case MeshTransform::Bend:
+            {
+                vec3 rotaxis = vec3(1.f); rotaxis[(axis1 + 1) % 3] = .0f; rotaxis[(axis1 + 2) % 3] = .0f;
+                m_vert[i].m1 = mat3::rotate(m_vert[i].m1[axis0] * n0 + noff, rotaxis) * m_vert[i].m1;
+                break;
+            }
+        }
     }
+    ComputeNormals(m_cursors.Last().m2, m_indices.Count() - m_cursors.Last().m2);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h
index f8db5ee1..75a72d9e 100644
--- a/src/easymesh/easymesh.h
+++ b/src/easymesh/easymesh.h
@@ -78,6 +78,20 @@ private:
     Array<int>              master_list;
 };
 
+struct Axis
+{
+    enum Value
+    {
+        X,
+        Y,
+        Z
+    }
+    m_value;
+
+    inline Axis(Value v) : m_value(v) {}
+    inline operator Value() { return m_value; }
+};
+
 struct MeshBuildOperation
 {
     enum Value
@@ -184,28 +198,81 @@ public:
         - r : jitter maximum value.
      */
     void RadialJitter(float r);
-    //TODO : twist
-    //TODO : bend
-    //TODO : stretch
-    //TODO : shear
-    /* [cmd:tax] multiply y&z by (1.0 + (n * x + xoff))
-        - y : value of n for y.
-        - z : value of n for z.
+    /* [cmd:tax] multiply axis y&z by x as y *= (1.0 + (ny * x + xoff))
+        - ny : value of n for y.
+        - nz : value of n for z.
         - xoff : value of xoff.
+        - absolute (def:1) : if (1) Multiply will use an absolute x.
+     */
+    void TaperX(float ny, float nz, float xoff, int absolute=1);
+    /* [cmd:tay] Same as TaperX, with Y */
+    void TaperY(float nx, float nz, float yoff, int absolute=1);
+    /* [cmd:taz] Same as TaperX, with Z */
+    void TaperZ(float nx, float ny, float zoff, int absolute=1);
+    /* [cmd:twx] Twist vertices around x axis with x as rotation value as p = (RotateX(x * t + toff) * p)
+        - t : Angle multiplier.
+        - toff : Applied offset.
+     */
+    void TwistX(float t, float toff);
+    /* [cmd:twy] Same as TwistX, with Y */
+    void TwistY(float t, float toff);
+    /* [cmd:twz] Same as TwistX, with Z */
+    void TwistZ(float t, float toff);
+    /* [cmd:shx] Shear vertices using x value as shear quantity as y += (ny * x + xoff)
+        - ny : Value of n for y.
+        - nz : Value of n for z.
+        - xoff : Value of xoff.
+        - absolute (def:1) : if (1) Multiply will use an absolute x.
      */
-    void TaperX(float y, float z, float xoff);
-    /* [cmd:tay] multiply x&z by (1.0 + (n * y + yoff))
-        - x : value of n for x.
-        - z : value of n for z.
-        - yoff : value of yoff.
+    void ShearX(float ny, float nz, float xoff, int absolute=1);
+    /* [cmd:shy] Same as ShearX, with Y */
+    void ShearY(float nx, float nz, float yoff, int absolute=1);
+    /* [cmd:shz] Same as ShearX, with Z */
+    void ShearZ(float nx, float ny, float zoff, int absolute=1);
+    /* [cmd:stx] Stretch vertices using x value as stretch quantity as y += (pow(x, ny) + xoff)
+        - ny : Value of n for y.
+        - nz : Value of n for z.
+        - xoff : Value of xoff.
      */
-    void TaperY(float x, float z, float yoff);
-    /* [cmd:taz] multiply x&y by (1.0 + (n * z + zoff))
-        - x : value of n for x.
-        - y : value of n for y.
-        - zoff : value of zoff.
+    void StretchX(float ny, float nz, float xoff);
+    /* [cmd:sty] Same as StretchX, with Y */
+    void StretchY(float nx, float nz, float yoff);
+    /* [cmd:stz] Same as StretchX, with Z */
+    void StretchZ(float nx, float ny, float zoff);
+    /* [cmd:bdxy] Bend vertices using x as bend quantity along y axis using p = (RotateY(x * t + toff) * p)
+        - t : Angle multiplier.
+        - xoff : Applied offset.
      */
-    void TaperZ(float x, float y, float zoff);
+    void BendXY(float t, float toff);
+    /* [cmd:bdxz] Same as BendXY, with X & Z */
+    void BendXZ(float t, float toff);
+    /* [cmd:bdyx] Same as BendXY, with Y & X */
+    void BendYX(float t, float toff);
+    /* [cmd:bdyz] Same as BendXY, with Y & Z */
+    void BendYZ(float t, float toff);
+    /* [cmd:bdzx] Same as BendXY, with Z & X */
+    void BendZX(float t, float toff);
+    /* [cmd:bdzy] Same as BendXY, with Z & Y */
+    void BendZY(float t, float toff);
+private:
+    struct MeshTransform
+    {
+        enum Value
+        {
+            Taper,
+            Twist,
+            Bend,
+            Stretch,
+            Shear
+        }
+        m_value;
+
+        inline MeshTransform(Value v) : m_value(v) {}
+        inline operator Value() { return m_value; }
+    };
+
+    void DoMeshTransform(MeshTransform ct, Axis axis0, Axis axis1, float n0, float n1, float noff, int absolute);
+public:
     /* [cmd:s/sx/sy/sz] Scale vertices
         - s : scale quantity.
      */
diff --git a/src/generated/easymesh-parser.cpp b/src/generated/easymesh-parser.cpp
index 7f536458..87aadac4 100644
--- a/src/generated/easymesh-parser.cpp
+++ b/src/generated/easymesh-parser.cpp
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.4.2.  */
 
 /* Skeleton implementation for Bison LALR(1) parsers in C++
    
-      Copyright (C) 2002-2011 Free Software Foundation, Inc.
+      Copyright (C) 2002-2010 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -546,310 +546,457 @@ namespace lol {
 
 /* Line 677 of lalr1.cc  */
 #line 129 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.TaperY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
+    { mc.m_mesh.TaperX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 28:
 
 /* Line 677 of lalr1.cc  */
 #line 130 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.TaperZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
+    { mc.m_mesh.TaperY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 29:
 
 /* Line 677 of lalr1.cc  */
 #line 131 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.Scale(vec3((yysemantic_stack_[(2) - (2)].args).f0, 1.0, 1.0)); }
+    { mc.m_mesh.TaperY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 30:
 
 /* Line 677 of lalr1.cc  */
 #line 132 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.Scale(vec3(1.0, (yysemantic_stack_[(2) - (2)].args).f0, 1.0)); }
+    { mc.m_mesh.TaperZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 31:
 
 /* Line 677 of lalr1.cc  */
 #line 133 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.Scale(vec3(1.0, 1.0, (yysemantic_stack_[(2) - (2)].args).f0)); }
+    { mc.m_mesh.TaperZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 32:
 
 /* Line 677 of lalr1.cc  */
 #line 134 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.Scale(vec3((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2)); }
+    { mc.m_mesh.TwistX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
   case 33:
 
 /* Line 677 of lalr1.cc  */
 #line 135 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.MirrorX(); }
+    { mc.m_mesh.TwistY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
   case 34:
 
 /* Line 677 of lalr1.cc  */
 #line 136 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.MirrorY(); }
+    { mc.m_mesh.TwistZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
   case 35:
 
 /* Line 677 of lalr1.cc  */
 #line 137 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.MirrorZ(); }
+    { mc.m_mesh.ShearX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 36:
 
 /* Line 677 of lalr1.cc  */
 #line 138 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.RadialJitter((yysemantic_stack_[(2) - (2)].args).f0); }
+    { mc.m_mesh.ShearX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 37:
 
 /* Line 677 of lalr1.cc  */
 #line 139 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.ToggleScaleWinding(); }
+    { mc.m_mesh.ShearY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 38:
 
 /* Line 677 of lalr1.cc  */
 #line 140 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.CsgUnion(); }
+    { mc.m_mesh.ShearY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 39:
 
 /* Line 677 of lalr1.cc  */
 #line 141 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.CsgSubstract(); }
+    { mc.m_mesh.ShearZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 40:
 
 /* Line 677 of lalr1.cc  */
 #line 142 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.CsgSubstractLoss(); }
+    { mc.m_mesh.ShearZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
   case 41:
 
 /* Line 677 of lalr1.cc  */
 #line 143 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.CsgAnd(); }
+    { mc.m_mesh.StretchX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 42:
 
 /* Line 677 of lalr1.cc  */
 #line 144 "easymesh/easymesh-parser.y"
-    { mc.m_mesh.CsgXor(); }
+    { mc.m_mesh.StretchY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
   case 43:
 
+/* Line 677 of lalr1.cc  */
+#line 145 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.StretchZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
+    break;
+
+  case 44:
+
+/* Line 677 of lalr1.cc  */
+#line 146 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendXY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 45:
+
+/* Line 677 of lalr1.cc  */
+#line 147 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendXZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 46:
+
 /* Line 677 of lalr1.cc  */
 #line 148 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendYX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 47:
+
+/* Line 677 of lalr1.cc  */
+#line 149 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendYZ((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 48:
+
+/* Line 677 of lalr1.cc  */
+#line 150 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendZX((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 49:
+
+/* Line 677 of lalr1.cc  */
+#line 151 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.BendZY((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
+    break;
+
+  case 50:
+
+/* Line 677 of lalr1.cc  */
+#line 152 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.Scale(vec3((yysemantic_stack_[(2) - (2)].args).f0, 1.0, 1.0)); }
+    break;
+
+  case 51:
+
+/* Line 677 of lalr1.cc  */
+#line 153 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.Scale(vec3(1.0, (yysemantic_stack_[(2) - (2)].args).f0, 1.0)); }
+    break;
+
+  case 52:
+
+/* Line 677 of lalr1.cc  */
+#line 154 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.Scale(vec3(1.0, 1.0, (yysemantic_stack_[(2) - (2)].args).f0)); }
+    break;
+
+  case 53:
+
+/* Line 677 of lalr1.cc  */
+#line 155 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.Scale(vec3((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2)); }
+    break;
+
+  case 54:
+
+/* Line 677 of lalr1.cc  */
+#line 156 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.MirrorX(); }
+    break;
+
+  case 55:
+
+/* Line 677 of lalr1.cc  */
+#line 157 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.MirrorY(); }
+    break;
+
+  case 56:
+
+/* Line 677 of lalr1.cc  */
+#line 158 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.MirrorZ(); }
+    break;
+
+  case 57:
+
+/* Line 677 of lalr1.cc  */
+#line 159 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.RadialJitter((yysemantic_stack_[(2) - (2)].args).f0); }
+    break;
+
+  case 58:
+
+/* Line 677 of lalr1.cc  */
+#line 160 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.ToggleScaleWinding(); }
+    break;
+
+  case 59:
+
+/* Line 677 of lalr1.cc  */
+#line 161 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.CsgUnion(); }
+    break;
+
+  case 60:
+
+/* Line 677 of lalr1.cc  */
+#line 162 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.CsgSubstract(); }
+    break;
+
+  case 61:
+
+/* Line 677 of lalr1.cc  */
+#line 163 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.CsgSubstractLoss(); }
+    break;
+
+  case 62:
+
+/* Line 677 of lalr1.cc  */
+#line 164 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.CsgAnd(); }
+    break;
+
+  case 63:
+
+/* Line 677 of lalr1.cc  */
+#line 165 "easymesh/easymesh-parser.y"
+    { mc.m_mesh.CsgXor(); }
+    break;
+
+  case 64:
+
+/* Line 677 of lalr1.cc  */
+#line 169 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendCylinder((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                                  (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3,
                                                  (int)(yysemantic_stack_[(2) - (2)].args).f4, (int)(yysemantic_stack_[(2) - (2)].args).f5, 0); }
     break;
 
-  case 44:
+  case 65:
 
 /* Line 677 of lalr1.cc  */
-#line 151 "easymesh/easymesh-parser.y"
+#line 172 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendCylinder((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                                  (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3,
                                                  (int)(yysemantic_stack_[(2) - (2)].args).f4, (int)(yysemantic_stack_[(2) - (2)].args).f5, (int)(yysemantic_stack_[(2) - (2)].args).f6); }
     break;
 
-  case 45:
+  case 66:
 
 /* Line 677 of lalr1.cc  */
-#line 154 "easymesh/easymesh-parser.y"
+#line 175 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendBox(vec3((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2)); }
     break;
 
-  case 46:
+  case 67:
 
 /* Line 677 of lalr1.cc  */
-#line 155 "easymesh/easymesh-parser.y"
+#line 176 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendSmoothChamfBox(vec3((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                                             (yysemantic_stack_[(2) - (2)].args).f2), (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
-  case 47:
+  case 68:
 
 /* Line 677 of lalr1.cc  */
-#line 157 "easymesh/easymesh-parser.y"
+#line 178 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendFlatChamfBox(vec3((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                                           (yysemantic_stack_[(2) - (2)].args).f2), (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
-  case 48:
+  case 69:
 
 /* Line 677 of lalr1.cc  */
-#line 159 "easymesh/easymesh-parser.y"
+#line 180 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendSphere((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
-  case 49:
+  case 70:
 
 /* Line 677 of lalr1.cc  */
-#line 160 "easymesh/easymesh-parser.y"
+#line 181 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendCapsule((yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
-  case 50:
+  case 71:
 
 /* Line 677 of lalr1.cc  */
-#line 161 "easymesh/easymesh-parser.y"
+#line 182 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendTorus((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
-  case 51:
+  case 72:
 
 /* Line 677 of lalr1.cc  */
-#line 162 "easymesh/easymesh-parser.y"
+#line 183 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendStar((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (yysemantic_stack_[(2) - (2)].args).f2,
                                              (int)(yysemantic_stack_[(2) - (2)].args).f3, (int)(yysemantic_stack_[(2) - (2)].args).f4); }
     break;
 
-  case 52:
+  case 73:
 
 /* Line 677 of lalr1.cc  */
-#line 164 "easymesh/easymesh-parser.y"
+#line 185 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendExpandedStar((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                                      (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3); }
     break;
 
-  case 53:
+  case 74:
 
 /* Line 677 of lalr1.cc  */
-#line 166 "easymesh/easymesh-parser.y"
+#line 187 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendDisc((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1, (int)(yysemantic_stack_[(2) - (2)].args).f2); }
     break;
 
-  case 54:
+  case 75:
 
 /* Line 677 of lalr1.cc  */
-#line 167 "easymesh/easymesh-parser.y"
+#line 188 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendSimpleTriangle((yysemantic_stack_[(2) - (2)].args).f0, (int)(yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
-  case 55:
+  case 76:
 
 /* Line 677 of lalr1.cc  */
-#line 168 "easymesh/easymesh-parser.y"
+#line 189 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendSimpleQuad((yysemantic_stack_[(2) - (2)].args).f0, (int)(yysemantic_stack_[(2) - (2)].args).f1); }
     break;
 
-  case 56:
+  case 77:
 
 /* Line 677 of lalr1.cc  */
-#line 169 "easymesh/easymesh-parser.y"
+#line 190 "easymesh/easymesh-parser.y"
     { mc.m_mesh.AppendCog((int)(yysemantic_stack_[(2) - (2)].args).f0, (yysemantic_stack_[(2) - (2)].args).f1,
                                  (yysemantic_stack_[(2) - (2)].args).f2, (yysemantic_stack_[(2) - (2)].args).f3, (yysemantic_stack_[(2) - (2)].args).f4, (yysemantic_stack_[(2) - (2)].args).f5, (yysemantic_stack_[(2) - (2)].args).f6,
                                  (yysemantic_stack_[(2) - (2)].args).f7, (yysemantic_stack_[(2) - (2)].args).f8, (int)(yysemantic_stack_[(2) - (2)].args).f9); }
     break;
 
-  case 57:
+  case 78:
 
 /* Line 677 of lalr1.cc  */
-#line 174 "easymesh/easymesh-parser.y"
+#line 195 "easymesh/easymesh-parser.y"
     { (yyval.args).f0 = (yysemantic_stack_[(1) - (1)].fval); }
     break;
 
-  case 58:
+  case 79:
 
 /* Line 677 of lalr1.cc  */
-#line 175 "easymesh/easymesh-parser.y"
+#line 196 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f1 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 59:
+  case 80:
 
 /* Line 677 of lalr1.cc  */
-#line 176 "easymesh/easymesh-parser.y"
+#line 197 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f2 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 60:
+  case 81:
 
 /* Line 677 of lalr1.cc  */
-#line 177 "easymesh/easymesh-parser.y"
+#line 198 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f3 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 61:
+  case 82:
 
 /* Line 677 of lalr1.cc  */
-#line 178 "easymesh/easymesh-parser.y"
+#line 199 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f4 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 62:
+  case 83:
 
 /* Line 677 of lalr1.cc  */
-#line 179 "easymesh/easymesh-parser.y"
+#line 200 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f5 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 63:
+  case 84:
 
 /* Line 677 of lalr1.cc  */
-#line 180 "easymesh/easymesh-parser.y"
+#line 201 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f6 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 64:
+  case 85:
 
 /* Line 677 of lalr1.cc  */
-#line 181 "easymesh/easymesh-parser.y"
+#line 202 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f7 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 65:
+  case 86:
 
 /* Line 677 of lalr1.cc  */
-#line 182 "easymesh/easymesh-parser.y"
+#line 203 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f8 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 66:
+  case 87:
 
 /* Line 677 of lalr1.cc  */
-#line 183 "easymesh/easymesh-parser.y"
+#line 204 "easymesh/easymesh-parser.y"
     { (yyval.args) = (yysemantic_stack_[(2) - (1)].args); (yyval.args).f9 = (yysemantic_stack_[(2) - (2)].fval); }
     break;
 
-  case 67:
+  case 88:
 
 /* Line 677 of lalr1.cc  */
-#line 186 "easymesh/easymesh-parser.y"
+#line 207 "easymesh/easymesh-parser.y"
     { (yyval.fval) = (yysemantic_stack_[(1) - (1)].fval); }
     break;
 
-  case 68:
+  case 89:
 
 /* Line 677 of lalr1.cc  */
-#line 187 "easymesh/easymesh-parser.y"
+#line 208 "easymesh/easymesh-parser.y"
     { (yyval.fval) = -(yysemantic_stack_[(2) - (2)].fval); }
     break;
 
 
 
 /* Line 677 of lalr1.cc  */
-#line 853 "generated/easymesh-parser.cpp"
+#line 1000 "generated/easymesh-parser.cpp"
 	default:
           break;
       }
@@ -1054,22 +1201,25 @@ namespace lol {
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
-  const signed char EasyMeshParser::yypact_ninf_ = -10;
+  const signed char EasyMeshParser::yypact_ninf_ = -69;
   const signed char
   EasyMeshParser::yypact_[] =
   {
-        -3,    29,    31,    16,    16,    16,    16,   -10,    16,    16,
-      16,    16,   -10,    16,    16,    16,    16,   -10,    16,    16,
-     -10,    16,   -10,   -10,   -10,   -10,   -10,    16,    16,    16,
-      16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
-      16,   -10,    42,    50,    -3,    -3,    83,   -10,   -10,   -10,
-     -10,   -10,   -10,    16,    16,    16,    16,   -10,   -10,   -10,
-     -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,
-     -10,   -10,   -10,   -10,   -10,   -10,   -10,    16,    16,    16,
-     -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,
-     -10,    16,    16,    16,    16,   -10,   -10,   -10,   -10,   -10,
-       5,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,
-     -10,   -10,   -10,   -10
+        60,   -40,   -23,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -69,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -69,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -69,   -47,   -47,   -69,   -47,   -69,   -69,   -69,
+     -69,   -69,   -47,   -47,   -47,   -47,   -47,   -47,   -47,   -47,
+     -47,   -47,   -47,   -47,   -47,   -47,   -69,     4,     6,    60,
+      60,   119,   -69,   -69,   -69,   -69,   -69,   -69,   -47,   -47,
+     -47,   -47,   -69,   -69,   -69,   -69,   -69,   -69,   -47,   -69,
+     -69,   -47,   -69,   -69,   -69,   -69,   -69,   -69,   -69,   -47,
+     -69,   -69,   -47,   -69,   -69,   -69,   -69,   -69,   -69,   -69,
+     -47,   -69,   -69,   -47,   -69,   -69,   -69,   -69,   -69,   -69,
+     -69,   -69,   -69,   -47,   -47,   -47,   -69,   -69,   -69,   -69,
+     -69,   -69,   -69,   -69,   -69,   -69,   -69,   -47,   -47,   -47,
+     -47,   -69,   -69,   -69,   -69,   -69,   -53,   -69,   -69,   -69,
+     -69,   -69,   -69,   -69,   -69,   -69,   -69,   -69,   -69,   -69
   };
 
   /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
@@ -1078,36 +1228,39 @@ namespace lol {
   const unsigned char
   EasyMeshParser::yydefact_[] =
   {
-         0,     0,     0,     0,     0,     0,     0,    33,     0,     0,
-       0,     0,    34,     0,     0,     0,     0,    35,     0,     0,
-      37,     0,    38,    39,    40,    41,    42,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     7,     0,     0,     3,     0,     5,     9,    11,    12,
-      13,    67,    15,     0,     0,     0,     0,    14,    57,    17,
-      16,    19,    23,    26,    29,    20,    24,    27,    30,    21,
-      25,    28,    31,    22,    32,    36,    18,     0,     0,    43,
-      44,    45,    46,    47,    48,    49,    51,    52,    53,    54,
-      55,     0,     0,     0,     0,    56,    50,     1,     2,     4,
-       0,    10,    68,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,     8,     6
+         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    54,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    55,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    56,     0,     0,    58,     0,    59,    60,    61,
+      62,    63,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     7,     0,     0,     3,
+       0,     5,     9,    11,    12,    13,    88,    15,     0,     0,
+       0,     0,    14,    78,    17,    16,    19,    23,    26,    27,
+      32,    35,    36,    41,    44,    45,    50,    20,    24,    28,
+      29,    33,    37,    38,    42,    46,    47,    51,    21,    25,
+      30,    31,    34,    39,    40,    43,    48,    49,    52,    22,
+      53,    57,    18,     0,     0,    64,    65,    66,    67,    68,
+      69,    70,    72,    73,    74,    75,    76,     0,     0,     0,
+       0,    77,    71,     1,     2,     4,     0,    10,    89,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,     8,     6
   };
 
   /* YYPGOTO[NTERM-NUM].  */
   const short int
   EasyMeshParser::yypgoto_[] =
   {
-       -10,   -10,    -4,   -10,   -10,   -10,   -10,     9,   -10,   -10,
-     -10,    45,    25,   121,   128,    33,    26,    32,   -10,   -10,
-     -10,    -9
+       -69,   -69,   -30,   -69,   -69,   -69,   -69,   -50,   -69,   -69,
+     -69,   224,   178,     0,   176,   -35,   -32,   -28,   -69,   -69,
+     -69,   -68
   };
 
   /* YYDEFGOTO[NTERM-NUM].  */
-  const signed char
+  const short int
   EasyMeshParser::yydefgoto_[] =
   {
-        -1,    42,    43,    44,    45,   113,    46,    47,    48,    49,
-      50,    54,    55,    56,    77,    78,    79,    80,    93,    94,
-      95,    58
+        -1,    57,    58,    59,    60,   149,    61,    62,    63,    64,
+      65,    69,    70,    71,   113,   114,   115,   116,   129,   130,
+     131,    73
   };
 
   /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1117,46 +1270,66 @@ namespace lol {
   const unsigned char
   EasyMeshParser::yytable_[] =
   {
-         1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      99,   100,    97,    41,   102,   103,   104,   105,    61,    62,
-      98,    64,   112,    65,    66,   101,    68,    84,    69,    70,
-      51,    72,    89,    90,    53,    91,    75,    86,   106,   107,
-     108,    92,    76,    51,    52,    51,    59,    53,     0,    53,
-       0,     0,   108,   109,   110,   111,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    63,     0,     0,    57,
-      60,    67,     0,     0,     0,     0,    71,     0,     0,    73,
-      74,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      81,     0,     0,     0,    85,     0,     0,    88,    82,    83,
-       0,    96,     0,    87
+       138,   139,   140,   141,   133,    78,   134,    81,    83,   148,
+     141,   137,    66,   141,   122,    89,    68,    92,    94,    66,
+      67,   141,   127,    68,   141,   100,   128,   103,   105,   135,
+     136,     0,   141,   109,   110,   141,    66,    74,     0,     0,
+      68,     0,     0,     0,   117,   142,   143,   144,   121,     0,
+       0,   124,     0,     0,     0,   132,     0,     0,     0,   144,
+     145,   146,   147,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,     0,
+       0,    56,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    72,    75,     0,
+       0,    79,     0,    82,    80,     0,     0,    84,    85,     0,
+       0,    90,     0,    93,    91,     0,     0,    95,    96,     0,
+       0,   101,     0,   104,   102,     0,     0,   106,   107,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   118,   119,     0,     0,   120,   123,    76,    77,     0,
+     125,   126,     0,     0,     0,    86,     0,    87,    88,     0,
+       0,     0,     0,     0,     0,    97,     0,    98,    99,     0,
+       0,     0,     0,     0,     0,   108,     0,     0,     0,     0,
+     111,     0,     0,     0,     0,     0,   112
   };
 
   /* YYCHECK.  */
-  const signed char
+  const short int
   EasyMeshParser::yycheck_[] =
   {
-         3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      44,    45,     0,    46,    53,    54,    55,    56,     3,     4,
-       0,     6,    47,     8,     9,    46,    11,    32,    13,    14,
-      44,    16,    37,    38,    48,    39,    21,    34,    77,    78,
-      79,    39,    27,    44,    45,    44,    45,    48,    -1,    48,
-      -1,    -1,    91,    92,    93,    94,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,     5,    -1,    -1,     1,
-       2,    10,    -1,    -1,    -1,    -1,    15,    -1,    -1,    18,
-      19,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      29,    -1,    -1,    -1,    33,    -1,    -1,    36,    30,    31,
-      -1,    40,    -1,    35
+        68,    69,    70,    71,     0,     5,     0,     7,     8,    62,
+      78,    61,    59,    81,    49,    15,    63,    17,    18,    59,
+      60,    89,    54,    63,    92,    25,    54,    27,    28,    59,
+      60,    -1,   100,    33,    34,   103,    59,    60,    -1,    -1,
+      63,    -1,    -1,    -1,    44,   113,   114,   115,    48,    -1,
+      -1,    51,    -1,    -1,    -1,    55,    -1,    -1,    -1,   127,
+     128,   129,   130,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    -1,    -1,
+      -1,    61,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,     1,     2,    -1,
+      -1,     5,    -1,     7,     6,    -1,    -1,     9,    10,    -1,
+      -1,    15,    -1,    17,    16,    -1,    -1,    19,    20,    -1,
+      -1,    25,    -1,    27,    26,    -1,    -1,    29,    30,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    45,    46,    -1,    -1,    47,    50,     3,     4,    -1,
+      52,    53,    -1,    -1,    -1,    11,    -1,    13,    14,    -1,
+      -1,    -1,    -1,    -1,    -1,    21,    -1,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,
+      36,    -1,    -1,    -1,    -1,    -1,    42
   };
 
   /* STOS_[STATE-NUM] -- The (internal number of the) accessing
@@ -1168,14 +1341,17 @@ namespace lol {
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    46,    50,    51,    52,    53,    55,    56,    57,    58,
-      59,    44,    45,    48,    60,    61,    62,    63,    70,    45,
-      63,    60,    60,    62,    60,    60,    60,    62,    60,    60,
-      60,    62,    60,    62,    62,    60,    60,    63,    64,    65,
-      66,    62,    63,    63,    61,    62,    64,    63,    62,    61,
-      61,    65,    66,    67,    68,    69,    62,     0,     0,    51,
-      51,    56,    70,    70,    70,    70,    70,    70,    70,    70,
-      70,    70,    47,    54
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    61,    65,    66,    67,
+      68,    70,    71,    72,    73,    74,    59,    60,    63,    75,
+      76,    77,    78,    85,    60,    78,    75,    75,    77,    78,
+      76,    77,    78,    77,    76,    76,    75,    75,    75,    77,
+      78,    76,    77,    78,    77,    76,    76,    75,    75,    75,
+      77,    78,    76,    77,    78,    77,    76,    76,    75,    77,
+      77,    75,    75,    78,    79,    80,    81,    77,    78,    78,
+      76,    77,    79,    78,    77,    76,    76,    80,    81,    82,
+      83,    84,    77,     0,     0,    66,    66,    71,    85,    85,
+      85,    85,    85,    85,    85,    85,    85,    85,    62,    69
   };
 
 #if YYDEBUG
@@ -1188,7 +1364,9 @@ namespace lol {
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300,    91,    93,    45
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,    91,    93,    45
   };
 #endif
 
@@ -1196,13 +1374,15 @@ namespace lol {
   const unsigned char
   EasyMeshParser::yyr1_[] =
   {
-         0,    49,    50,    51,    51,    52,    52,    53,    54,    55,
-      55,    56,    56,    56,    57,    57,    57,    57,    58,    58,
-      58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
-      58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
-      58,    58,    58,    59,    59,    59,    59,    59,    59,    59,
-      59,    59,    59,    59,    59,    59,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    70
+         0,    64,    65,    66,    66,    67,    67,    68,    69,    70,
+      70,    71,    71,    71,    72,    72,    72,    72,    73,    73,
+      73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
+      73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
+      73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
+      73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
+      73,    73,    73,    73,    74,    74,    74,    74,    74,    74,
+      74,    74,    74,    74,    74,    74,    74,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    85
   };
 
   /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1212,10 +1392,12 @@ namespace lol {
          0,     2,     2,     1,     2,     1,     3,     1,     1,     1,
        2,     1,     1,     1,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     1,     1,     1,     2,     1,     1,     1,
-       1,     1,     1,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     1,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     1,     2
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     1,     1,     1,     2,     1,     1,
+       1,     1,     1,     1,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     2
   };
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
@@ -1225,9 +1407,12 @@ namespace lol {
   const EasyMeshParser::yytname_[] =
   {
     "T_END", "error", "$undefined", "T_COLOR", "T_BGCOLOR", "T_TRANSLATEX",
-  "T_ROTATEX", "T_TAPERX", "T_SCALEX", "T_MIRRORX", "T_TRANSLATEY",
-  "T_ROTATEY", "T_TAPERY", "T_SCALEY", "T_MIRRORY", "T_TRANSLATEZ",
-  "T_ROTATEZ", "T_TAPERZ", "T_SCALEZ", "T_MIRRORZ", "T_TRANSLATE",
+  "T_ROTATEX", "T_TAPERX", "T_TWISTX", "T_SHEARX", "T_STRETCHX",
+  "T_BENDXY", "T_BENDXZ", "T_SCALEX", "T_MIRRORX", "T_TRANSLATEY",
+  "T_ROTATEY", "T_TAPERY", "T_TWISTY", "T_SHEARY", "T_STRETCHY",
+  "T_BENDYX", "T_BENDYZ", "T_SCALEY", "T_MIRRORY", "T_TRANSLATEZ",
+  "T_ROTATEZ", "T_TAPERZ", "T_TWISTZ", "T_SHEARZ", "T_STRETCHZ",
+  "T_BENDZX", "T_BENDZY", "T_SCALEZ", "T_MIRRORZ", "T_TRANSLATE",
   "T_SCALE", "T_TOGGLESCALEWINDING", "T_RADIALJITTER", "T_CSGUNION",
   "T_CSGSUBSTRACT", "T_CSGSUBSTRACTLOSS", "T_CSGAND", "T_CSGXOR",
   "T_CHAMFER", "T_CYLINDER", "T_BOX", "T_SMOOTHCHAMFBOX", "T_FLATCHAMFBOX",
@@ -1246,25 +1431,31 @@ namespace lol {
   const EasyMeshParser::rhs_number_type
   EasyMeshParser::yyrhs_[] =
   {
-        50,     0,    -1,    51,     0,    -1,    52,    -1,    52,    51,
-      -1,    55,    -1,    53,    51,    54,    -1,    46,    -1,    47,
-      -1,    56,    -1,    55,    56,    -1,    57,    -1,    58,    -1,
-      59,    -1,     3,    63,    -1,     3,    45,    -1,     4,    63,
-      -1,     4,    45,    -1,    29,    60,    -1,     5,    60,    -1,
-      10,    60,    -1,    15,    60,    -1,    20,    62,    -1,     6,
-      60,    -1,    11,    60,    -1,    16,    60,    -1,     7,    62,
-      -1,    12,    62,    -1,    17,    62,    -1,     8,    60,    -1,
-      13,    60,    -1,    18,    60,    -1,    21,    62,    -1,     9,
-      -1,    14,    -1,    19,    -1,    23,    60,    -1,    22,    -1,
-      24,    -1,    25,    -1,    26,    -1,    27,    -1,    28,    -1,
-      30,    65,    -1,    30,    66,    -1,    31,    62,    -1,    32,
-      63,    -1,    33,    63,    -1,    34,    61,    -1,    35,    62,
-      -1,    42,    62,    -1,    36,    64,    -1,    37,    63,    -1,
-      38,    62,    -1,    39,    61,    -1,    40,    61,    -1,    41,
-      69,    -1,    70,    -1,    60,    70,    -1,    61,    70,    -1,
-      62,    70,    -1,    63,    70,    -1,    64,    70,    -1,    65,
-      70,    -1,    66,    70,    -1,    67,    70,    -1,    68,    70,
-      -1,    44,    -1,    48,    70,    -1
+        65,     0,    -1,    66,     0,    -1,    67,    -1,    67,    66,
+      -1,    70,    -1,    68,    66,    69,    -1,    61,    -1,    62,
+      -1,    71,    -1,    70,    71,    -1,    72,    -1,    73,    -1,
+      74,    -1,     3,    78,    -1,     3,    60,    -1,     4,    78,
+      -1,     4,    60,    -1,    44,    75,    -1,     5,    75,    -1,
+      15,    75,    -1,    25,    75,    -1,    35,    77,    -1,     6,
+      75,    -1,    16,    75,    -1,    26,    75,    -1,     7,    77,
+      -1,     7,    78,    -1,    17,    77,    -1,    17,    78,    -1,
+      27,    77,    -1,    27,    78,    -1,     8,    76,    -1,    18,
+      76,    -1,    28,    76,    -1,     9,    77,    -1,     9,    78,
+      -1,    19,    77,    -1,    19,    78,    -1,    29,    77,    -1,
+      29,    78,    -1,    10,    77,    -1,    20,    77,    -1,    30,
+      77,    -1,    11,    76,    -1,    12,    76,    -1,    21,    76,
+      -1,    22,    76,    -1,    31,    76,    -1,    32,    76,    -1,
+      13,    75,    -1,    23,    75,    -1,    33,    75,    -1,    36,
+      77,    -1,    14,    -1,    24,    -1,    34,    -1,    38,    75,
+      -1,    37,    -1,    39,    -1,    40,    -1,    41,    -1,    42,
+      -1,    43,    -1,    45,    80,    -1,    45,    81,    -1,    46,
+      77,    -1,    47,    78,    -1,    48,    78,    -1,    49,    76,
+      -1,    50,    77,    -1,    57,    77,    -1,    51,    79,    -1,
+      52,    78,    -1,    53,    77,    -1,    54,    76,    -1,    55,
+      76,    -1,    56,    84,    -1,    85,    -1,    75,    85,    -1,
+      76,    85,    -1,    77,    85,    -1,    78,    85,    -1,    79,
+      85,    -1,    80,    85,    -1,    81,    85,    -1,    82,    85,
+      -1,    83,    85,    -1,    59,    -1,    63,    85,    -1
   };
 
   /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
@@ -1275,10 +1466,12 @@ namespace lol {
          0,     0,     3,     6,     8,    11,    13,    17,    19,    21,
       23,    26,    28,    30,    32,    35,    38,    41,    44,    47,
       50,    53,    56,    59,    62,    65,    68,    71,    74,    77,
-      80,    83,    86,    89,    91,    93,    95,    98,   100,   102,
-     104,   106,   108,   110,   113,   116,   119,   122,   125,   128,
-     131,   134,   137,   140,   143,   146,   149,   152,   154,   157,
-     160,   163,   166,   169,   172,   175,   178,   181,   183
+      80,    83,    86,    89,    92,    95,    98,   101,   104,   107,
+     110,   113,   116,   119,   122,   125,   128,   131,   134,   137,
+     140,   143,   146,   149,   152,   154,   156,   158,   161,   163,
+     165,   167,   169,   171,   173,   176,   179,   182,   185,   188,
+     191,   194,   197,   200,   203,   206,   209,   212,   215,   217,
+     220,   223,   226,   229,   232,   235,   238,   241,   244,   246
   };
 
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
@@ -1289,9 +1482,11 @@ namespace lol {
       99,   103,   104,   105,   109,   110,   113,   114,   120,   121,
      122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
      132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   148,   151,   154,   155,   157,   159,   160,
-     161,   162,   164,   166,   167,   168,   169,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   186,   187
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   165,   169,   172,   175,   176,   178,   180,
+     181,   182,   183,   185,   187,   188,   189,   190,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   207,   208
   };
 
   // Print the state stack on the debug stream.
@@ -1335,12 +1530,12 @@ namespace lol {
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,    48,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,    63,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    46,     2,    47,     2,     2,     2,     2,     2,     2,
+       2,    61,     2,    62,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1361,7 +1556,8 @@ namespace lol {
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60
     };
     if ((unsigned int) t <= yyuser_token_number_max_)
       return translate_table[t];
@@ -1370,26 +1566,26 @@ namespace lol {
   }
 
   const int EasyMeshParser::yyeof_ = 0;
-  const int EasyMeshParser::yylast_ = 163;
+  const int EasyMeshParser::yylast_ = 266;
   const int EasyMeshParser::yynnts_ = 22;
   const int EasyMeshParser::yyempty_ = -2;
-  const int EasyMeshParser::yyfinal_ = 97;
+  const int EasyMeshParser::yyfinal_ = 133;
   const int EasyMeshParser::yyterror_ = 1;
   const int EasyMeshParser::yyerrcode_ = 256;
-  const int EasyMeshParser::yyntokens_ = 49;
+  const int EasyMeshParser::yyntokens_ = 64;
 
-  const unsigned int EasyMeshParser::yyuser_token_number_max_ = 300;
+  const unsigned int EasyMeshParser::yyuser_token_number_max_ = 315;
   const EasyMeshParser::token_number_type EasyMeshParser::yyundef_token_ = 2;
 
 
 } // lol
 
 /* Line 1053 of lalr1.cc  */
-#line 1389 "generated/easymesh-parser.cpp"
+#line 1585 "generated/easymesh-parser.cpp"
 
 
 /* Line 1055 of lalr1.cc  */
-#line 190 "easymesh/easymesh-parser.y"
+#line 211 "easymesh/easymesh-parser.y"
 
 
 void lol::EasyMeshParser::error(const EasyMeshParser::location_type& l,
diff --git a/src/generated/easymesh-parser.h b/src/generated/easymesh-parser.h
index 2884e2cf..75a83e9b 100644
--- a/src/generated/easymesh-parser.h
+++ b/src/generated/easymesh-parser.h
@@ -2,7 +2,7 @@
 
 /* Skeleton interface for Bison LALR(1) parsers in C++
    
-      Copyright (C) 2002-2011 Free Software Foundation, Inc.
+      Copyright (C) 2002-2010 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -137,44 +137,59 @@ namespace lol {
      T_TRANSLATEX = 260,
      T_ROTATEX = 261,
      T_TAPERX = 262,
-     T_SCALEX = 263,
-     T_MIRRORX = 264,
-     T_TRANSLATEY = 265,
-     T_ROTATEY = 266,
-     T_TAPERY = 267,
-     T_SCALEY = 268,
-     T_MIRRORY = 269,
-     T_TRANSLATEZ = 270,
-     T_ROTATEZ = 271,
-     T_TAPERZ = 272,
-     T_SCALEZ = 273,
-     T_MIRRORZ = 274,
-     T_TRANSLATE = 275,
-     T_SCALE = 276,
-     T_TOGGLESCALEWINDING = 277,
-     T_RADIALJITTER = 278,
-     T_CSGUNION = 279,
-     T_CSGSUBSTRACT = 280,
-     T_CSGSUBSTRACTLOSS = 281,
-     T_CSGAND = 282,
-     T_CSGXOR = 283,
-     T_CHAMFER = 284,
-     T_CYLINDER = 285,
-     T_BOX = 286,
-     T_SMOOTHCHAMFBOX = 287,
-     T_FLATCHAMFBOX = 288,
-     T_SPHERE = 289,
-     T_CAPSULE = 290,
-     T_STAR = 291,
-     T_EXPANDEDSTAR = 292,
-     T_DISC = 293,
-     T_TRIANGLE = 294,
-     T_QUAD = 295,
-     T_COG = 296,
-     T_TORUS = 297,
-     T_ERROR = 298,
-     NUMBER = 299,
-     COLOR = 300
+     T_TWISTX = 263,
+     T_SHEARX = 264,
+     T_STRETCHX = 265,
+     T_BENDXY = 266,
+     T_BENDXZ = 267,
+     T_SCALEX = 268,
+     T_MIRRORX = 269,
+     T_TRANSLATEY = 270,
+     T_ROTATEY = 271,
+     T_TAPERY = 272,
+     T_TWISTY = 273,
+     T_SHEARY = 274,
+     T_STRETCHY = 275,
+     T_BENDYX = 276,
+     T_BENDYZ = 277,
+     T_SCALEY = 278,
+     T_MIRRORY = 279,
+     T_TRANSLATEZ = 280,
+     T_ROTATEZ = 281,
+     T_TAPERZ = 282,
+     T_TWISTZ = 283,
+     T_SHEARZ = 284,
+     T_STRETCHZ = 285,
+     T_BENDZX = 286,
+     T_BENDZY = 287,
+     T_SCALEZ = 288,
+     T_MIRRORZ = 289,
+     T_TRANSLATE = 290,
+     T_SCALE = 291,
+     T_TOGGLESCALEWINDING = 292,
+     T_RADIALJITTER = 293,
+     T_CSGUNION = 294,
+     T_CSGSUBSTRACT = 295,
+     T_CSGSUBSTRACTLOSS = 296,
+     T_CSGAND = 297,
+     T_CSGXOR = 298,
+     T_CHAMFER = 299,
+     T_CYLINDER = 300,
+     T_BOX = 301,
+     T_SMOOTHCHAMFBOX = 302,
+     T_FLATCHAMFBOX = 303,
+     T_SPHERE = 304,
+     T_CAPSULE = 305,
+     T_STAR = 306,
+     T_EXPANDEDSTAR = 307,
+     T_DISC = 308,
+     T_TRIANGLE = 309,
+     T_QUAD = 310,
+     T_COG = 311,
+     T_TORUS = 312,
+     T_ERROR = 313,
+     NUMBER = 314,
+     COLOR = 315
    };
 
     };
@@ -261,7 +276,7 @@ namespace lol {
     static const unsigned char yydefact_[];
 
     static const short int yypgoto_[];
-    static const signed char yydefgoto_[];
+    static const short int yydefgoto_[];
 
     /// What to do in a state.
     /// \a yytable_[yypact_[s]]: what to do in state \a s.
@@ -271,7 +286,7 @@ namespace lol {
     static const unsigned char yytable_[];
     static const signed char yytable_ninf_;
 
-    static const signed char yycheck_[];
+    static const short int yycheck_[];
 
     /// For a state, its accessing symbol.
     static const unsigned char yystos_[];
@@ -348,7 +363,7 @@ namespace lol {
 } // lol
 
 /* Line 34 of lalr1.cc  */
-#line 352 "generated/easymesh-parser.h"
+#line 367 "generated/easymesh-parser.h"
 
 
 
diff --git a/src/generated/easymesh-scanner.cpp b/src/generated/easymesh-scanner.cpp
index e7526e6f..e8c859a8 100644
--- a/src/generated/easymesh-scanner.cpp
+++ b/src/generated/easymesh-scanner.cpp
@@ -330,8 +330,8 @@ typedef unsigned char YY_CHAR;
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 52
-#define YY_END_OF_BUFFER 53
+#define YY_NUM_RULES 67
+#define YY_END_OF_BUFFER 68
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -339,17 +339,20 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[83] =
+static yyconst flex_int16_t yy_accept[106] =
     {   0,
-        0,    0,   53,   51,   50,   49,   51,   51,   46,   51,
-       45,   47,   48,   51,   51,   51,   51,   17,    7,    0,
-        0,   45,   45,    0,   28,   29,   32,    0,    0,   35,
-       36,   39,    3,    0,   19,   20,   21,   22,    8,    9,
-       10,    1,   14,   15,   16,    0,    0,    4,    5,    6,
-        0,    0,   45,    0,   31,   33,    0,    0,    0,   40,
-        0,    2,   11,   12,   13,   18,   41,   30,   34,   37,
-       38,   26,   24,   23,   27,   42,   25,    0,   43,    0,
-       44,    0
+        0,    0,   68,   66,   65,   64,   66,   66,   61,   66,
+       60,   62,   63,   66,   66,   66,   66,   66,   32,    7,
+        0,    0,   60,   60,    0,   43,   44,   47,    0,    0,
+       50,   51,   54,    0,    3,    0,   34,   35,   36,   37,
+        8,    9,   10,    1,    0,    0,   29,   30,   31,    0,
+        0,    0,    4,    5,    6,    0,    0,   60,    0,   46,
+       48,    0,    0,    0,   55,    0,    0,    0,    0,    2,
+       17,   18,   19,   20,   21,   22,   11,   12,   13,   33,
+       14,   15,   16,   56,   45,   49,   52,   53,   23,   24,
+       25,   26,   27,   28,   41,   39,   38,   42,   57,   40,
+
+        0,   58,    0,   59,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -392,70 +395,82 @@ static yyconst flex_int32_t yy_meta[35] =
         1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[91] =
+static yyconst flex_int16_t yy_base[114] =
     {   0,
-        0,    0,  113,  114,  114,  114,    0,   28,   30,  104,
-       32,  114,  114,   36,   27,   11,   25,   41,   35,    0,
-      103,   69,   70,   76,  114,   47,  114,   82,   94,  114,
-       46,   84,  114,   88,  114,  114,  114,  114,  114,  114,
-      114,   92,  114,  114,  114,   56,   74,  114,  114,  114,
-        0,   96,   95,   76,  114,  114,   85,   83,   76,  114,
-       70,  114,  114,  114,  114,  114,    0,  114,  114,  114,
-      114,  114,   73,  114,  114,    0,  114,    0,    0,    0,
-      114,  114,   92,   91,   90,   89,   83,   70,   68,   39
+        0,    0,  135,  136,  136,  136,    0,   28,   30,  126,
+       32,  136,  136,   36,  117,   27,   11,   25,   51,   73,
+        0,  124,   53,   59,   67,  136,   55,  136,  103,  115,
+      136,   62,  105,   56,  136,  109,  136,  136,  136,  136,
+      136,  136,  136,  113,   59,   62,  136,  136,  136,   65,
+       95,   76,  136,  136,  136,    0,  117,  116,   98,  136,
+      136,  107,  105,   97,  136,   45,   68,   49,   90,  136,
+      136,  136,  136,  136,  136,  136,  136,  136,  136,  136,
+      136,  136,  136,    0,  136,  136,  136,  136,  136,  136,
+      136,  136,  136,  136,  136,   94,  136,  136,    0,  136,
+
+        0,    0,    0,  136,  136,  113,  112,  111,  110,  109,
+       54,   46,   39
     } ;
 
-static yyconst flex_int16_t yy_def[91] =
+static yyconst flex_int16_t yy_def[114] =
     {   0,
-       82,    1,   82,   82,   82,   82,   83,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   84,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       85,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   86,   82,   82,   82,
-       82,   82,   82,   82,   82,   87,   82,   88,   89,   90,
-       82,    0,   82,   82,   82,   82,   82,   82,   82,   82
+      105,    1,  105,  105,  105,  105,  106,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      107,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  108,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  109,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  110,  105,
+
+      111,  112,  113,  105,    0,  105,  105,  105,  105,  105,
+      105,  105,  105
     } ;
 
-static yyconst flex_int16_t yy_nxt[149] =
+static yyconst flex_int16_t yy_nxt[171] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,    4,    4,
-       12,   13,   14,    4,   15,    4,    4,    4,    4,    4,
-        4,    4,   16,    4,    4,    4,   17,   18,   19,    4,
-        4,    4,    4,    4,   21,   22,   21,   22,   21,   22,
-       81,   24,   35,   36,   37,   38,   33,   46,   24,   25,
-       26,   27,   28,   29,   34,   42,   39,   40,   41,   54,
-       58,   30,   47,   31,   32,   55,   48,   49,   50,   80,
-       59,   79,   43,   44,   45,   21,   22,   23,   24,   24,
-       52,   52,   72,   53,   78,   24,   24,   63,   64,   65,
-       76,   67,   51,   20,   77,   71,   70,   73,   69,   74,
-
-       68,   75,   53,   53,   66,   62,   61,   60,   57,   56,
-       23,   23,   82,    3,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82
+       12,   13,   14,   15,   16,    4,    4,    4,    4,    4,
+        4,    4,   17,    4,    4,    4,   18,   19,   20,    4,
+        4,    4,    4,    4,   22,   23,   22,   23,   22,   23,
+      104,   25,   37,   38,   39,   40,   35,  103,   25,   26,
+       27,   28,   29,   30,   36,  102,   41,   42,   43,   22,
+       23,   31,   25,   32,   33,   44,   24,   59,   25,   25,
+       45,   57,   57,   60,   58,   25,   63,   89,   90,   46,
+       93,   94,   47,   48,   49,   50,   64,   66,   67,   68,
+       71,   72,   73,   74,   75,   76,   77,   78,   79,   91,
+
+       51,   92,   95,   52,   53,   54,   55,   81,   82,   83,
+      101,   99,   84,   56,   21,  100,   88,   96,   87,   97,
+       86,   98,   85,   58,   58,   80,   70,   69,   65,   62,
+       61,   24,   34,   24,  105,    3,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105
     } ;
 
-static yyconst flex_int16_t yy_chk[149] =
+static yyconst flex_int16_t yy_chk[171] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    8,    8,    9,    9,   11,   11,
-       90,   11,   16,   16,   16,   17,   15,   19,   11,   14,
-       14,   14,   14,   14,   15,   18,   17,   17,   17,   26,
-       31,   14,   19,   14,   14,   26,   19,   19,   19,   89,
-       31,   88,   18,   18,   18,   22,   22,   23,   22,   23,
-       24,   24,   61,   24,   87,   22,   23,   46,   46,   46,
-       86,   85,   84,   83,   73,   59,   58,   61,   57,   61,
-
-       54,   61,   53,   52,   47,   42,   34,   32,   29,   28,
-       21,   10,    3,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82
+      113,   11,   17,   17,   17,   18,   16,  112,   11,   14,
+       14,   14,   14,   14,   16,  111,   18,   18,   18,   23,
+       23,   14,   23,   14,   14,   19,   24,   27,   24,   23,
+       19,   25,   25,   27,   25,   24,   32,   66,   66,   19,
+       68,   68,   19,   19,   19,   20,   32,   34,   34,   34,
+       45,   45,   45,   46,   46,   46,   50,   50,   50,   67,
+
+       20,   67,   69,   20,   20,   20,   20,   52,   52,   52,
+      110,  109,  108,  107,  106,   96,   64,   69,   63,   69,
+       62,   69,   59,   58,   57,   51,   44,   36,   33,   30,
+       29,   22,   15,   10,    3,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -504,7 +519,7 @@ typedef lol::EasyMeshParser::token_type token_type;
 #define yyterminate() return token::T_END
 #define YY_NO_UNISTD_H
 #define YY_USER_ACTION yylloc->columns(yyleng);
-#line 508 "generated/easymesh-scanner.cpp"
+#line 523 "generated/easymesh-scanner.cpp"
 
 #define INITIAL 0
 
@@ -617,7 +632,7 @@ YY_DECL
     yylloc->step();
 
 
-#line 621 "generated/easymesh-scanner.cpp"
+#line 636 "generated/easymesh-scanner.cpp"
 
 	if ( !(yy_init) )
 		{
@@ -670,13 +685,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 83 )
+				if ( yy_current_state >= 106 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 82 );
+		while ( yy_current_state != 105 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -764,141 +779,216 @@ YY_RULE_SETUP
 case 14:
 YY_RULE_SETUP
 #line 65 "easymesh/easymesh-scanner.l"
-{ return token::T_SCALEX; }
+{ return token::T_TWISTX; }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
 #line 66 "easymesh/easymesh-scanner.l"
-{ return token::T_SCALEY; }
+{ return token::T_TWISTY; }
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
 #line 67 "easymesh/easymesh-scanner.l"
-{ return token::T_SCALEZ; }
+{ return token::T_TWISTZ; }
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
 #line 68 "easymesh/easymesh-scanner.l"
-{ return token::T_SCALE; }
+{ return token::T_SHEARX; }
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
 #line 69 "easymesh/easymesh-scanner.l"
-{ return token::T_TOGGLESCALEWINDING; }
+{ return token::T_SHEARY; }
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
 #line 70 "easymesh/easymesh-scanner.l"
-{ return token::T_MIRRORX; }
+{ return token::T_SHEARZ; }
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
 #line 71 "easymesh/easymesh-scanner.l"
-{ return token::T_MIRRORY; }
+{ return token::T_STRETCHX; }
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
 #line 72 "easymesh/easymesh-scanner.l"
-{ return token::T_MIRRORZ; }
+{ return token::T_STRETCHY; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 73 "easymesh/easymesh-scanner.l"
-{ return token::T_RADIALJITTER; }
+{ return token::T_STRETCHZ; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 75 "easymesh/easymesh-scanner.l"
-{ return token::T_CSGUNION; }
+#line 74 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDXY; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 76 "easymesh/easymesh-scanner.l"
-{ return token::T_CSGSUBSTRACT; }
+#line 75 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDXZ; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 77 "easymesh/easymesh-scanner.l"
-{ return token::T_CSGSUBSTRACTLOSS; }
+#line 76 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDYX; }
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 78 "easymesh/easymesh-scanner.l"
-{ return token::T_CSGAND; }
+#line 77 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDYZ; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 79 "easymesh/easymesh-scanner.l"
-{ return token::T_CSGXOR; }
+#line 78 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDZX; }
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 81 "easymesh/easymesh-scanner.l"
-{ return token::T_BOX; }
+#line 79 "easymesh/easymesh-scanner.l"
+{ return token::T_BENDZY; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 82 "easymesh/easymesh-scanner.l"
-{ return token::T_CYLINDER; }
+#line 80 "easymesh/easymesh-scanner.l"
+{ return token::T_SCALEX; }
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 83 "easymesh/easymesh-scanner.l"
-{ return token::T_CAPSULE; }
+#line 81 "easymesh/easymesh-scanner.l"
+{ return token::T_SCALEY; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 84 "easymesh/easymesh-scanner.l"
-{ return token::T_COG; }
+#line 82 "easymesh/easymesh-scanner.l"
+{ return token::T_SCALEZ; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 85 "easymesh/easymesh-scanner.l"
-{ return token::T_DISC; }
+#line 83 "easymesh/easymesh-scanner.l"
+{ return token::T_SCALE; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 86 "easymesh/easymesh-scanner.l"
-{ return token::T_EXPANDEDSTAR; }
+#line 84 "easymesh/easymesh-scanner.l"
+{ return token::T_TOGGLESCALEWINDING; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 87 "easymesh/easymesh-scanner.l"
-{ return token::T_FLATCHAMFBOX; }
+#line 85 "easymesh/easymesh-scanner.l"
+{ return token::T_MIRRORX; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 88 "easymesh/easymesh-scanner.l"
-{ return token::T_QUAD; }
+#line 86 "easymesh/easymesh-scanner.l"
+{ return token::T_MIRRORY; }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 89 "easymesh/easymesh-scanner.l"
-{ return token::T_STAR; }
+#line 87 "easymesh/easymesh-scanner.l"
+{ return token::T_MIRRORZ; }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 90 "easymesh/easymesh-scanner.l"
-{ return token::T_SMOOTHCHAMFBOX; }
+#line 88 "easymesh/easymesh-scanner.l"
+{ return token::T_RADIALJITTER; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 91 "easymesh/easymesh-scanner.l"
-{ return token::T_SPHERE; }
+#line 90 "easymesh/easymesh-scanner.l"
+{ return token::T_CSGUNION; }
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 92 "easymesh/easymesh-scanner.l"
-{ return token::T_TRIANGLE; }
+#line 91 "easymesh/easymesh-scanner.l"
+{ return token::T_CSGSUBSTRACT; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
+#line 92 "easymesh/easymesh-scanner.l"
+{ return token::T_CSGSUBSTRACTLOSS; }
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
 #line 93 "easymesh/easymesh-scanner.l"
+{ return token::T_CSGAND; }
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 94 "easymesh/easymesh-scanner.l"
+{ return token::T_CSGXOR; }
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 96 "easymesh/easymesh-scanner.l"
+{ return token::T_BOX; }
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 97 "easymesh/easymesh-scanner.l"
+{ return token::T_CYLINDER; }
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 98 "easymesh/easymesh-scanner.l"
+{ return token::T_CAPSULE; }
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 99 "easymesh/easymesh-scanner.l"
+{ return token::T_COG; }
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 100 "easymesh/easymesh-scanner.l"
+{ return token::T_DISC; }
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 101 "easymesh/easymesh-scanner.l"
+{ return token::T_EXPANDEDSTAR; }
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 102 "easymesh/easymesh-scanner.l"
+{ return token::T_FLATCHAMFBOX; }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 103 "easymesh/easymesh-scanner.l"
+{ return token::T_QUAD; }
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 104 "easymesh/easymesh-scanner.l"
+{ return token::T_STAR; }
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 105 "easymesh/easymesh-scanner.l"
+{ return token::T_SMOOTHCHAMFBOX; }
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 106 "easymesh/easymesh-scanner.l"
+{ return token::T_SPHERE; }
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 107 "easymesh/easymesh-scanner.l"
+{ return token::T_TRIANGLE; }
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 108 "easymesh/easymesh-scanner.l"
 { return token::T_TORUS; }
 	YY_BREAK
-case 41:
+case 56:
 YY_RULE_SETUP
-#line 95 "easymesh/easymesh-scanner.l"
+#line 110 "easymesh/easymesh-scanner.l"
 {
         uint32_t tmp = std::strtol(yytext + 1, NULL, 16);
         yylval->u32val = 0x11000000u * (tmp >> 8)
@@ -907,9 +997,9 @@ YY_RULE_SETUP
                        | 0x000000ffu;
         return token::COLOR; }
 	YY_BREAK
-case 42:
+case 57:
 YY_RULE_SETUP
-#line 102 "easymesh/easymesh-scanner.l"
+#line 117 "easymesh/easymesh-scanner.l"
 {
         uint32_t tmp = std::strtol(yytext + 1, NULL, 16);
         yylval->u32val = 0x11000000u * (tmp >> 12)
@@ -918,64 +1008,64 @@ YY_RULE_SETUP
                        | 0x00000011u * (tmp & 0xf);
         return token::COLOR; }
 	YY_BREAK
-case 43:
+case 58:
 YY_RULE_SETUP
-#line 109 "easymesh/easymesh-scanner.l"
+#line 124 "easymesh/easymesh-scanner.l"
 {
         yylval->u32val = 0xffu
                        | 0x100u * (uint32_t)std::strtol(yytext + 1, NULL, 16);
         return token::COLOR; }
 	YY_BREAK
-case 44:
+case 59:
 YY_RULE_SETUP
-#line 113 "easymesh/easymesh-scanner.l"
+#line 128 "easymesh/easymesh-scanner.l"
 {
         yylval->u32val = (uint32_t)std::strtol(yytext + 1, NULL, 16);
         return token::COLOR; }
 	YY_BREAK
-case 45:
+case 60:
 YY_RULE_SETUP
-#line 116 "easymesh/easymesh-scanner.l"
+#line 131 "easymesh/easymesh-scanner.l"
 {
         yylval->fval = std::atof(yytext); return token::NUMBER; }
 	YY_BREAK
-case 46:
+case 61:
 YY_RULE_SETUP
-#line 118 "easymesh/easymesh-scanner.l"
+#line 133 "easymesh/easymesh-scanner.l"
 { return token_type('-'); }
 	YY_BREAK
-case 47:
+case 62:
 YY_RULE_SETUP
-#line 119 "easymesh/easymesh-scanner.l"
+#line 134 "easymesh/easymesh-scanner.l"
 { return token_type('['); }
 	YY_BREAK
-case 48:
+case 63:
 YY_RULE_SETUP
-#line 120 "easymesh/easymesh-scanner.l"
+#line 135 "easymesh/easymesh-scanner.l"
 { return token_type(']'); }
 	YY_BREAK
-case 49:
+case 64:
 YY_RULE_SETUP
-#line 121 "easymesh/easymesh-scanner.l"
+#line 136 "easymesh/easymesh-scanner.l"
 { /* ignore this */ }
 	YY_BREAK
-case 50:
-/* rule 50 can match eol */
+case 65:
+/* rule 65 can match eol */
 YY_RULE_SETUP
-#line 122 "easymesh/easymesh-scanner.l"
+#line 137 "easymesh/easymesh-scanner.l"
 { /* ignore this */ }
 	YY_BREAK
-case 51:
+case 66:
 YY_RULE_SETUP
-#line 123 "easymesh/easymesh-scanner.l"
+#line 138 "easymesh/easymesh-scanner.l"
 { return token::T_ERROR; }
 	YY_BREAK
-case 52:
+case 67:
 YY_RULE_SETUP
-#line 125 "easymesh/easymesh-scanner.l"
+#line 140 "easymesh/easymesh-scanner.l"
 ECHO;
 	YY_BREAK
-#line 979 "generated/easymesh-scanner.cpp"
+#line 1069 "generated/easymesh-scanner.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -1357,7 +1447,7 @@ int yyFlexLexer::yy_get_next_buffer()
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 83 )
+			if ( yy_current_state >= 106 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1385,11 +1475,11 @@ int yyFlexLexer::yy_get_next_buffer()
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 83 )
+		if ( yy_current_state >= 106 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 82);
+	yy_is_jam = (yy_current_state == 105);
 
 	return yy_is_jam ? 0 : yy_current_state;
 }
@@ -1876,7 +1966,7 @@ void EasyMeshfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 125 "easymesh/easymesh-scanner.l"
+#line 140 "easymesh/easymesh-scanner.l"
 
 
 
diff --git a/test/MeshViewerBuffer.txt b/test/MeshViewerBuffer.txt
index 863b803b..3d24da80 100644
--- a/test/MeshViewerBuffer.txt
+++ b/test/MeshViewerBuffer.txt
@@ -1,7 +1,11 @@
 //[sc#88f ab 4 4 4 tx 4 ab 4 4 4 tx -2 tax .4 .4 0]
 //[sc#88f ab 4 4 4]
-//[sc#ff2 asph 2 4 tx 4 tax 1 1 0]
-[sc#ff2 asph 2 4]
+//[sc#88f ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .125 stx 10 0 0]
+[sc#ff2 scb#2ff acg 13 2 1 1 8 8 4 4 0 1 tax -2 0 0 0]
+//[sc#88f ab 4 4 4 tx 4 ab 4 4 4 tx -2 shz 1 0 0 0]
+//[sc#ff2 asph 4 4 shx 0 0 0 0]
+//[sc#ff2 asph 4 4 tax .4 .4 0]
+//[sc#ff2 asph 2 4]
 //[sc#ff2 acap 1 4 4]
 //[sc#ff2 scb#ff2 ac 10 4 4 4 0 0 1]
 //[sc#ff2 scb#ff2 ad 10 4 0]