diff --git a/GameData/VABOrganizer/Assets/vaborganizer.dat b/GameData/VABOrganizer/Assets/vaborganizer.dat
index b11a0d1..a535971 100644
Binary files a/GameData/VABOrganizer/Assets/vaborganizer.dat and b/GameData/VABOrganizer/Assets/vaborganizer.dat differ
diff --git a/GameData/VABOrganizer/Localization/zh-cn.cfg b/GameData/VABOrganizer/Localization/zh-cn.cfg
new file mode 100644
index 0000000..169c8ae
--- /dev/null
+++ b/GameData/VABOrganizer/Localization/zh-cn.cfg
@@ -0,0 +1,161 @@
+Localization
+{
+ zh-cn
+ {
+ #LOC_VABOrganizer_BulkheadSortTooltip = 按截面排序
+ // Bulkhead codes
+ // ---------------
+ // Stock and cylinders
+ #LOC_VABOrganizer_Bulkhead_srf = 贴附
+ #LOC_VABOrganizer_Bulkhead_size00 = 0.3125m
+ #LOC_VABOrganizer_Bulkhead_size0 = 0.625m
+ #LOC_VABOrganizer_Bulkhead_size0p5 = 0.9375m
+ #LOC_VABOrganizer_Bulkhead_size1 = 1.25m
+ #LOC_VABOrganizer_Bulkhead_size1p5 = 1.875m
+ #LOC_VABOrganizer_Bulkhead_size2 = 2.5m
+ #LOC_VABOrganizer_Bulkhead_size2p5 = 3.125m
+ #LOC_VABOrganizer_Bulkhead_size3 = 3.75m
+ #LOC_VABOrganizer_Bulkhead_size3p5 = 4.375m
+ #LOC_VABOrganizer_Bulkhead_size4 = 5m
+ #LOC_VABOrganizer_Bulkhead_size4p5 = 5.625m
+ #LOC_VABOrganizer_Bulkhead_size5 = 6.25m
+ #LOC_VABOrganizer_Bulkhead_size5p5 = 6.875m
+ #LOC_VABOrganizer_Bulkhead_size6 = 7.5m
+ #LOC_VABOrganizer_Bulkhead_size6p5 = 8.125m
+ #LOC_VABOrganizer_Bulkhead_size7 = 8.75m
+ #LOC_VABOrganizer_Bulkhead_size7p5 = 9.375m
+ #LOC_VABOrganizer_Bulkhead_size8 = 10m
+
+ #LOC_VABOrganizer_Bulkhead_mk1 = MK1
+ #LOC_VABOrganizer_Bulkhead_mk2 = MK2
+ #LOC_VABOrganizer_Bulkhead_mk3 = MK3
+
+ // Mods
+ #LOC_VABOrganizer_Bulkhead_size1p8 = 2.25m
+ #LOC_VABOrganizer_Bulkhead_size1p2 = 1.5m
+ #LOC_VABOrganizer_Bulkhead_hex = HEX
+ #LOC_VABOrganizer_Bulkhead_octo = OCT
+ #LOC_VABOrganizer_Bulkhead_spinal = SPI
+ #LOC_VABOrganizer_Bulkhead_mk4 = MK4
+
+ // Subcategory names
+ // ---------------
+ #LOC_VABOrganizer_Subcategory_misc = 杂项
+ #LOC_VABOrganizer_Bulkhead_procedural = 程序化
+
+ // Aero
+ #LOC_VABOrganizer_Subcategory_wings = 机翼
+ #LOC_VABOrganizer_Subcategory_controlSurfaces = 控制面
+ #LOC_VABOrganizer_Subcategory_noses = 头锥
+ #LOC_VABOrganizer_Subcategory_intakes = 进气口
+ #LOC_VABOrganizer_Subcategory_deployableControlSurfaces = 可开展控制面
+ #LOC_VABOrganizer_Subcategory_rotorBlades = 旋翼叶片
+ #LOC_VABOrganizer_Subcategory_airAcessories = 引擎吊舱
+
+ // Cargo
+ #LOC_VABOrganizer_Subcategory_cargoStorage = 货物存储
+ #LOC_VABOrganizer_Subcategory_deployable = 可部署
+
+ // Command
+ #LOC_VABOrganizer_Subcategory_landers = 登陆舱
+ #LOC_VABOrganizer_Subcategory_probes = 探测器核心
+ #LOC_VABOrganizer_Subcategory_cockpits = 座舱
+ #LOC_VABOrganizer_Subcategory_pods = 指令舱
+ #LOC_VABOrganizer_Subcategory_stationCores = 空间站核心
+ #LOC_VABOrganizer_Subcategory_seats = 控制座椅
+
+ // Comms
+ #LOC_VABOrganizer_Subcategory_direct = 天线
+ #LOC_VABOrganizer_Subcategory_relay = 中继天线
+ #LOC_VABOrganizer_Subcategory_reflector = 反射面
+
+ // Control
+ #LOC_VABOrganizer_Subcategory_rcs = RCS
+ #LOC_VABOrganizer_Subcategory_reactionWheels = 动量轮
+ #LOC_VABOrganizer_Subcategory_sas = SAS
+
+ // Coupling
+ #LOC_VABOrganizer_Subcategory_decouplers = 分离器
+ #LOC_VABOrganizer_Subcategory_separators = 切分器
+ #LOC_VABOrganizer_Subcategory_dockingPorts = 对接口
+ #LOC_VABOrganizer_Subcategory_grapples = 抓取单元
+
+ // Electrical
+ #LOC_VABOrganizer_Subcategory_solarPanels = 太阳能电池板
+ #LOC_VABOrganizer_Subcategory_batteries = 电池
+ #LOC_VABOrganizer_Subcategory_rtgs = 放射性同位素热电机
+ #LOC_VABOrganizer_Subcategory_fuelcells = 燃料电池
+ #LOC_VABOrganizer_Subcategory_fissionReactors = 裂变反应堆
+ #LOC_VABOrganizer_Subcategory_fusionReactors = 聚变反应堆
+
+ // Engines
+ #LOC_VABOrganizer_Subcategory_lfoEngines = 液体燃料引擎
+ #LOC_VABOrganizer_Subcategory_cryogenicEngines = 低温燃料引擎
+ #LOC_VABOrganizer_Subcategory_solidEngines = 固体燃料引擎
+ #LOC_VABOrganizer_Subcategory_nuclearEngines = 核能引擎
+ #LOC_VABOrganizer_Subcategory_ionEngines = 离子引擎
+ #LOC_VABOrganizer_Subcategory_jetEngines = 喷气式引擎
+ #LOC_VABOrganizer_Subcategory_propEngines = 螺旋桨引擎
+ #LOC_VABOrganizer_Subcategory_monoEngines = 单组元推进剂引擎
+
+ // Fuel
+ #LOC_VABOrganizer_Subcategory_lfo = 火箭燃料
+ #LOC_VABOrganizer_Subcategory_lf = 航空燃料
+ #LOC_VABOrganizer_Subcategory_monoprop = 单组元推进剂
+ #LOC_VABOrganizer_Subcategory_xenon = 氙气
+ #LOC_VABOrganizer_Subcategory_argon = 氩气
+ #LOC_VABOrganizer_Subcategory_lithium = 锂
+ #LOC_VABOrganizer_Subcategory_cryogenic = 低温燃料
+ #LOC_VABOrganizer_Subcategory_nuclearFuel = 核燃料
+
+ // Ground
+ #LOC_VABOrganizer_Subcategory_legs = 着陆支架
+ #LOC_VABOrganizer_Subcategory_wheels = 车轮
+ #LOC_VABOrganizer_Subcategory_gear = 起落架
+
+ // Payload
+ #LOC_VABOrganizer_Subcategory_fairings = 整流罩
+ #LOC_VABOrganizer_Subcategory_serviceBays = 服务舱
+ #LOC_VABOrganizer_Subcategory_cargoBays = 货舱
+ #LOC_VABOrganizer_Subcategory_cargoContainers = 货物集装箱
+
+ // Robotics
+ #LOC_VABOrganizer_Subcategory_rotors = 转子
+ #LOC_VABOrganizer_Subcategory_hinges = 铰链 & 伺服电机
+ #LOC_VABOrganizer_Subcategory_pistons = 活塞
+
+ // Science
+ #LOC_VABOrganizer_Subcategory_instruments = 实验仪器
+ #LOC_VABOrganizer_Subcategory_labs = 实验室
+ #LOC_VABOrganizer_Subcategory_scienceStorage = 科学数据存储
+ #LOC_VABOrganizer_Subcategory_greenhouses = 温室
+ #LOC_VABOrganizer_Subcategory_resourceScanners = 资源扫描器
+
+ // Structural
+ #LOC_VABOrganizer_Subcategory_truss = 桁架
+ #LOC_VABOrganizer_Subcategory_trussAdapters = 桁架适配器
+ #LOC_VABOrganizer_Subcategory_trussHubs = 桁架枢纽
+ #LOC_VABOrganizer_Subcategory_adapters = 转接器
+ #LOC_VABOrganizer_Subcategory_radialAdapters = 径向转接器
+ #LOC_VABOrganizer_Subcategory_engineMounts = 引擎支架
+ #LOC_VABOrganizer_Subcategory_girders = 钢梁
+ #LOC_VABOrganizer_Subcategory_hubs = 枢纽
+ #LOC_VABOrganizer_Subcategory_multicouplers = 多向转接器
+ #LOC_VABOrganizer_Subcategory_tubes = 管道
+
+ // Thermal
+ #LOC_VABOrganizer_Subcategory_heatShields = 热防护罩
+ #LOC_VABOrganizer_Subcategory_radiators = 散热器
+
+ // Utility
+ #LOC_VABOrganizer_Subcategory_parachutes = 降落伞
+ #LOC_VABOrganizer_Subcategory_resources = 采矿
+ #LOC_VABOrganizer_Subcategory_lights = 照明
+ #LOC_VABOrganizer_Subcategory_ladders = 梯子
+ #LOC_VABOrganizer_Subcategory_flags = 旗帜
+ #LOC_VABOrganizer_Subcategory_crewTransport = 坎巴拉人运送
+ #LOC_VABOrganizer_Subcategory_crewHabitation = 居住舱
+ #LOC_VABOrganizer_Subcategory_airlocks = 气闸舱
+
+ }
+}
\ No newline at end of file
diff --git a/GameData/VABOrganizer/Plugins/VABOrganizer.dll b/GameData/VABOrganizer/Plugins/VABOrganizer.dll
index 28c93cf..d73ec5d 100644
Binary files a/GameData/VABOrganizer/Plugins/VABOrganizer.dll and b/GameData/VABOrganizer/Plugins/VABOrganizer.dll differ
diff --git a/GameData/VABOrganizer/Settings.cfg b/GameData/VABOrganizer/Settings.cfg
index e69de29..66292e6 100644
--- a/GameData/VABOrganizer/Settings.cfg
+++ b/GameData/VABOrganizer/Settings.cfg
@@ -0,0 +1,13 @@
+ORGANIZERSETTINGS
+{
+ /// Log debug messages
+ DebugMode = true
+ /// If True, Noto Sans, if False, Liberation Sans
+ KSPDefaultFont = true
+ /// Size of the font on tags
+ LabelFontSize = 9
+ /// Size of the font on tags in R&D
+ RDLabelFontSize = 9
+ /// Transparency of tags
+ LabelAlpha = 0.4
+}
\ No newline at end of file
diff --git a/GameData/VABOrganizer/advancedSorters.cfg b/GameData/VABOrganizer/advancedSorters.cfg
new file mode 100644
index 0000000..0c991ca
--- /dev/null
+++ b/GameData/VABOrganizer/advancedSorters.cfg
@@ -0,0 +1,203 @@
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortReactionWheel
+ // Label for the UI
+ Label = Reaction Wheel Torque
+ // The variable to sort against
+ Sorter = ModuleReactionWheel_AverageTorque
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Pods
+ category = Function_Control
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortCrewCapacity
+ // Label for the UI
+ Label = Crew Capacity
+ // The variable to sort against
+ Sorter = part_crewCapacity
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Pods
+ category = Function_Utility
+ category = Function_Science
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineISPASL
+ // Label for the UI
+ Label = ISP (SL)
+ // The variable to sort against
+ Sorter = ModuleEngines_IspASL
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineISP
+ // Label for the UI
+ Label = ISP (Vacuum)
+ // The variable to sort against
+ Sorter = ModuleEngines_IspVacuum
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineTWRASL
+ // Label for the UI
+ Label = TWR (SL)
+ // The variable to sort against
+ Sorter = ModuleEngines_TWRASL
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineTWR
+ // Label for the UI
+ Label = TWR (Vacuum)
+ // The variable to sort against
+ Sorter = ModuleEngines_TWRVacuum
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineThrustASL
+ // Label for the UI
+ Label = Thrust (SL)
+ // The variable to sort against
+ Sorter = ModuleEngines_ThrustASL
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineThrust
+ // Label for the UI
+ Label = Thrust (Vacuum)
+ // The variable to sort against
+ Sorter = ModuleEngines_ThrustVacuum
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortEngineGimbal
+ // Label for the UI
+ Label = Gimbal Range
+ // The variable to sort against
+ Sorter = ModuleGimbal_Range
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Engine
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortRCSThrust
+ // Label for the UI
+ Label = RCS Thrust
+ // The variable to sort against
+ Sorter = ModuleRCS_ThrustVacuum
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Control
+ category = Function_Pods
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortRCSISP
+ // Label for the UI
+ Label = RCS Isp
+ // The variable to sort against
+ Sorter = ModuleRCS_ThrustVacuum
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Control
+ category = Function_Pods
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortAntennaPower
+ // Label for the UI
+ Label = Antenna Power
+ // The variable to sort against
+ Sorter = ModuleDataTransmitter_Power
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Communication
+ category = Function_Pods
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortSASLevel
+ // Label for the UI
+ Label = SAS Level
+ // The variable to sort against
+ Sorter = ModuleSAS_ServiceLevel
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Control
+ category = Function_Pods
+ }
+}
+ORGANIZERSORTERTYPE
+{
+ // Internal unique name of the sorter
+ name = sortSolarCharge
+ // Label for the UI
+ Label = Power Production
+ // The variable to sort against
+ Sorter = ModuleSolarPanel_ChargeRate
+ // The VAB categories where this sorter will appear
+ VisibleCategories
+ {
+ category = Function_Electrical
+ }
+}
\ No newline at end of file
diff --git a/Source/VABOrganizer/AdvancedSortType.cs b/Source/VABOrganizer/AdvancedSortType.cs
new file mode 100644
index 0000000..de4202d
--- /dev/null
+++ b/Source/VABOrganizer/AdvancedSortType.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using KSP.Localization;
+
+namespace VABOrganizer
+{
+ public class AdvancedSortType
+ {
+ public string Name
+ {
+ get { return name; }
+ private set { name = value; }
+ }
+ ///
+ /// Localized sorter name
+ ///
+ public string Label
+ {
+ get { return label; }
+ private set { label = value; }
+ }
+ ///
+ /// The sorter to use
+ ///
+ public string Sorter
+ {
+ get { return sorter; }
+ private set { sorter = value; }
+ }
+ ///
+ /// The VAB PartCategories where this sorter will be used
+ ///
+ public List AssociatedPartCategories
+ {
+ get { return partCategories; }
+ private set { partCategories = value; }
+ }
+
+ protected const string NODE_NAME = "name";
+ protected const string NODE_LABEL = "Label";
+ protected const string NODE_SORTER = "Sorter";
+ protected const string NODE_ASSOCIATED_CATEGORY = "VisibleCategories";
+ protected const string NODE_CATEGORY = "category";
+
+ private string name = "category";
+ private string label = "label";
+ private string sorter = "isp";
+ private List partCategories;
+
+ public AdvancedSortType() { }
+
+ public AdvancedSortType(ConfigNode node)
+ {
+ Load(node);
+ }
+
+ public void Load(ConfigNode node)
+ {
+ node.TryGetValue(NODE_NAME, ref name);
+ node.TryGetValue(NODE_LABEL, ref label);
+ node.TryGetValue(NODE_SORTER, ref sorter);
+
+ partCategories = new List();
+ ConfigNode categoryNode = new ConfigNode();
+ if (node.TryGetNode(NODE_ASSOCIATED_CATEGORY, ref categoryNode))
+ {
+ string[] categories = categoryNode.GetValues(NODE_CATEGORY);
+ foreach (string stringCat in categories)
+ {
+ partCategories.Add(stringCat);
+ }
+ }
+
+ label = Localizer.Format(label);
+ }
+ }
+}
diff --git a/Source/VABOrganizer/AdvancedSorting.cs b/Source/VABOrganizer/AdvancedSorting.cs
new file mode 100644
index 0000000..0056cd1
--- /dev/null
+++ b/Source/VABOrganizer/AdvancedSorting.cs
@@ -0,0 +1,245 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using UnityEngine;
+using UnityEngine.UI;
+using UniLinq;
+using TMPro;
+using KSP.UI;
+using KSP.UI.Screens;
+using KSP.UI.TooltipTypes;
+using KSP.Localization;
+
+namespace VABOrganizer
+{
+ ///
+ /// Creates and manages the advanced sorting stuff
+ ///
+ public static class AdvancedSorting
+ {
+ public static AdvancedSortType CurrentAdvancedSort = null;
+
+ static UIAdvancedSorterWidget SortWidget;
+ static UIListSorter uiSorterBase;
+ static EditorPartList uiPartList;
+ static string cachedCategorySort = "";
+
+ const string BULKHEAD_SORT_KEY = "#LOC_VABOrganizer_BulkheadSortTooltip";
+
+ ///
+ /// Creates the sorting UI
+ ///
+ public static void CreateVABSortUI()
+ {
+ uiSorterBase = GameObject.FindObjectOfType();
+ uiPartList = GameObject.FindObjectOfType();
+ GameObject sortByNameButton = uiSorterBase.gameObject.GetChild("StateButtonName");
+ if (!uiSorterBase.gameObject.GetChild("StateButtonProfile"))
+ {
+ CreateSortButton(uiSorterBase, sortByNameButton, "Profile", 4, true);
+ CreateSortButton(uiSorterBase, sortByNameButton, "Custom", 5, false);
+
+ }
+ else
+ {
+ /// maybe throw warning later
+ }
+ RestyleButtons(uiSorterBase.transform);
+ CreateAdvancedButton(uiSorterBase.transform);
+ }
+
+ ///
+ /// Create a new sorting button
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void CreateSortButton(UIListSorter sorter, GameObject template, string sortName, int buttonIndex, bool startingSorter)
+ {
+ GameObject newSortButtonObj = GameObject.Instantiate(template);
+ newSortButtonObj.transform.SetParent(sorter.transform, false);
+
+ Button sortingButton = newSortButtonObj.GetComponent