diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
index 2aedb738a..8f9da3198 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
@@ -25,6 +25,7 @@ import ru.dbotthepony.mc.otm.datagen.blocks.MatterBankProvider
 import ru.dbotthepony.mc.otm.datagen.blocks.MatteryBlockStateProvider
 import ru.dbotthepony.mc.otm.datagen.loot.LootModifiers
 import ru.dbotthepony.mc.otm.datagen.items.MatteryItemModelProvider
+import ru.dbotthepony.mc.otm.datagen.lang.AddEnglishLanguage
 import ru.dbotthepony.mc.otm.datagen.loot.LootTables
 import ru.dbotthepony.mc.otm.datagen.loot.TileNbtCopy
 import ru.dbotthepony.mc.otm.datagen.models.BlockMatteryModelProvider
@@ -42,6 +43,7 @@ object DataGen {
 	private lateinit var lootTableProvider: LootTables
 	private lateinit var recipeProvider: MatteryRecipeProvider
 	private lateinit var lootModifier: LootModifiers
+	private lateinit var languageProvider: MatteryLanguageProvider
 
 	private fun decorativeCubeAll(vararg blocks: Block) {
 		blockModelProvider.decorativeCubeAll(*blocks)
@@ -111,6 +113,17 @@ object DataGen {
 	}
 
 	private fun decoratives(list: ColoredDecorativeBlock) {
+		for (block in list.coloredBlocks) {
+			decorativeCubeAll(block)
+			lootTableProvider.simpleBlock(block)
+		}
+
+		for (item in list.coloredItems) {
+			itemModelProvider.block(item)
+		}
+	}
+
+	private fun decoratives(list: DecorativeBlock) {
 		for (block in list.blocks) {
 			decorativeCubeAll(block)
 			lootTableProvider.simpleBlock(block)
@@ -131,6 +144,9 @@ object DataGen {
 		lootTableProvider = LootTables(event.generator)
 		recipeProvider = MatteryRecipeProvider(event.generator)
 		lootModifier = LootModifiers(event.generator)
+		languageProvider = MatteryLanguageProvider(event.generator)
+
+		AddEnglishLanguage(languageProvider)
 
 		event.generator.addProvider(blockModelProvider)
 		event.generator.addProvider(itemModelProvider)
@@ -143,16 +159,13 @@ object DataGen {
 
 		decorativeCubeAll(MBlocks.CRATE_LIST)
 		decorativeCubeAll(MBlocks.CARBON_FIBRE_BLOCK)
-		decorativeCubeAll(MBlocks.TRITANIUM_BLOCK)
-		decorativeCubeAll(MBlocks.VENT)
-		decorativeCubeAll(MBlocks.VENT_ALTERNATIVE)
 
 		decoratives(MRegistry.TRITANIUM_BLOCK)
 		decoratives(MRegistry.FLOOR_TILES)
 		decoratives(MRegistry.VENT)
 		decoratives(MRegistry.VENT_ALTERNATIVE)
 
-		for (glass in MBlocks.INDUSTRIAL_GLASS_LIST) {
+		for (glass in MRegistry.INDUSTRIAL_GLASS.blocks) {
 			decorativeCubeAll(glass)
 		}
 
@@ -165,7 +178,7 @@ object DataGen {
 		blockModelProvider.resourceCubeAll(MBlocks.DEEPSLATE_TRITANIUM_ORE)
 
 		blockModelProvider.lambda {
-			for (crate in MBlocks.CARGO_CRATES_COLORED) {
+			for (crate in MRegistry.CARGO_CRATES.coloredBlocks) {
 				it.withExistingParent("${crate.registryName!!.path}_closed", ResourceLocation(OverdriveThatMatters.MOD_ID, "${MNames.CARGO_CRATE}_closed"))
 					.texture("texture", "block/cargo_crates/${crate.registryName!!.path}")
 					.texture("particle", "block/cargo_crates/${crate.registryName!!.path}")
@@ -178,8 +191,8 @@ object DataGen {
 
 		decorativeColumn(MBlocks.TRITANIUM_STRIPED_BLOCK, "tritanium_striped_block", "tritanium_block")
 
-		for ((i, glass) in MBlocks.INDUSTRIAL_GLASS_PANE_LIST.withIndex()) {
-			val name = MBlocks.INDUSTRIAL_GLASS_LIST[i].registryName!!.path
+		for ((i, glass) in MRegistry.INDUSTRIAL_GLASS_PANE.blocks.withIndex()) {
+			val name = MRegistry.INDUSTRIAL_GLASS.blocks[i].registryName!!.path
 			val textureSide = ResourceLocation(MOD_ID, "block/decorative/$name")
 			val textureRailing = textureSide
 			pane(glass, textureSide, textureRailing)
@@ -267,7 +280,7 @@ object DataGen {
 			block(MBlocks.MATTER_RECYCLER)
 
 			lambda {
-				for (crate in MBlocks.CARGO_CRATES_COLORED) {
+				for (crate in MRegistry.CARGO_CRATES.coloredBlocks) {
 					getVariantBuilder(crate).forAllStates {
 						return@forAllStates arrayOf(
 							ConfiguredModel.builder()
@@ -357,20 +370,18 @@ object DataGen {
 			block(MItems.TRITANIUM_STRIPED_BLOCK)
 			block(MItems.TRITANIUM_RAW_BLOCK)
 			block(MItems.ITEM_MONITOR)
-			block(MItems.TRITANIUM_BLOCK)
-			block(MItems.VENT)
-			block(MItems.VENT_ALTERNATIVE)
 
-			for (glass in MItems.INDUSTRIAL_GLASS_LIST) {
-				block(glass)
-			}
+			MRegistry.VENT.items.forEach(this::block)
+			MRegistry.VENT_ALTERNATIVE.items.forEach(this::block)
+			MRegistry.TRITANIUM_BLOCK.items.forEach(this::block)
+			MRegistry.INDUSTRIAL_GLASS.items.forEach(this::block)
 
 			for (block in MItems.TRITANIUM_STRIPED_BLOCKS) {
 				block(block)
 			}
 
-			for ((i, glass) in MItems.INDUSTRIAL_GLASS_PANE_LIST.withIndex()) {
-				generated(glass, ResourceLocation(MOD_ID, "block/decorative/${MItems.INDUSTRIAL_GLASS_LIST[i].registryName!!.path}"))
+			for ((i, glass) in MRegistry.INDUSTRIAL_GLASS_PANE.items.withIndex()) {
+				generated(glass, ResourceLocation(MOD_ID, "block/decorative/${MRegistry.INDUSTRIAL_GLASS.items[i].registryName!!.path}"))
 			}
 
 			blocks(MItems.CRATE_LIST)
@@ -400,7 +411,7 @@ object DataGen {
 
 			generated(MItems.MATTER_DUST)
 
-			for (item in MItems.CARGO_CRATES) {
+			for (item in MRegistry.CARGO_CRATES.items) {
 				block(item, "${item.registryName!!.path}_closed")
 			}
 
@@ -513,15 +524,12 @@ object DataGen {
 		with(lootTableProvider) {
 			simpleBlocks(MBlocks.CRATE_LIST)
 
-			for (block in MBlocks.CARGO_CRATES) {
-				simpleBlock(block)
-			}
+			MRegistry.CARGO_CRATES.blocks.forEach(this::simpleBlock)
+			MRegistry.INDUSTRIAL_GLASS.blocks.forEach(this::simpleBlock)
+			MRegistry.INDUSTRIAL_GLASS_PANE.blocks.forEach(this::simpleBlock)
 
 			simpleBlock(MBlocks.CARBON_FIBRE_BLOCK)
 			simpleBlock(MBlocks.TRITANIUM_RAW_BLOCK)
-			simpleBlock(MBlocks.TRITANIUM_BLOCK)
-			simpleBlock(MBlocks.VENT)
-			simpleBlock(MBlocks.VENT_ALTERNATIVE)
 			simpleBlock(MBlocks.TRITANIUM_STRIPED_BLOCK)
 			simpleBlock(MBlocks.MATTER_CABLE)
 			simpleBlock(MBlocks.GRAVITATION_STABILIZER)
@@ -549,37 +557,8 @@ object DataGen {
 			tile(MBlocks.MATTER_BOTTLER, TileNbtCopy("energy"), TileNbtCopy("battery_container"), TileNbtCopy("work_slots"), TileNbtCopy("work_flow"), TileNbtCopy("matter"))
 		}
 
-		with(lootTableProvider) {
-			for (glass in MBlocks.INDUSTRIAL_GLASS_LIST) {
-				simpleBlock(glass)
-			}
-
-			for (glass in MBlocks.INDUSTRIAL_GLASS_PANE_LIST) {
-				simpleBlock(glass)
-			}
-		}
-
 		with(recipeProvider) {
-			val crates = arrayOf(
-				DyeColor.WHITE to MBlocks.CARGO_CRATE_WHITE,
-				DyeColor.ORANGE to MBlocks.CARGO_CRATE_ORANGE,
-				DyeColor.MAGENTA to MBlocks.CARGO_CRATE_MAGENTA,
-				DyeColor.LIGHT_BLUE to MBlocks.CARGO_CRATE_LIGHT_BLUE,
-				DyeColor.YELLOW to MBlocks.CARGO_CRATE_YELLOW,
-				DyeColor.LIME to MBlocks.CARGO_CRATE_LIME,
-				DyeColor.PINK to MBlocks.CARGO_CRATE_PINK,
-				DyeColor.GRAY to MBlocks.CARGO_CRATE_GRAY,
-				DyeColor.LIGHT_GRAY to MBlocks.CARGO_CRATE_LIGHT_GRAY,
-				DyeColor.CYAN to MBlocks.CARGO_CRATE_CYAN,
-				DyeColor.PURPLE to MBlocks.CARGO_CRATE_PURPLE,
-				DyeColor.BLUE to MBlocks.CARGO_CRATE_BLUE,
-				DyeColor.BROWN to MBlocks.CARGO_CRATE_BROWN,
-				DyeColor.GREEN to MBlocks.CARGO_CRATE_GREEN,
-				DyeColor.RED to MBlocks.CARGO_CRATE_RED,
-				DyeColor.BLACK to MBlocks.CARGO_CRATE_BLACK,
-			)
-
-			for ((dye, crate) in crates) {
+			for ((dye, crate) in MRegistry.CARGO_CRATES.mappedColoredBlocks) {
 				lambda { _, consumer ->
 					ShapedRecipeBuilder(crate, 1)
 						.define('P', MItemTags.PLATE_TRITANIUM)
@@ -600,7 +579,7 @@ object DataGen {
 			}
 
 			lambda { _, consumer ->
-				ShapedRecipeBuilder(MItems.CARGO_CRATE, 1)
+				ShapedRecipeBuilder(MRegistry.CARGO_CRATES.item, 1)
 					.define('P', MItemTags.PLATE_TRITANIUM)
 					.define('C', Tags.Items.CHESTS)
 					.pattern("PCP")
@@ -628,17 +607,17 @@ object DataGen {
 			}
 
 			lambda { _, consumer ->
-				ShapelessRecipeBuilder(MItems.INDUSTRIAL_GLASS, 8)
+				ShapelessRecipeBuilder(MRegistry.INDUSTRIAL_GLASS.item, 8)
 					.requires(net.minecraft.world.item.Items.GLASS, 8)
 					.requires(MItemTags.PLATE_TRITANIUM)
 					.unlockedBy("has_plate", has(MItemTags.PLATE_TRITANIUM))
 					.unlockedBy("has_glass", has(net.minecraft.world.item.Items.GLASS))
 					.save(consumer)
 
-				ShapedRecipeBuilder(MItems.INDUSTRIAL_GLASS_PANE, 16)
-					.define('#', MItems.INDUSTRIAL_GLASS)
+				ShapedRecipeBuilder(MRegistry.INDUSTRIAL_GLASS_PANE.item, 16)
+					.define('#', MRegistry.INDUSTRIAL_GLASS.item)
 					.pattern("###").pattern("###")
-					.unlockedBy("has_tritanium_glass", has(MItems.INDUSTRIAL_GLASS))
+					.unlockedBy("has_tritanium_glass", has(MRegistry.INDUSTRIAL_GLASS.item))
 					.save(consumer)
 
 				val mapping = arrayOf(
@@ -680,15 +659,15 @@ object DataGen {
 				)
 
 				for ((i, tag) in mapping.withIndex()) {
-					val item = MItems.INDUSTRIAL_GLASS_LIST[i + 1]
-					val paneItem = MItems.INDUSTRIAL_GLASS_PANE_LIST[i + 1]
+					val item = MRegistry.INDUSTRIAL_GLASS.coloredItems[i]
+					val paneItem = MRegistry.INDUSTRIAL_GLASS_PANE.coloredItems[i]
 					val mappedVanilla = mappingUpgradeVanilla[i]
 
 					// обычная покраска
 					ShapelessRecipeBuilder(item, 8)
-						.requires(MItems.INDUSTRIAL_GLASS, 8)
+						.requires(MRegistry.INDUSTRIAL_GLASS.item, 8)
 						.requires(tag)
-						.unlockedBy("has_tritanium_glass", has(MItems.INDUSTRIAL_GLASS))
+						.unlockedBy("has_tritanium_glass", has(MRegistry.INDUSTRIAL_GLASS.item))
 						.save(consumer)
 
 					// апгрейд ванильного крашенного стекла
@@ -700,9 +679,9 @@ object DataGen {
 						.save(consumer, ResourceLocation(MOD_ID, "${item.registryName!!.path}_upgrade"))
 
 					ShapelessRecipeBuilder(paneItem, 8)
-						.requires(MItems.INDUSTRIAL_GLASS_PANE, 8)
+						.requires(MRegistry.INDUSTRIAL_GLASS_PANE.item, 8)
 						.requires(tag)
-						.unlockedBy("has_tritanium_glass_pane", has(MItems.INDUSTRIAL_GLASS_PANE))
+						.unlockedBy("has_tritanium_glass_pane", has(MRegistry.INDUSTRIAL_GLASS_PANE.item))
 						.save(consumer)
 
 					ShapedRecipeBuilder(paneItem, 16)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatteryLanguageProvider.kt
new file mode 100644
index 000000000..f0e10ba0d
--- /dev/null
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/MatteryLanguageProvider.kt
@@ -0,0 +1,241 @@
+package ru.dbotthepony.mc.otm.datagen
+
+import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
+import net.minecraft.data.DataGenerator
+import net.minecraft.world.effect.MobEffect
+import net.minecraft.world.entity.EntityType
+import net.minecraft.world.item.Item
+import net.minecraft.world.item.ItemStack
+import net.minecraft.world.item.enchantment.Enchantment
+import net.minecraft.world.level.block.Block
+import net.minecraftforge.common.data.LanguageProvider
+import ru.dbotthepony.mc.otm.OverdriveThatMatters
+import ru.dbotthepony.mc.otm.android.AndroidFeatureType
+import ru.dbotthepony.mc.otm.android.AndroidResearchType
+import ru.dbotthepony.mc.otm.registry.ColoredDecorativeBlock
+
+class MatteryLanguageProvider(private val gen: DataGenerator) {
+	private inner class Slave(language: String) : LanguageProvider(gen, OverdriveThatMatters.MOD_ID, language) {
+		init {
+			gen.addProvider(this)
+		}
+
+		override fun addTranslations() {}
+	}
+
+	private val slaves = Object2ObjectArrayMap<String, Slave>()
+
+	inner class Builder(language: String) {
+		val slave: LanguageProvider = slaves.computeIfAbsent(language, ::Slave)
+
+		fun add(key: String, value: String) = slave.add(key, value)
+		fun add(key: Block, value: String) = slave.add(key, value)
+		fun add(key: Block, suffix: String, value: String) = slave.add("${key.descriptionId}.${suffix}", value)
+		fun add(key: Item, value: String) = slave.add(key, value)
+		fun add(key: Item, suffix: String, value: String) = slave.add("${key.descriptionId}.${suffix}", value)
+		fun add(key: ItemStack, value: String) = slave.add(key, value)
+		fun add(key: Enchantment, value: String) = slave.add(key, value)
+		fun add(key: MobEffect, value: String) = slave.add(key, value)
+		fun add(key: EntityType<*>, value: String) = slave.add(key, value)
+
+		fun death(key: String, value: String) = slave.add("death.attack.$key", value)
+		fun stat(key: String, value: String) = slave.add("stat.${OverdriveThatMatters.MOD_ID}.$key", value)
+
+		fun add(key: AndroidResearchType<*>, value: String) = slave.add(key.displayId, value)
+		fun add(key: AndroidResearchType<*>, suffix: String, value: String) = slave.add("${key.displayId}.$suffix", value)
+
+		fun add(key: AndroidFeatureType<*>, value: String) = slave.add(key.displayId, value)
+		fun add(key: AndroidFeatureType<*>, suffix: String, value: String) = slave.add("${key.displayId}.$suffix", value)
+
+		fun misc(key: String, value: String) = slave.add("otm.$key", value)
+		fun sound(key: String, value: String) = slave.add("otm.sound.$key", value)
+	}
+
+	inner class Colors(
+		language: String,
+
+		val white: String,
+		val orange: String,
+		val magenta: String,
+		val lightBlue: String,
+		val yellow: String,
+		val lime: String,
+		val pink: String,
+		val gray: String,
+		val lightGray: String,
+		val cyan: String,
+		val purple: String,
+		val blue: String,
+		val brown: String,
+		val green: String,
+		val red: String,
+		val black: String,
+	) {
+		val slave: LanguageProvider = slaves.computeIfAbsent(language, ::Slave)
+
+		fun add(list: ColoredDecorativeBlock, toFormat: String) {
+			slave.add(list.whiteBlock, toFormat.format(white))
+			slave.add(list.orangeBlock, toFormat.format(orange))
+			slave.add(list.magentaBlock, toFormat.format(magenta))
+			slave.add(list.lightBlueBlock, toFormat.format(lightBlue))
+			slave.add(list.yellowBlock, toFormat.format(yellow))
+			slave.add(list.limeBlock, toFormat.format(lime))
+			slave.add(list.pinkBlock, toFormat.format(pink))
+			slave.add(list.grayBlock, toFormat.format(gray))
+			slave.add(list.lightGrayBlock, toFormat.format(lightGray))
+			slave.add(list.cyanBlock, toFormat.format(cyan))
+			slave.add(list.purpleBlock, toFormat.format(purple))
+			slave.add(list.blueBlock, toFormat.format(blue))
+			slave.add(list.brownBlock, toFormat.format(brown))
+			slave.add(list.greenBlock, toFormat.format(green))
+			slave.add(list.redBlock, toFormat.format(red))
+			slave.add(list.blackBlock, toFormat.format(black))
+		}
+
+		fun add(
+			whiteBlock: Block,
+			orangeBlock: Block,
+			magentaBlock: Block,
+			lightBlueBlock: Block,
+			yellowBlock: Block,
+			limeBlock: Block,
+			pinkBlock: Block,
+			grayBlock: Block,
+			lightGrayBlock: Block,
+			cyanBlock: Block,
+			purpleBlock: Block,
+			blueBlock: Block,
+			brownBlock: Block,
+			greenBlock: Block,
+			redBlock: Block,
+			blackBlock: Block,
+
+			toFormat: String,
+		) {
+			slave.add(whiteBlock, toFormat.format(white))
+			slave.add(orangeBlock, toFormat.format(orange))
+			slave.add(magentaBlock, toFormat.format(magenta))
+			slave.add(lightBlueBlock, toFormat.format(lightBlue))
+			slave.add(yellowBlock, toFormat.format(yellow))
+			slave.add(limeBlock, toFormat.format(lime))
+			slave.add(pinkBlock, toFormat.format(pink))
+			slave.add(grayBlock, toFormat.format(gray))
+			slave.add(lightGrayBlock, toFormat.format(lightGray))
+			slave.add(cyanBlock, toFormat.format(cyan))
+			slave.add(purpleBlock, toFormat.format(purple))
+			slave.add(blueBlock, toFormat.format(blue))
+			slave.add(brownBlock, toFormat.format(brown))
+			slave.add(greenBlock, toFormat.format(green))
+			slave.add(redBlock, toFormat.format(red))
+			slave.add(blackBlock, toFormat.format(black))
+		}
+
+		fun add(
+			whiteItem: Item,
+			orangeItem: Item,
+			magentaItem: Item,
+			lightBlueItem: Item,
+			yellowItem: Item,
+			limeItem: Item,
+			pinkItem: Item,
+			grayItem: Item,
+			lightGrayItem: Item,
+			cyanItem: Item,
+			purpleItem: Item,
+			blueItem: Item,
+			brownItem: Item,
+			greenItem: Item,
+			redItem: Item,
+			blackItem: Item,
+
+			toFormat: String,
+		) {
+			slave.add(whiteItem, toFormat.format(white))
+			slave.add(orangeItem, toFormat.format(orange))
+			slave.add(magentaItem, toFormat.format(magenta))
+			slave.add(lightBlueItem, toFormat.format(lightBlue))
+			slave.add(yellowItem, toFormat.format(yellow))
+			slave.add(limeItem, toFormat.format(lime))
+			slave.add(pinkItem, toFormat.format(pink))
+			slave.add(grayItem, toFormat.format(gray))
+			slave.add(lightGrayItem, toFormat.format(lightGray))
+			slave.add(cyanItem, toFormat.format(cyan))
+			slave.add(purpleItem, toFormat.format(purple))
+			slave.add(blueItem, toFormat.format(blue))
+			slave.add(brownItem, toFormat.format(brown))
+			slave.add(greenItem, toFormat.format(green))
+			slave.add(redItem, toFormat.format(red))
+			slave.add(blackItem, toFormat.format(black))
+		}
+
+		fun addBlocks(list: List<Block>, toFormat: String) {
+			add(
+				whiteBlock = list[0],
+				orangeBlock = list[1],
+				magentaBlock = list[2],
+				lightBlueBlock = list[3],
+				yellowBlock = list[4],
+				limeBlock = list[5],
+				pinkBlock = list[6],
+				grayBlock = list[7],
+				lightGrayBlock = list[8],
+				cyanBlock = list[9],
+				purpleBlock = list[10],
+				blueBlock = list[11],
+				brownBlock = list[12],
+				greenBlock = list[13],
+				redBlock = list[14],
+				blackBlock = list[15],
+
+				toFormat = toFormat
+			)
+		}
+
+		fun addItems(list: List<Item>, toFormat: String) {
+			add(
+				whiteItem = list[0],
+				orangeItem = list[1],
+				magentaItem = list[2],
+				lightBlueItem = list[3],
+				yellowItem = list[4],
+				limeItem = list[5],
+				pinkItem = list[6],
+				grayItem = list[7],
+				lightGrayItem = list[8],
+				cyanItem = list[9],
+				purpleItem = list[10],
+				blueItem = list[11],
+				brownItem = list[12],
+				greenItem = list[13],
+				redItem = list[14],
+				blackItem = list[15],
+
+				toFormat = toFormat
+			)
+		}
+	}
+
+	val decorativeEnglish = Colors("en_us",
+		"White",
+		"Orange",
+		"Magenta",
+		"Light Blue",
+		"Yellow",
+		"Lime",
+		"Pink",
+		"Gray",
+		"Light Gray",
+		"Cyan",
+		"Purple",
+		"Blue",
+		"Brown",
+		"Green",
+		"Red",
+		"Black",
+	)
+
+	val english = Builder("en_us")
+	val russian = Builder("ru_ru")
+
+	fun getProvider(language: String): LanguageProvider = slaves.computeIfAbsent(language, ::Slave)
+}
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
new file mode 100644
index 000000000..b51805d82
--- /dev/null
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
@@ -0,0 +1,401 @@
+package ru.dbotthepony.mc.otm.datagen.lang
+
+import ru.dbotthepony.mc.otm.datagen.MatteryLanguageProvider
+import ru.dbotthepony.mc.otm.registry.*
+
+private fun decoratives(provider: MatteryLanguageProvider) {
+	provider.decorativeEnglish.add(MRegistry.VENT, "%s Vent")
+	provider.decorativeEnglish.add(MRegistry.VENT_ALTERNATIVE, "%s Alternative Vent")
+
+	provider.decorativeEnglish.add(MRegistry.TRITANIUM_BLOCK, "%s Tritanium Block")
+	provider.decorativeEnglish.add(MRegistry.FLOOR_TILES, "%s Floor Tiles")
+
+	provider.decorativeEnglish.add(MRegistry.INDUSTRIAL_GLASS, "%s Stained Industrial Glass")
+	provider.decorativeEnglish.add(MRegistry.INDUSTRIAL_GLASS_PANE, "%s Stained Industrial Glass Pane")
+
+	provider.decorativeEnglish.add(MRegistry.CARGO_CRATES, "%s Cargo Crate")
+
+	with(provider.english) {
+		add(MRegistry.CARGO_CRATES.block, "Cargo Crate")
+		add(MRegistry.TRITANIUM_BLOCK.block, "Tritanium Block")
+
+		add(MRegistry.INDUSTRIAL_GLASS.block, "Industrial Glass")
+		add(MRegistry.INDUSTRIAL_GLASS_PANE.block, "Industrial Glass Pane")
+
+		add(MRegistry.VENT.block, "Vent")
+		add(MRegistry.VENT_ALTERNATIVE.block, "Alternative Vent")
+	}
+}
+
+private fun sounds(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		sound("rifle_shoot", "Plasma rifle fires")
+		sound("plasma_weapon_overheat", "Plasma weapon overheats")
+		sound("player_become_android", "Player became android")
+	}
+}
+
+private fun misc(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		misc("death_reason", "Decommissioned!")
+
+		misc("item.blackhole_immunity", "Negates gravitational effects of singularities")
+
+		misc("suffix.merge", "%s %s")
+
+		misc("suffix.kilo", "%s k%s")
+		misc("suffix.mega", "%s M%s")
+		misc("suffix.giga", "%s G%s")
+		misc("suffix.tera", "%s T%s")
+		misc("suffix.peta", "%s P%s")
+		misc("suffix.exa", "%s E%s")
+		misc("suffix.zetta", "%s Z%s")
+		misc("suffix.yotta", "%s Y%s")
+
+		misc("suffix.deci", "%s d%s")
+		misc("suffix.centi", "%s c%s")
+		misc("suffix.milli", "%s m%s")
+		misc("suffix.micro", "%s μ%s")
+		misc("suffix.nano", "%s n%s")
+		misc("suffix.pico", "%s p%s")
+		misc("suffix.femto", "%s f%s")
+		misc("suffix.atto", "%s a%s")
+		misc("suffix.zepto", "%s z%s")
+		misc("suffix.yocto", "%s y%s")
+
+		misc("suffix_raw.kilo", "k")
+		misc("suffix_raw.mega", "M")
+		misc("suffix_raw.giga", "G")
+		misc("suffix_raw.tera", "T")
+		misc("suffix_raw.peta", "P")
+		misc("suffix_raw.exa", "E")
+		misc("suffix_raw.zetta", "Z")
+		misc("suffix_raw.yotta", "Y")
+		misc("suffix_raw.deci", "d")
+		misc("suffix_raw.centi", "c")
+		misc("suffix_raw.milli", "m")
+		misc("suffix_raw.micro", "μ")
+		misc("suffix_raw.nano", "n")
+		misc("suffix_raw.pico", "p")
+		misc("suffix_raw.femto", "f")
+		misc("suffix_raw.atto", "a")
+		misc("suffix_raw.zepto", "z")
+		misc("suffix_raw.yocto", "y")
+
+		misc("container.matter_panel.increase_by", "+%s")
+		misc("container.matter_panel.decrease_by", "-%s")
+		misc("container.matter_panel.send", "Send")
+		misc("container.matter_panel.close", "Close")
+		misc("container.matter_panel.cancel_task", "Cancel task")
+		misc("container.matter_panel.cancel", "Cancel")
+		misc("container.matter_panel.label", "Replication request")
+		misc("container.matter_panel.task", "Ongoing replication task")
+		misc("container.matter_panel.task_line", "%s: %s | %s / %s")
+
+		misc("item.power.infinite.storage", "Stored energy: Infinity / Infinity")
+		misc("item.power.infinite.throughput", "Max I/O Infinite / Infinite")
+		misc("item.power.passed", "Passed energy: %s")
+		misc("item.power.average", "Average throughput: %s/t")
+		misc("item.power.last_20_ticks", "Last second: %s")
+		misc("item.power.last_tick", "Last tick: %s")
+
+		misc("item.power.normal.storage", "Stored energy: %s / %s")
+		misc("item.power.normal.throughput", "Max I/O %s / %s")
+
+		misc("item.pattern.stored", "Stored patterns: %s / %s")
+		misc("item.pattern.infinite.stored", "Stored patterns %s")
+		misc("item.pattern.line", "%s [%s%%]")
+		misc("item.pattern.research", "Researched: %s%%")
+
+		misc("item.matter.infinite", "Stored matter: Infinity / Infinity")
+		misc("item.matter.normal", "Stored matter: %s / %s")
+
+		misc("gui.matter_task.total", "Total: %s")
+		misc("gui.matter_task.required", "Left to be done: %s")
+		misc("gui.matter_task.in_progress", "In progress: %s")
+		misc("gui.matter_task.finished", "Finished: %s")
+
+		misc("pill.warning", "WARNING: This will INSTANTLY decommission you upon ingestion!")
+		misc("pill.android", "Take this pill and lose what is holding you back.")
+
+		misc("pill.humane", "Take this pill and wake up in bed none the wiser.")
+
+		misc("pill.oblivion", "Items and Experience spent on research is fully refunded.")
+		misc("pill.message_oblivion", "All android features are removed and all research refunded.")
+
+		misc("pill.heal", "Instantly restores 4 hearts upon ingestion, provides 2 min Absorption V and 8 seconds Regeneration III.")
+		misc("pill.heal_android", "Does nothing to androids.")
+
+		misc("pill.message", "Nothing happened, but you feel exhausted?.. Maybe get rest.")
+		misc("pill.message_finish", "§kONE OF US ONE OF US ONE OF US ONE OF US ONE OF US")
+
+		misc("gui.power.percentage_level", "Energy level: %s%%")
+		misc("gui.level", "%s / %s")
+		misc("gui.power.name", "MtJ")
+
+		misc("gui.power.burn_time", "Burn time left: %s ticks")
+
+		misc("gui.progress_widget", "Progress: %s%%")
+		misc("gui.progress_widget_stuck", "The machine can not work, check configuration")
+
+		misc("gui.total_raw", "Total:")
+
+		misc("gui.matter.percentage_level", "Matter level: %s%%")
+		misc("gui.matter.format", "Matter: %s")
+		misc("gui.matter.format_and_complexity", "%s / Complexity: %s")
+		misc("gui.matter.name", "MtU")
+
+		misc("gui.filter.is_whitelist", "Is Whitelist")
+		misc("gui.filter.match_nbt", "Match NBT")
+		misc("gui.filter.match_tag", "Match Tag")
+
+		misc("gui.android_research", "Research Tree")
+
+		misc("gui.pattern.percentage_level", "Fill level: %s%%")
+		misc("gui.pattern.format", "Stored patterns: %s / %s")
+
+		misc("gui.redstone.ignored", "Redstone mode: Ignored")
+		misc("gui.redstone.low", "Redstone mode: Low")
+		misc("gui.redstone.high", "Redstone mode: High")
+
+		misc("gui.redstone.ignored.description", "Redstone signal does not affect machine's function")
+		misc("gui.redstone.low.description", "Machine work if no redstone signal is present")
+		misc("gui.redstone.high.description", "Machine work only if any redstone signal is present")
+
+		misc("3d2d.gravitation_stabilizer.mass", "Singularity mass: %s")
+		misc("3d2d.gravitation_stabilizer.strength", "Gravitation strength: %s")
+
+		misc("android_station.research.researched", "Researched!")
+		misc("android_station.research.can_be_researched", "Ready to research!")
+		misc("android_station.research.can_not_be_researched", "Can not afford!")
+		misc("android_station.research.xp_cost", "Experience cost: %s levels")
+		misc("android_station.research.item", "Requires %s x%s")
+		misc("android_station.research.missing_predecessors", "%s needs to be researched first")
+
+		misc("filter.yes", "Yes")
+		misc("filter.no", "No")
+
+		misc("matter_bottler.switch_mode", "Switch work mode")
+
+		misc("container.matter_panel.number_input", "Input replication task count")
+	}
+}
+
+private fun death(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		death("otm_become_android", "%1\$s lost their humanity")
+		death("otm_become_humane", "%1\$s regained their humanity")
+		death("otm_event_horizon", "%1\$s never crossed event horizon")
+		death("otm_hawking_radiation", "%1\$s discovered Hawking radiation")
+		death("otm_emp", "%1\$s electronics' fried")
+
+		death("otm_become_android.player", "%1\$s lost their humanity whilst %2\$s tried to reason with them")
+		death("otm_become_humane.player", "%1\$s gained their humanity whilst %2\$s tried to reason with them")
+		death("otm_event_horizon.player", "%1\$s tried to cross event horizon whilst trying to escape %2\$s")
+		death("otm_hawking_radiation.player", "%1\$s disintegrated whilst fighting %2\$s")
+		death("otm_emp.player", "%1\$s blew fuzes of %2\$s")
+		death("otm_emp.player.item", "%1\$s blew fuzes of %2\$s using %3\$s")
+	}
+}
+
+private fun blocks(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		add(MBlocks.ANDROID_STATION, "Android Station")
+		add(MBlocks.BATTERY_BANK, "Battery Bank")
+		add(MBlocks.MATTER_DECOMPOSER, "Matter Decomposer")
+		add(MBlocks.MATTER_CAPACITOR_BANK, "Matter Capacitor Bank")
+		add(MBlocks.MATTER_CABLE, "Matter Network Cable")
+		add(MBlocks.PATTERN_STORAGE, "Pattern Storage")
+		add(MBlocks.MATTER_SCANNER, "Matter Scanner")
+		add(MBlocks.MATTER_PANEL, "Pattern Monitor")
+		add(MBlocks.MATTER_REPLICATOR, "Matter Replicator")
+		add(MBlocks.MATTER_BOTTLER, "Matter Bottler")
+		add(MBlocks.DRIVE_VIEWER, "Drive Viewer")
+		add(MBlocks.BLACK_HOLE, "Local Anomalous Singular Gravitation Field")
+
+		add(MBlocks.ENERGY_COUNTER, "Energy Counter")
+		add(MBlocks.ENERGY_COUNTER, "facing", "Input facing: %s")
+		add(MBlocks.ENERGY_COUNTER, "switch", "Switch input facing")
+		add(MBlocks.ENERGY_COUNTER, "limit", "I/O Limit. -1 means no limit")
+
+		add(MBlocks.CHEMICAL_GENERATOR, "Chemical Generator")
+		add(MBlocks.DRIVE_RACK, "Condensation Drive Rack")
+		add(MBlocks.ITEM_MONITOR, "Item Monitor")
+		add(MBlocks.PLATE_PRESS, "Plate Press")
+
+		add(MBlocks.MATTER_RECYCLER, "Matter Recycler")
+
+		add(MBlocks.CRATE_RED, "Red Container Block")
+		add(MBlocks.CRATE_BLUE, "Blue Container Block")
+		add(MBlocks.CRATE_GREEN, "Green Container Block")
+		add(MBlocks.CRATE_YELLOW, "Yellow Container Block")
+		add(MBlocks.CRATE_BLACK, "Black Container Block")
+		add(MBlocks.CRATE_PINK, "Pink Container Block")
+		add(MBlocks.CRATE_PURPLE, "Purple Container Block")
+
+		add(MBlocks.CARBON_FIBRE_BLOCK, "Carbon fibre Block")
+
+		add(MBlocks.TRITANIUM_STRIPED_BLOCK, "Tritanium Striped Block")
+		add(MBlocks.TRITANIUM_ORE, "Tritanium Ore")
+		add(MBlocks.DEEPSLATE_TRITANIUM_ORE, "Deepslate Tritanium Ore")
+		add(MBlocks.TRITANIUM_RAW_BLOCK, "Raw Tritanium Block")
+
+		add(MBlocks.STORAGE_CABLE, "Storage Cable")
+		add(MBlocks.STORAGE_POWER_SUPPLIER, "Storage Power Supplier")
+		add(MBlocks.STORAGE_BUS, "Storage Bus")
+		add(MBlocks.STORAGE_IMPORTER, "Storage Importer")
+		add(MBlocks.STORAGE_EXPORTER, "Storage Exporter")
+
+		add(MBlocks.GRAVITATION_STABILIZER, "Gravitation Stabilizer")
+		add(MBlocks.GRAVITATION_STABILIZER_LENS, "Gravitation Stabilizer Lens")
+		add(MBlocks.GRAVITATION_STABILIZER, "desc", "Reduces gravitation effects of singularities")
+		add(MBlocks.GRAVITATION_STABILIZER, "desc2", "Requires no power to operate")
+		add(MBlocks.GRAVITATION_STABILIZER, "desc3", "Keep in mind the effect of multiple stabilizers produce exponentially increasing result")
+		add(MBlocks.GRAVITATION_STABILIZER, "desc4", "Too weak gravitation field will cause singularity to melt and evaporate away very fast")
+	}
+}
+
+private fun items(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		add(MItems.NUTRIENT_PASTE, "Nutrient paste")
+
+		add(MItems.BLACK_HOLE_SCANNER, "Singularity Scanner")
+		add(MItems.BLACK_HOLE_SCANNER, "desc", "Scans singularities for their properties")
+		add(MItems.BLACK_HOLE_SCANNER, "desc2", "Hold in hand to determine mass of singularities")
+
+		add(MItems.GRAVITATION_FIELD_LIMITER, "Gravitation Field Limiter")
+		add(MItems.GRAVITATION_FIELD_SENSOR, "Gravitation Field Sensor")
+		add(MItems.PORTABLE_GRAVITATION_STABILIZER, "Portable Gravitation Stabilizer")
+
+		add(MItems.BATTERY_CRUDE, "Crude Battery")
+		add(MItems.BATTERY_BASIC, "Basic Battery")
+		add(MItems.BATTERY_NORMAL, "Ordinary Battery")
+		add(MItems.BATTERY_DENSE, "Dense Battery")
+		add(MItems.BATTERY_CAPACITOR, "Capacitor Battery")
+		add(MItems.BATTERY_CREATIVE, "Creative Battery")
+
+		add(MItems.TRITANIUM_SWORD, "Tritanium Sword")
+		add(MItems.TRITANIUM_PICKAXE, "Tritanium Pickaxe")
+		add(MItems.TRITANIUM_SHOVEL, "Tritanium Shovel")
+		add(MItems.TRITANIUM_AXE, "Tritanium Axe")
+		add(MItems.TRITANIUM_HOE, "Tritanium Hoe")
+
+		add(MItems.TRITANIUM_HELMET, "Tritanium Helmet")
+		add(MItems.TRITANIUM_CHESTPLATE, "Tritanium Chestplate")
+		add(MItems.TRITANIUM_PANTS, "Tritanium Leggings")
+		add(MItems.TRITANIUM_BOOTS, "Tritanium Boots")
+
+		add(MItems.TRITANIUM_INGOT, "Tritanium Ingot")
+		add(MItems.MATTER_IO_PORT, "Matter IO Port")
+		add(MItems.MATTER_TRANSFORM_MATRIX, "Matter Transformation Matrix")
+		add(MItems.ENERGY_BUS, "Energy Bus")
+		add(MItems.ELECTRIC_PARTS,  "Electric Parts")
+		add(MItems.MACHINE_FRAME, "Machine Frame")
+		add(MItems.TRITANIUM_PLATE,  "Tritanium Plate")
+		add(MItems.IRON_PLATE, "Iron Plate")
+		add(MItems.COPPER_WIRING,  "Copper Wiring")
+		add(MItems.GOLD_WIRING, "Gold Wiring")
+		add(MItems.PORTABLE_CONDENSATION_DRIVE_CASING, "Portable Condensation Drive Casing")
+		add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE_CASING, "Portable Dense Condensation Drive Casing")
+		add(MItems.CIRCUIT_PLATING, "Circuit Plating")
+		add(MItems.BASIC_CONTROL_CIRCUIT, "Basic Control Circuit")
+		add(MItems.ADVANCED_CONTROL_CIRCUIT, "Advanced Control Circuit")
+
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "Gravitational Disruptor")
+
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description", "Once within close proximity of supermassive body, suppresses any gravity in it's radius")
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description2", "Allows collapse of black holes")
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description3", "Doesn't destroy any of mass singularity had acquired, which result in violent explosion of matter!")
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description4", "The explosion %s be contained by %s. Do not even attempt to contain it.")
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description4_clarification", "can not")
+		add(MItems.GRAVITATIONAL_DISRUPTOR, "description4_clarification2", "anything")
+
+		add(MItems.MATTER_DUST, "Matter Dust")
+		add(MItems.MATTER_DUST, "desc", "This item is product of failed decomposition or replication attempt")
+		add(MItems.MATTER_DUST, "desc2", "Throw into matter recycler to get some of it's value back!")
+		add(MItems.MATTER_DUST, "desc3", "Do not smell, throw at strangers or pour on donuts")
+
+		add(MItems.PILL_ANDROID, "Android Pill")
+		add(MItems.PILL_HUMANE, "Humane Pill")
+		add(MItems.PILL_OBLIVION, "Android Factory Reset Pill")
+		add(MItems.PILL_HEAL, "Medical Pill")
+
+		add(MItems.MATTER_CAPACITOR_PARTS, "Matter Capacitor Parts")
+		add(MItems.MATTER_CAPACITOR_BASIC, "Basic Matter Capacitor")
+		add(MItems.MATTER_CAPACITOR_NORMAL, "Matter Capacitor")
+		add(MItems.MATTER_CAPACITOR_DENSE, "Dense Matter Capacitor")
+		add(MItems.MATTER_CAPACITOR_CREATIVE, "Creative Matter Capacitor")
+
+		add(MItems.ENERGY_SWORD, "Powered Cake Slicer")
+		add(MItems.ENERGY_SWORD, "desc", "Needs power to operate")
+		add(MItems.ENERGY_SWORD, "desc2", "Deals extra damage to androids when powered")
+
+		add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive")
+		add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive")
+		add(MItems.PLASMA_RIFLE, "Plasma Rifle")
+		add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium")
+		add(MItems.PATTERN_DRIVE_NORMAL, "Pattern Drive")
+		add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive")
+	}
+}
+
+private fun stats(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		stat("health_regenerated", "Damage Regenerated by Nanobots")
+		stat("damage_absorbed", "Damage Absorbed by Nanobots")
+		stat("power_consumed", "MtJ Burnt as Android")
+	}
+}
+
+private fun research(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		add("android_research.status.requires", "Requires %s to be researched")
+		add("android_research.status.blocks", "Locks %s")
+		add("android_research.status.blocked_by", "Locked by %s")
+
+		add(AndroidResearch.LIMB_OVERCLOCKING[0], "Limb Overclocking %s")
+		add(AndroidResearch.LIMB_OVERCLOCKING[0], "description", "Boosts unit's mobility by %s%% and attack speed by %s%%")
+
+		add(AndroidResearch.AIR_BAGS, "Air Bags")
+		add(AndroidResearch.NANOBOTS, "Nanobots")
+		add(AndroidResearch.AIR_BAGS, "description", "Allows unit to swim in water")
+		add(AndroidResearch.NANOBOTS, "description", "Various useful nanobots for doing various tasks")
+
+		add(AndroidResearch.NANOBOTS_REGENERATION[0], "Regeneration %s")
+		add(AndroidResearch.NANOBOTS_REGENERATION[0], "description", "Nanobots get ability to repair unit's internal systems on the move")
+		add(AndroidResearch.NANOBOTS_REGENERATION[0], "description_improve", "Improves regeneration speed")
+
+		add(AndroidResearch.NANOBOTS_ARMOR, "Nanobots Armor")
+		add(AndroidResearch.NANOBOTS_ARMOR, "description", "Allows nanobots to align themselves in cell shape, reducing incoming damage by a %% by absorbing impacts")
+
+		add(AndroidResearch.NANOBOTS_ARMOR_SPEED[0], "Nanobots Armor Build Speed %s")
+		add(AndroidResearch.NANOBOTS_ARMOR_SPEED[0], "description", "Reduces time required for nanobots to form protection layer")
+
+		add(AndroidResearch.NANOBOTS_ARMOR_STRENGTH[0], "Nanobots Armor Strength %s")
+		add(AndroidResearch.NANOBOTS_ARMOR_STRENGTH[0], "description", "Increases impact absorption strength of nanobots")
+
+		add(AndroidResearch.EXTENDED_REACH, "Extended Reach")
+		add(AndroidResearch.EXTENDED_REACH, "description", "Increases block interaction distance")
+	}
+}
+
+private fun androidFeatures(provider: MatteryLanguageProvider) {
+	with(provider.english) {
+		add(AndroidFeatures.AIR_BAGS, "Air Bags")
+	}
+}
+
+fun AddEnglishLanguage(provider: MatteryLanguageProvider) {
+	decoratives(provider)
+	sounds(provider)
+	misc(provider)
+
+	blocks(provider)
+	items(provider)
+	stats(provider)
+
+	with(provider.english) {
+		add("itemGroup.otm", "Overdrive That Matters")
+		add("itemGroup.otm_decorative", "Overdrive That Matters Decorative")
+	}
+}
diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java
index af1bec0cb..084f2b459 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java
@@ -65,7 +65,7 @@ public final class OverdriveThatMatters {
 	public final CreativeModeTab CREATIVE_TAB_DECORATIVE = new CreativeModeTab("otm_decorative") {
 		@Override
 		public ItemStack makeIcon() {
-			return new ItemStack(MItems.INSTANCE.getVENT(), 1);
+			return new ItemStack(MRegistry.INSTANCE.getVENT().getItem(), 1);
 		}
 	};
 
diff --git a/src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearchType.java b/src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearchType.java
index adf7dc163..849adface 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearchType.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/android/AndroidResearchType.java
@@ -79,10 +79,25 @@ public class AndroidResearchType<T extends AndroidResearch> extends ForgeRegistr
 		return factory.factory(this, capability);
 	}
 
-	public Component getDisplayName() {
-		if (getRegistryName() == null)
-			return new TranslatableComponent("android_research.null.null");
+	private Component displayNameCache;
+	private String displayIdCache;
 
-		return new TranslatableComponent("android_research." + getRegistryName().getNamespace() + "." + getRegistryName().getPath());
+	public Component getDisplayName() {
+		if (displayNameCache == null) {
+			displayNameCache = new TranslatableComponent(getDisplayId());
+		}
+
+		return displayNameCache;
+	}
+
+	public String getDisplayId() {
+		if (displayNameCache == null) {
+			if (getRegistryName() == null)
+				displayIdCache = "android_research.null.null";
+			else
+				displayIdCache = "android_research." + getRegistryName().getNamespace() + "." + getRegistryName().getPath();
+		}
+
+		return displayIdCache;
 	}
 }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt
index 1905cbdde..4d6d931ea 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt
@@ -26,7 +26,13 @@ open class AndroidFeatureType<T : AndroidFeature> : ForgeRegistryEntry<AndroidFe
 
 	open fun isApplicable(android: AndroidCapability) = true
 
-	open val displayName: Component get() = registryName?.let { TranslatableComponent("android_feature.${it.namespace}.${it.path}") } ?: TranslatableComponent("android_feature.null.null")
+	open val displayName: Component by lazy {
+		TranslatableComponent(displayId)
+	}
+
+	open val displayId: String by lazy {
+		registryName?.let { "android_feature.${it.namespace}.${it.path}" } ?: "android_feature.null.null"
+	}
 }
 
 abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: AndroidCapability) : INBTSerializable<CompoundTag> {
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/LazyList.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/LazyList.kt
index cfbb7ef15..00a7ea3a4 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/LazyList.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/LazyList.kt
@@ -1,5 +1,7 @@
 package ru.dbotthepony.mc.otm.registry
 
+import com.google.common.collect.ImmutableSet
+import net.minecraft.world.item.DyeColor
 import net.minecraftforge.registries.IForgeRegistryEntry
 import net.minecraftforge.registries.RegistryObject
 
@@ -12,6 +14,18 @@ class LazyList<T>(private vararg val getters: () -> T) : AbstractList<T>() {
 	}
 }
 
+class LazyMap<K, T>(vararg mValues: Pair<K, () -> T>) : AbstractMap<K, T>() {
+	private inner class Entry(
+		override val key: K,
+		private val getter: () -> T
+	) : Map.Entry<K, T> {
+		override val value: T
+			get() = getter.invoke()
+	}
+
+	override val entries: Set<Map.Entry<K, T>> = ImmutableSet.copyOf(mValues.map { Entry(it.first, it.second) })
+}
+
 class RegistryObjectList<T : IForgeRegistryEntry<T>>(private vararg val getters: RegistryObject<T>) : AbstractList<T>() {
 	constructor(getters: List<RegistryObject<T>>) : this(*getters.toTypedArray())
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt
index 2c473563d..ce0e0cea3 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt
@@ -33,23 +33,7 @@ object MBlockEntities {
 	val BLACK_HOLE: BlockEntityType<*> by registry.register(MNames.BLACK_HOLE) { BlockEntityType.Builder.of(::BlackHoleBlockEntity, MBlocks.BLACK_HOLE).build(null) }
 	val CARGO_CRATE: BlockEntityType<*> by registry.register(MNames.CARGO_CRATE) { BlockEntityType.Builder.of(
 		::CargoCrateBlockEntity,
-		MBlocks.CARGO_CRATE,
-		MBlocks.CARGO_CRATE_WHITE,
-		MBlocks.CARGO_CRATE_ORANGE,
-		MBlocks.CARGO_CRATE_MAGENTA,
-		MBlocks.CARGO_CRATE_LIGHT_BLUE,
-		MBlocks.CARGO_CRATE_YELLOW,
-		MBlocks.CARGO_CRATE_LIME,
-		MBlocks.CARGO_CRATE_PINK,
-		MBlocks.CARGO_CRATE_GRAY,
-		MBlocks.CARGO_CRATE_LIGHT_GRAY,
-		MBlocks.CARGO_CRATE_CYAN,
-		MBlocks.CARGO_CRATE_PURPLE,
-		MBlocks.CARGO_CRATE_BLUE,
-		MBlocks.CARGO_CRATE_BROWN,
-		MBlocks.CARGO_CRATE_GREEN,
-		MBlocks.CARGO_CRATE_RED,
-		MBlocks.CARGO_CRATE_BLACK,
+		*MRegistry.CARGO_CRATES.blocks.toTypedArray()
 	).build(null) }
 	val DRIVE_RACK: BlockEntityType<*> by registry.register(MNames.DRIVE_RACK) { BlockEntityType.Builder.of(::DriveRackBlockEntity, MBlocks.DRIVE_RACK).build(null) }
 	val ITEM_MONITOR: BlockEntityType<*> by registry.register(MNames.ITEM_MONITOR) { BlockEntityType.Builder.of(::ItemMonitorBlockEntity, MBlocks.ITEM_MONITOR).build(null) }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt
index 65e035270..2f79e50be 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlocks.kt
@@ -30,11 +30,11 @@ object MBlocks {
 	private fun registerClient(event: FMLClientSetupEvent) {
 		val translucent = RenderType.translucent()
 
-		for (block in INDUSTRIAL_GLASS_LIST) {
+		for (block in MRegistry.INDUSTRIAL_GLASS.blocks) {
 			ItemBlockRenderTypes.setRenderLayer(block, translucent)
 		}
 
-		for (block in INDUSTRIAL_GLASS_PANE_LIST) {
+		for (block in MRegistry.INDUSTRIAL_GLASS_PANE.blocks) {
 			ItemBlockRenderTypes.setRenderLayer(block, translucent)
 		}
 	}
@@ -91,14 +91,6 @@ object MBlocks {
 			.requiresCorrectToolForDrops()
 	) }
 
-	val TRITANIUM_BLOCK: Block by registry.register(MNames.TRITANIUM_BLOCK) { Block(
-		BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_LIGHT_BLUE)
-			.sound(SoundType.BASALT)
-			.requiresCorrectToolForDrops()
-			.explosionResistance(80f)
-			.strength(4f)
-	) }
-
 	init {
 		MRegistry.TRITANIUM_BLOCK.registerBlocks(registry)
 	}
@@ -111,187 +103,6 @@ object MBlocks {
 			.strength(4f)
 	) }
 
-	val CARBON_FIBRE_BLOCK: Block by registry.register(MNames.CARBON_FIBRE_BLOCK) { Block(
-		BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_LIGHT_BLUE)
-			.sound(SoundType.BASALT)
-			.requiresCorrectToolForDrops()
-			.explosionResistance(40f)
-			.strength(3f)
-	) }
-
-	val VENT: Block by registry.register(MNames.VENT) { Block(
-		BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_LIGHT_BLUE)
-			.sound(SoundType.BASALT)
-			.requiresCorrectToolForDrops()
-			.explosionResistance(20f)
-			.strength(1.5f)
-	) }
-
-	val VENT_ALTERNATIVE: Block by registry.register(MNames.VENT_ALTERNATIVE) { Block(
-		BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_LIGHT_BLUE)
-			.sound(SoundType.BASALT)
-			.requiresCorrectToolForDrops()
-			.explosionResistance(20f)
-			.strength(1.5f)
-	) }
-
-	init {
-		MRegistry.FLOOR_TILES.registerBlocks(registry)
-		MRegistry.VENT.registerBlocks(registry)
-		MRegistry.VENT_ALTERNATIVE.registerBlocks(registry)
-	}
-
-	val CARGO_CRATE: Block by registry.register(MNames.CARGO_CRATE) { CargoCrateBlock(null) }
-	val CARGO_CRATE_WHITE: Block by registry.register(MNames.CARGO_CRATE_WHITE) { CargoCrateBlock(DyeColor.WHITE) }
-	val CARGO_CRATE_ORANGE: Block by registry.register(MNames.CARGO_CRATE_ORANGE) { CargoCrateBlock(DyeColor.ORANGE) }
-	val CARGO_CRATE_MAGENTA: Block by registry.register(MNames.CARGO_CRATE_MAGENTA) { CargoCrateBlock(DyeColor.MAGENTA) }
-	val CARGO_CRATE_LIGHT_BLUE: Block by registry.register(MNames.CARGO_CRATE_LIGHT_BLUE) { CargoCrateBlock(DyeColor.LIGHT_BLUE) }
-	val CARGO_CRATE_YELLOW: Block by registry.register(MNames.CARGO_CRATE_YELLOW) { CargoCrateBlock(DyeColor.YELLOW) }
-	val CARGO_CRATE_LIME: Block by registry.register(MNames.CARGO_CRATE_LIME) { CargoCrateBlock(DyeColor.LIME) }
-	val CARGO_CRATE_PINK: Block by registry.register(MNames.CARGO_CRATE_PINK) { CargoCrateBlock(DyeColor.PINK) }
-	val CARGO_CRATE_GRAY: Block by registry.register(MNames.CARGO_CRATE_GRAY) { CargoCrateBlock(DyeColor.GRAY) }
-	val CARGO_CRATE_LIGHT_GRAY: Block by registry.register(MNames.CARGO_CRATE_LIGHT_GRAY) { CargoCrateBlock(DyeColor.LIGHT_GRAY) }
-	val CARGO_CRATE_CYAN: Block by registry.register(MNames.CARGO_CRATE_CYAN) { CargoCrateBlock(DyeColor.CYAN) }
-	val CARGO_CRATE_PURPLE: Block by registry.register(MNames.CARGO_CRATE_PURPLE) { CargoCrateBlock(DyeColor.PURPLE) }
-	val CARGO_CRATE_BLUE: Block by registry.register(MNames.CARGO_CRATE_BLUE) { CargoCrateBlock(DyeColor.BLUE) }
-	val CARGO_CRATE_BROWN: Block by registry.register(MNames.CARGO_CRATE_BROWN) { CargoCrateBlock(DyeColor.BROWN) }
-	val CARGO_CRATE_GREEN: Block by registry.register(MNames.CARGO_CRATE_GREEN) { CargoCrateBlock(DyeColor.GREEN) }
-	val CARGO_CRATE_RED: Block by registry.register(MNames.CARGO_CRATE_RED) { CargoCrateBlock(DyeColor.RED) }
-	val CARGO_CRATE_BLACK: Block by registry.register(MNames.CARGO_CRATE_BLACK) { CargoCrateBlock(DyeColor.BLACK) }
-
-	val CARGO_CRATES = LazyList(
-		{ CARGO_CRATE },
-		{ CARGO_CRATE_WHITE },
-		{ CARGO_CRATE_ORANGE },
-		{ CARGO_CRATE_MAGENTA },
-		{ CARGO_CRATE_LIGHT_BLUE },
-		{ CARGO_CRATE_YELLOW },
-		{ CARGO_CRATE_LIME },
-		{ CARGO_CRATE_PINK },
-		{ CARGO_CRATE_GRAY },
-		{ CARGO_CRATE_LIGHT_GRAY },
-		{ CARGO_CRATE_CYAN },
-		{ CARGO_CRATE_PURPLE },
-		{ CARGO_CRATE_BLUE },
-		{ CARGO_CRATE_BROWN },
-		{ CARGO_CRATE_GREEN },
-		{ CARGO_CRATE_RED },
-		{ CARGO_CRATE_BLACK },
-	)
-
-	val CARGO_CRATES_COLORED = LazyList(
-		{ CARGO_CRATE_WHITE },
-		{ CARGO_CRATE_ORANGE },
-		{ CARGO_CRATE_MAGENTA },
-		{ CARGO_CRATE_LIGHT_BLUE },
-		{ CARGO_CRATE_YELLOW },
-		{ CARGO_CRATE_LIME },
-		{ CARGO_CRATE_PINK },
-		{ CARGO_CRATE_GRAY },
-		{ CARGO_CRATE_LIGHT_GRAY },
-		{ CARGO_CRATE_CYAN },
-		{ CARGO_CRATE_PURPLE },
-		{ CARGO_CRATE_BLUE },
-		{ CARGO_CRATE_BROWN },
-		{ CARGO_CRATE_GREEN },
-		{ CARGO_CRATE_RED },
-		{ CARGO_CRATE_BLACK },
-	)
-
-	val CRATE_RED: Block by registry.register(MRegistry.CRATE_RED.name) { MRegistry.CRATE_RED.makeBlock() }
-	val CRATE_BLUE: Block by registry.register(MRegistry.CRATE_BLUE.name) { MRegistry.CRATE_BLUE.makeBlock() }
-	val CRATE_YELLOW: Block by registry.register(MRegistry.CRATE_YELLOW.name) { MRegistry.CRATE_YELLOW.makeBlock() }
-	val CRATE_GREEN: Block by registry.register(MRegistry.CRATE_GREEN.name) { MRegistry.CRATE_GREEN.makeBlock() }
-	val CRATE_BLACK: Block by registry.register(MRegistry.CRATE_BLACK.name) { MRegistry.CRATE_BLACK.makeBlock() }
-	val CRATE_PINK: Block by registry.register(MRegistry.CRATE_PINK.name) { MRegistry.CRATE_PINK.makeBlock() }
-	val CRATE_PURPLE: Block by registry.register(MRegistry.CRATE_PURPLE.name) { MRegistry.CRATE_PURPLE.makeBlock() }
-
-	val CRATE_LIST = LazyList(
-		{ CRATE_RED },
-		{ CRATE_BLUE },
-		{ CRATE_YELLOW },
-		{ CRATE_GREEN },
-		{ CRATE_BLACK },
-		{ CRATE_PINK },
-		{ CRATE_PURPLE },
-	)
-
-	val INDUSTRIAL_GLASS: Block by registry.register(MRegistry.INDUSTRIAL_GLASS.name) { MRegistry.INDUSTRIAL_GLASS.makeBlock() }
-	val INDUSTRIAL_GLASS_WHITE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_WHITE.name) { MRegistry.INDUSTRIAL_GLASS_WHITE.makeBlock() }
-	val INDUSTRIAL_GLASS_ORANGE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_ORANGE.name) { MRegistry.INDUSTRIAL_GLASS_ORANGE.makeBlock() }
-	val INDUSTRIAL_GLASS_MAGENTA: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_MAGENTA.name) { MRegistry.INDUSTRIAL_GLASS_MAGENTA.makeBlock() }
-	val INDUSTRIAL_GLASS_LIGHT_BLUE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.name) { MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.makeBlock() }
-	val INDUSTRIAL_GLASS_YELLOW: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_YELLOW.name) { MRegistry.INDUSTRIAL_GLASS_YELLOW.makeBlock() }
-	val INDUSTRIAL_GLASS_LIME: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIME.name) { MRegistry.INDUSTRIAL_GLASS_LIME.makeBlock() }
-	val INDUSTRIAL_GLASS_PINK: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_PINK.name) { MRegistry.INDUSTRIAL_GLASS_PINK.makeBlock() }
-	val INDUSTRIAL_GLASS_GRAY: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_GRAY.name) { MRegistry.INDUSTRIAL_GLASS_GRAY.makeBlock() }
-	val INDUSTRIAL_GLASS_LIGHT_GRAY: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.name) { MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.makeBlock() }
-	val INDUSTRIAL_GLASS_CYAN: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_CYAN.name) { MRegistry.INDUSTRIAL_GLASS_CYAN.makeBlock() }
-	val INDUSTRIAL_GLASS_PURPLE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_PURPLE.name) { MRegistry.INDUSTRIAL_GLASS_PURPLE.makeBlock() }
-	val INDUSTRIAL_GLASS_BLUE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BLUE.name) { MRegistry.INDUSTRIAL_GLASS_BLUE.makeBlock() }
-	val INDUSTRIAL_GLASS_BROWN: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BROWN.name) { MRegistry.INDUSTRIAL_GLASS_BROWN.makeBlock() }
-	val INDUSTRIAL_GLASS_GREEN: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_GREEN.name) { MRegistry.INDUSTRIAL_GLASS_GREEN.makeBlock() }
-	val INDUSTRIAL_GLASS_RED: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_RED.name) { MRegistry.INDUSTRIAL_GLASS_RED.makeBlock() }
-	val INDUSTRIAL_GLASS_BLACK: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BLACK.name) { MRegistry.INDUSTRIAL_GLASS_BLACK.makeBlock() }
-
-	val INDUSTRIAL_GLASS_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS.namePane) { MRegistry.INDUSTRIAL_GLASS.makePaneBlock() }
-	val INDUSTRIAL_GLASS_WHITE_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_WHITE.namePane) { MRegistry.INDUSTRIAL_GLASS_WHITE.makePaneBlock() }
-	val INDUSTRIAL_GLASS_ORANGE_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_ORANGE.namePane) { MRegistry.INDUSTRIAL_GLASS_ORANGE.makePaneBlock() }
-	val INDUSTRIAL_GLASS_MAGENTA_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_MAGENTA.namePane) { MRegistry.INDUSTRIAL_GLASS_MAGENTA.makePaneBlock() }
-	val INDUSTRIAL_GLASS_LIGHT_BLUE_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.namePane) { MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.makePaneBlock() }
-	val INDUSTRIAL_GLASS_YELLOW_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_YELLOW.namePane) { MRegistry.INDUSTRIAL_GLASS_YELLOW.makePaneBlock() }
-	val INDUSTRIAL_GLASS_LIME_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIME.namePane) { MRegistry.INDUSTRIAL_GLASS_LIME.makePaneBlock() }
-	val INDUSTRIAL_GLASS_PINK_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_PINK.namePane) { MRegistry.INDUSTRIAL_GLASS_PINK.makePaneBlock() }
-	val INDUSTRIAL_GLASS_GRAY_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_GRAY.namePane) { MRegistry.INDUSTRIAL_GLASS_GRAY.makePaneBlock() }
-	val INDUSTRIAL_GLASS_LIGHT_GRAY_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.namePane) { MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.makePaneBlock() }
-	val INDUSTRIAL_GLASS_CYAN_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_CYAN.namePane) { MRegistry.INDUSTRIAL_GLASS_CYAN.makePaneBlock() }
-	val INDUSTRIAL_GLASS_PURPLE_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_PURPLE.namePane) { MRegistry.INDUSTRIAL_GLASS_PURPLE.makePaneBlock() }
-	val INDUSTRIAL_GLASS_BLUE_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BLUE.namePane) { MRegistry.INDUSTRIAL_GLASS_BLUE.makePaneBlock() }
-	val INDUSTRIAL_GLASS_BROWN_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BROWN.namePane) { MRegistry.INDUSTRIAL_GLASS_BROWN.makePaneBlock() }
-	val INDUSTRIAL_GLASS_GREEN_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_GREEN.namePane) { MRegistry.INDUSTRIAL_GLASS_GREEN.makePaneBlock() }
-	val INDUSTRIAL_GLASS_RED_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_RED.namePane) { MRegistry.INDUSTRIAL_GLASS_RED.makePaneBlock() }
-	val INDUSTRIAL_GLASS_BLACK_PANE: Block by registry.register(MRegistry.INDUSTRIAL_GLASS_BLACK.namePane) { MRegistry.INDUSTRIAL_GLASS_BLACK.makePaneBlock() }
-
-	val INDUSTRIAL_GLASS_LIST = LazyList(
-		{ INDUSTRIAL_GLASS },
-		{ INDUSTRIAL_GLASS_WHITE },
-		{ INDUSTRIAL_GLASS_ORANGE },
-		{ INDUSTRIAL_GLASS_MAGENTA },
-		{ INDUSTRIAL_GLASS_LIGHT_BLUE },
-		{ INDUSTRIAL_GLASS_YELLOW },
-		{ INDUSTRIAL_GLASS_LIME },
-		{ INDUSTRIAL_GLASS_PINK },
-		{ INDUSTRIAL_GLASS_GRAY },
-		{ INDUSTRIAL_GLASS_LIGHT_GRAY },
-		{ INDUSTRIAL_GLASS_CYAN },
-		{ INDUSTRIAL_GLASS_PURPLE },
-		{ INDUSTRIAL_GLASS_BLUE },
-		{ INDUSTRIAL_GLASS_BROWN },
-		{ INDUSTRIAL_GLASS_GREEN },
-		{ INDUSTRIAL_GLASS_RED },
-		{ INDUSTRIAL_GLASS_BLACK },
-	)
-
-	val INDUSTRIAL_GLASS_PANE_LIST = LazyList(
-		{ INDUSTRIAL_GLASS_PANE },
-		{ INDUSTRIAL_GLASS_WHITE_PANE },
-		{ INDUSTRIAL_GLASS_ORANGE_PANE },
-		{ INDUSTRIAL_GLASS_MAGENTA_PANE },
-		{ INDUSTRIAL_GLASS_LIGHT_BLUE_PANE },
-		{ INDUSTRIAL_GLASS_YELLOW_PANE },
-		{ INDUSTRIAL_GLASS_LIME_PANE },
-		{ INDUSTRIAL_GLASS_PINK_PANE },
-		{ INDUSTRIAL_GLASS_GRAY_PANE },
-		{ INDUSTRIAL_GLASS_LIGHT_GRAY_PANE },
-		{ INDUSTRIAL_GLASS_CYAN_PANE },
-		{ INDUSTRIAL_GLASS_PURPLE_PANE },
-		{ INDUSTRIAL_GLASS_BLUE_PANE },
-		{ INDUSTRIAL_GLASS_BROWN_PANE },
-		{ INDUSTRIAL_GLASS_GREEN_PANE },
-		{ INDUSTRIAL_GLASS_RED_PANE },
-		{ INDUSTRIAL_GLASS_BLACK_PANE },
-	)
-
 	val TRITANIUM_STRIPED_BLOCKS: LazyList<Block>
 	// слишком лень было разбираться дальше ибо деление индекса на 15 не работало
 	val TRITANIUM_STRIPED_BLOCKS_COLORS: List<String>
@@ -341,4 +152,40 @@ object MBlocks {
 		TRITANIUM_STRIPED_BLOCKS = LazyList(*listing.toTypedArray())
 		TRITANIUM_STRIPED_BLOCKS_COLORS = ImmutableList.copyOf(listingColors)
 	}
+
+	val CARBON_FIBRE_BLOCK: Block by registry.register(MNames.CARBON_FIBRE_BLOCK) { Block(
+		BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_LIGHT_BLUE)
+			.sound(SoundType.BASALT)
+			.requiresCorrectToolForDrops()
+			.explosionResistance(40f)
+			.strength(3f)
+	) }
+
+	init {
+		MRegistry.CARGO_CRATES.registerBlocks(registry)
+
+		MRegistry.INDUSTRIAL_GLASS.registerBlocks(registry)
+		MRegistry.INDUSTRIAL_GLASS_PANE.registerBlocks(registry)
+		MRegistry.FLOOR_TILES.registerBlocks(registry)
+		MRegistry.VENT.registerBlocks(registry)
+		MRegistry.VENT_ALTERNATIVE.registerBlocks(registry)
+	}
+
+	val CRATE_RED: Block by registry.register(MRegistry.CRATE_RED.name) { MRegistry.CRATE_RED.makeBlock() }
+	val CRATE_BLUE: Block by registry.register(MRegistry.CRATE_BLUE.name) { MRegistry.CRATE_BLUE.makeBlock() }
+	val CRATE_YELLOW: Block by registry.register(MRegistry.CRATE_YELLOW.name) { MRegistry.CRATE_YELLOW.makeBlock() }
+	val CRATE_GREEN: Block by registry.register(MRegistry.CRATE_GREEN.name) { MRegistry.CRATE_GREEN.makeBlock() }
+	val CRATE_BLACK: Block by registry.register(MRegistry.CRATE_BLACK.name) { MRegistry.CRATE_BLACK.makeBlock() }
+	val CRATE_PINK: Block by registry.register(MRegistry.CRATE_PINK.name) { MRegistry.CRATE_PINK.makeBlock() }
+	val CRATE_PURPLE: Block by registry.register(MRegistry.CRATE_PURPLE.name) { MRegistry.CRATE_PURPLE.makeBlock() }
+
+	val CRATE_LIST = LazyList(
+		{ CRATE_RED },
+		{ CRATE_BLUE },
+		{ CRATE_YELLOW },
+		{ CRATE_GREEN },
+		{ CRATE_BLACK },
+		{ CRATE_PINK },
+		{ CRATE_PURPLE },
+	)
 }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt
index ca3bf380d..40f119817 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt
@@ -237,156 +237,13 @@ object MItems {
 		{ CRATE_PURPLE },
 	)
 
-	val CARGO_CRATE: Item by registry.register(MNames.CARGO_CRATE) { BlockItem(MBlocks.CARGO_CRATE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_WHITE: Item by registry.register(MNames.CARGO_CRATE_WHITE) { BlockItem(MBlocks.CARGO_CRATE_WHITE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_ORANGE: Item by registry.register(MNames.CARGO_CRATE_ORANGE) { BlockItem(MBlocks.CARGO_CRATE_ORANGE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_MAGENTA: Item by registry.register(MNames.CARGO_CRATE_MAGENTA) { BlockItem(MBlocks.CARGO_CRATE_MAGENTA, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_LIGHT_BLUE: Item by registry.register(MNames.CARGO_CRATE_LIGHT_BLUE) { BlockItem(MBlocks.CARGO_CRATE_LIGHT_BLUE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_YELLOW: Item by registry.register(MNames.CARGO_CRATE_YELLOW) { BlockItem(MBlocks.CARGO_CRATE_YELLOW, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_LIME: Item by registry.register(MNames.CARGO_CRATE_LIME) { BlockItem(MBlocks.CARGO_CRATE_LIME, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_PINK: Item by registry.register(MNames.CARGO_CRATE_PINK) { BlockItem(MBlocks.CARGO_CRATE_PINK, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_GRAY: Item by registry.register(MNames.CARGO_CRATE_GRAY) { BlockItem(MBlocks.CARGO_CRATE_GRAY, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_LIGHT_GRAY: Item by registry.register(MNames.CARGO_CRATE_LIGHT_GRAY) { BlockItem(MBlocks.CARGO_CRATE_LIGHT_GRAY, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_CYAN: Item by registry.register(MNames.CARGO_CRATE_CYAN) { BlockItem(MBlocks.CARGO_CRATE_CYAN, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_PURPLE: Item by registry.register(MNames.CARGO_CRATE_PURPLE) { BlockItem(MBlocks.CARGO_CRATE_PURPLE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_BLUE: Item by registry.register(MNames.CARGO_CRATE_BLUE) { BlockItem(MBlocks.CARGO_CRATE_BLUE, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_BROWN: Item by registry.register(MNames.CARGO_CRATE_BROWN) { BlockItem(MBlocks.CARGO_CRATE_BROWN, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_GREEN: Item by registry.register(MNames.CARGO_CRATE_GREEN) { BlockItem(MBlocks.CARGO_CRATE_GREEN, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_RED: Item by registry.register(MNames.CARGO_CRATE_RED) { BlockItem(MBlocks.CARGO_CRATE_RED, DEFAULT_PROPERTIES) }
-	val CARGO_CRATE_BLACK: Item by registry.register(MNames.CARGO_CRATE_BLACK) { BlockItem(MBlocks.CARGO_CRATE_BLACK, DEFAULT_PROPERTIES) }
-
-	val CARGO_CRATES = LazyList(
-		{ CARGO_CRATE },
-		{ CARGO_CRATE_WHITE },
-		{ CARGO_CRATE_ORANGE },
-		{ CARGO_CRATE_MAGENTA },
-		{ CARGO_CRATE_LIGHT_BLUE },
-		{ CARGO_CRATE_YELLOW },
-		{ CARGO_CRATE_LIME },
-		{ CARGO_CRATE_PINK },
-		{ CARGO_CRATE_GRAY },
-		{ CARGO_CRATE_LIGHT_GRAY },
-		{ CARGO_CRATE_CYAN },
-		{ CARGO_CRATE_PURPLE },
-		{ CARGO_CRATE_BLUE },
-		{ CARGO_CRATE_BROWN },
-		{ CARGO_CRATE_GREEN },
-		{ CARGO_CRATE_RED },
-		{ CARGO_CRATE_BLACK },
-	)
-
-	val CARGO_CRATES_COLORED = LazyList(
-		{ CARGO_CRATE_WHITE },
-		{ CARGO_CRATE_ORANGE },
-		{ CARGO_CRATE_MAGENTA },
-		{ CARGO_CRATE_LIGHT_BLUE },
-		{ CARGO_CRATE_YELLOW },
-		{ CARGO_CRATE_LIME },
-		{ CARGO_CRATE_PINK },
-		{ CARGO_CRATE_GRAY },
-		{ CARGO_CRATE_LIGHT_GRAY },
-		{ CARGO_CRATE_CYAN },
-		{ CARGO_CRATE_PURPLE },
-		{ CARGO_CRATE_BLUE },
-		{ CARGO_CRATE_BROWN },
-		{ CARGO_CRATE_GREEN },
-		{ CARGO_CRATE_RED },
-		{ CARGO_CRATE_BLACK },
-	)
-
-	val TRITANIUM_BLOCK: Item by registry.register(MNames.TRITANIUM_BLOCK) { BlockItem(MBlocks.TRITANIUM_BLOCK, DEFAULT_PROPERTIES_DECORATIVE) }
-
 	init {
+		MRegistry.CARGO_CRATES.registerItems(registry)
+
 		MRegistry.TRITANIUM_BLOCK.registerItems(registry)
 	}
 
-	val VENT: Item by registry.register(MNames.VENT) { BlockItem(MBlocks.VENT, DEFAULT_PROPERTIES_DECORATIVE) }
-	val VENT_ALTERNATIVE: Item by registry.register(MNames.VENT_ALTERNATIVE) { BlockItem(MBlocks.VENT_ALTERNATIVE, DEFAULT_PROPERTIES_DECORATIVE) }
-
 	val TRITANIUM_STRIPED_BLOCK: Item by registry.register(MNames.TRITANIUM_STRIPED_BLOCK) { BlockItem(MBlocks.TRITANIUM_STRIPED_BLOCK, DEFAULT_PROPERTIES_DECORATIVE) }
-	val CARBON_FIBRE_BLOCK: Item by registry.register(MNames.CARBON_FIBRE_BLOCK) { BlockItem(MBlocks.CARBON_FIBRE_BLOCK, DEFAULT_PROPERTIES_DECORATIVE) }
-
-	init {
-		MRegistry.FLOOR_TILES.registerItems(registry)
-		MRegistry.VENT.registerItems(registry)
-		MRegistry.VENT_ALTERNATIVE.registerItems(registry)
-	}
-
-	val INDUSTRIAL_GLASS: Item by registry.register(MRegistry.INDUSTRIAL_GLASS.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_WHITE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_WHITE.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_WHITE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_ORANGE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_ORANGE.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_ORANGE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_MAGENTA: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_MAGENTA.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_MAGENTA, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIGHT_BLUE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIGHT_BLUE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_YELLOW: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_YELLOW.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_YELLOW, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIME: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIME.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIME, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_PINK: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_PINK.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_PINK, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_GRAY: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_GRAY.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_GRAY, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIGHT_GRAY: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIGHT_GRAY, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_CYAN: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_CYAN.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_CYAN, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_PURPLE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_PURPLE.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_PURPLE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BLUE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BLUE.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BLUE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BROWN: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BROWN.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BROWN, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_GREEN: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_GREEN.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_GREEN, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_RED: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_RED.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_RED, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BLACK: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BLACK.name) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BLACK, DEFAULT_PROPERTIES_DECORATIVE) }
-
-	val INDUSTRIAL_GLASS_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_WHITE_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_WHITE.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_WHITE_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_ORANGE_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_ORANGE.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_ORANGE_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_MAGENTA_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_MAGENTA.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_MAGENTA_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIGHT_BLUE_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_BLUE.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIGHT_BLUE_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_YELLOW_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_YELLOW.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_YELLOW_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIME_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIME.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIME_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_PINK_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_PINK.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_PINK_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_GRAY_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_GRAY.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_GRAY_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_LIGHT_GRAY_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_LIGHT_GRAY.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_LIGHT_GRAY_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_CYAN_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_CYAN.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_CYAN_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_PURPLE_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_PURPLE.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_PURPLE_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BLUE_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BLUE.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BLUE_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BROWN_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BROWN.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BROWN_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_GREEN_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_GREEN.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_GREEN_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_RED_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_RED.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_RED_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-	val INDUSTRIAL_GLASS_BLACK_PANE: Item by registry.register(MRegistry.INDUSTRIAL_GLASS_BLACK.namePane) { BlockItem(MBlocks.INDUSTRIAL_GLASS_BLACK_PANE, DEFAULT_PROPERTIES_DECORATIVE) }
-
-	val INDUSTRIAL_GLASS_LIST = LazyList(
-		{ INDUSTRIAL_GLASS },
-		{ INDUSTRIAL_GLASS_WHITE },
-		{ INDUSTRIAL_GLASS_ORANGE },
-		{ INDUSTRIAL_GLASS_MAGENTA },
-		{ INDUSTRIAL_GLASS_LIGHT_BLUE },
-		{ INDUSTRIAL_GLASS_YELLOW },
-		{ INDUSTRIAL_GLASS_LIME },
-		{ INDUSTRIAL_GLASS_PINK },
-		{ INDUSTRIAL_GLASS_GRAY },
-		{ INDUSTRIAL_GLASS_LIGHT_GRAY },
-		{ INDUSTRIAL_GLASS_CYAN },
-		{ INDUSTRIAL_GLASS_PURPLE },
-		{ INDUSTRIAL_GLASS_BLUE },
-		{ INDUSTRIAL_GLASS_BROWN },
-		{ INDUSTRIAL_GLASS_GREEN },
-		{ INDUSTRIAL_GLASS_RED },
-		{ INDUSTRIAL_GLASS_BLACK },
-	)
-
-	val INDUSTRIAL_GLASS_PANE_LIST = LazyList(
-		{ INDUSTRIAL_GLASS_PANE },
-		{ INDUSTRIAL_GLASS_WHITE_PANE },
-		{ INDUSTRIAL_GLASS_ORANGE_PANE },
-		{ INDUSTRIAL_GLASS_MAGENTA_PANE },
-		{ INDUSTRIAL_GLASS_LIGHT_BLUE_PANE },
-		{ INDUSTRIAL_GLASS_YELLOW_PANE },
-		{ INDUSTRIAL_GLASS_LIME_PANE },
-		{ INDUSTRIAL_GLASS_PINK_PANE },
-		{ INDUSTRIAL_GLASS_GRAY_PANE },
-		{ INDUSTRIAL_GLASS_LIGHT_GRAY_PANE },
-		{ INDUSTRIAL_GLASS_CYAN_PANE },
-		{ INDUSTRIAL_GLASS_PURPLE_PANE },
-		{ INDUSTRIAL_GLASS_BLUE_PANE },
-		{ INDUSTRIAL_GLASS_BROWN_PANE },
-		{ INDUSTRIAL_GLASS_GREEN_PANE },
-		{ INDUSTRIAL_GLASS_RED_PANE },
-		{ INDUSTRIAL_GLASS_BLACK_PANE },
-	)
 
 	val TRITANIUM_STRIPED_BLOCKS: LazyList<Item>
 
@@ -431,4 +288,15 @@ object MItems {
 
 		TRITANIUM_STRIPED_BLOCKS = LazyList(*listing.toTypedArray())
 	}
+
+	val CARBON_FIBRE_BLOCK: Item by registry.register(MNames.CARBON_FIBRE_BLOCK) { BlockItem(MBlocks.CARBON_FIBRE_BLOCK, DEFAULT_PROPERTIES_DECORATIVE) }
+
+	init {
+		MRegistry.INDUSTRIAL_GLASS.registerItems(registry)
+		MRegistry.INDUSTRIAL_GLASS_PANE.registerItems(registry)
+		MRegistry.FLOOR_TILES.registerItems(registry)
+		MRegistry.VENT.registerItems(registry)
+		MRegistry.VENT_ALTERNATIVE.registerItems(registry)
+	}
+
 }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
index 1bf52c07c..11587e8bf 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
@@ -60,6 +60,9 @@ object MNames {
 	const val TRITANIUM_BLOCK = "tritanium_block"
 	const val TRITANIUM_STRIPED_BLOCK = "tritanium_striped_block"
 
+	const val INDUSTRIAL_GLASS = "industrial_glass"
+	const val INDUSTRIAL_GLASS_PANE = "industrial_glass_pane"
+
 	const val CARBON_FIBRE_BLOCK = "carbon_fibre_block"
 
 	const val FLOOR_TILES = "floor_tiles"
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt
index 52c1e89c6..4f326bd43 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt
@@ -5,6 +5,7 @@ import net.minecraft.resources.ResourceLocation
 import net.minecraft.world.damagesource.DamageSource
 import net.minecraft.world.entity.EntityType
 import net.minecraft.world.item.BlockItem
+import net.minecraft.world.item.CreativeModeTab
 import net.minecraft.world.item.DyeColor
 import net.minecraft.world.item.Item
 import net.minecraft.world.level.BlockGetter
@@ -23,9 +24,8 @@ import net.minecraftforge.registries.RegistryObject
 import ru.dbotthepony.mc.otm.OverdriveThatMatters
 import ru.dbotthepony.mc.otm.android.AndroidFeatureType
 import ru.dbotthepony.mc.otm.android.AndroidResearchType
+import ru.dbotthepony.mc.otm.block.CargoCrateBlock
 import java.util.function.Supplier
-import kotlin.properties.Delegates
-import kotlin.properties.ReadOnlyProperty
 import kotlin.properties.ReadWriteProperty
 import kotlin.reflect.KProperty
 
@@ -38,42 +38,6 @@ class CrateProperties(val color: MaterialColor, val name: String) {
 	}
 }
 
-class IndustrialGlassProperties(val color: DyeColor?, val name: String, val namePane: String) {
-	constructor(color: DyeColor?) : this(color, "industrial_glass${color?.let { "_$it" } ?: ""}", "industrial_glass_pane${color?.let { "_$it" } ?: ""}")
-
-	fun makeBlock(): Block {
-		val properties = BlockBehaviour.Properties.of(Material.GLASS, if (color != null) color.materialColor else MaterialColor.NONE)
-				.strength(1.5f, 35.0f)
-				.requiresCorrectToolForDrops()
-				.sound(SoundType.GLASS)
-				.noOcclusion()
-				.isValidSpawn { _: BlockState, _: BlockGetter, _: BlockPos, _: EntityType<*>? -> false }
-				.isRedstoneConductor { _: BlockState, _: BlockGetter, _: BlockPos -> false }
-				.isSuffocating { _: BlockState, _: BlockGetter, _: BlockPos -> false }
-				.isViewBlocking { _: BlockState, _: BlockGetter, _: BlockPos -> false }
-
-		if (color != null) {
-			return StainedGlassBlock(color, properties)
-		}
-
-		return GlassBlock(properties)
-	}
-
-	fun makePaneBlock(): Block {
-		val properties = BlockBehaviour.Properties.of(Material.GLASS, if (color != null) color.materialColor else MaterialColor.NONE)
-			.strength(1.25f, 5.0f)
-			.requiresCorrectToolForDrops()
-			.sound(SoundType.GLASS)
-			.noOcclusion()
-
-		if (color != null) {
-			return StainedGlassPaneBlock(color, properties)
-		}
-
-		return IronBarsBlock(properties)
-	}
-}
-
 private class RegistryDelegate<V>(private val name: String) {
 	private var value: Supplier<V>? = null
 
@@ -107,26 +71,44 @@ private class WriteOnce<V> : ReadWriteProperty<Any, V> {
 	}
 }
 
-class ColoredDecorativeBlock(
+@Suppress("PropertyName", "unused")
+open class ColoredDecorativeBlock(
 	val baseName: String,
-	private val propertySupplier: (DyeColor) -> BlockBehaviour.Properties
+	private val provider: (DyeColor) -> Block,
+	val itemGroup: CreativeModeTab = OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE
 ) {
-	private var _whiteBlock: RegistryObject<Block> by WriteOnce()
-	private var _orangeBlock: RegistryObject<Block> by WriteOnce()
-	private var _magentaBlock: RegistryObject<Block> by WriteOnce()
-	private var _lightBlueBlock: RegistryObject<Block> by WriteOnce()
-	private var _yellowBlock: RegistryObject<Block> by WriteOnce()
-	private var _limeBlock: RegistryObject<Block> by WriteOnce()
-	private var _pinkBlock: RegistryObject<Block> by WriteOnce()
-	private var _grayBlock: RegistryObject<Block> by WriteOnce()
-	private var _lightGrayBlock: RegistryObject<Block> by WriteOnce()
-	private var _cyanBlock: RegistryObject<Block> by WriteOnce()
-	private var _purpleBlock: RegistryObject<Block> by WriteOnce()
-	private var _blueBlock: RegistryObject<Block> by WriteOnce()
-	private var _brownBlock: RegistryObject<Block> by WriteOnce()
-	private var _greenBlock: RegistryObject<Block> by WriteOnce()
-	private var _redBlock: RegistryObject<Block> by WriteOnce()
-	private var _blackBlock: RegistryObject<Block> by WriteOnce()
+	protected var _whiteBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _orangeBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _magentaBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _lightBlueBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _yellowBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _limeBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _pinkBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _grayBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _lightGrayBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _cyanBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _purpleBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _blueBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _brownBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _greenBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _redBlock: RegistryObject<Block> by WriteOnce()
+		private set
+	protected var _blackBlock: RegistryObject<Block> by WriteOnce()
+		private set
 
 	val whiteBlock: Block get() = _whiteBlock.get()
 	val orangeBlock: Block get() = _orangeBlock.get()
@@ -145,22 +127,38 @@ class ColoredDecorativeBlock(
 	val redBlock: Block get() = _redBlock.get()
 	val blackBlock: Block get() = _blackBlock.get()
 
-	private var _whiteItem: RegistryObject<Item> by WriteOnce()
-	private var _orangeItem: RegistryObject<Item> by WriteOnce()
-	private var _magentaItem: RegistryObject<Item> by WriteOnce()
-	private var _lightBlueItem: RegistryObject<Item> by WriteOnce()
-	private var _yellowItem: RegistryObject<Item> by WriteOnce()
-	private var _limeItem: RegistryObject<Item> by WriteOnce()
-	private var _pinkItem: RegistryObject<Item> by WriteOnce()
-	private var _grayItem: RegistryObject<Item> by WriteOnce()
-	private var _lightGrayItem: RegistryObject<Item> by WriteOnce()
-	private var _cyanItem: RegistryObject<Item> by WriteOnce()
-	private var _purpleItem: RegistryObject<Item> by WriteOnce()
-	private var _blueItem: RegistryObject<Item> by WriteOnce()
-	private var _brownItem: RegistryObject<Item> by WriteOnce()
-	private var _greenItem: RegistryObject<Item> by WriteOnce()
-	private var _redItem: RegistryObject<Item> by WriteOnce()
-	private var _blackItem: RegistryObject<Item> by WriteOnce()
+	protected var _whiteItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _orangeItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _magentaItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _lightBlueItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _yellowItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _limeItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _pinkItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _grayItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _lightGrayItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _cyanItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _purpleItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _blueItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _brownItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _greenItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _redItem: RegistryObject<Item> by WriteOnce()
+		private set
+	protected var _blackItem: RegistryObject<Item> by WriteOnce()
+		private set
 
 	val whiteItem: Item get() = _whiteItem.get()
 	val orangeItem: Item get() = _orangeItem.get()
@@ -179,80 +177,214 @@ class ColoredDecorativeBlock(
 	val redItem: Item get() = _redItem.get()
 	val blackItem: Item get() = _blackItem.get()
 
-	val blocks = LazyList(
-		{ _whiteBlock.get() },
-		{ _orangeBlock.get() },
-		{ _magentaBlock.get() },
-		{ _lightBlueBlock.get() },
-		{ _yellowBlock.get() },
-		{ _limeBlock.get() },
-		{ _pinkBlock.get() },
-		{ _grayBlock.get() },
-		{ _lightGrayBlock.get() },
-		{ _cyanBlock.get() },
-		{ _purpleBlock.get() },
-		{ _blueBlock.get() },
-		{ _brownBlock.get() },
-		{ _greenBlock.get() },
-		{ _redBlock.get() },
-		{ _blackBlock.get() },
-	)
-
-	val items = LazyList(
-		{ _whiteItem.get() },
-		{ _orangeItem.get() },
-		{ _magentaItem.get() },
-		{ _lightBlueItem.get() },
-		{ _yellowItem.get() },
-		{ _limeItem.get() },
-		{ _pinkItem.get() },
-		{ _grayItem.get() },
-		{ _lightGrayItem.get() },
-		{ _cyanItem.get() },
-		{ _purpleItem.get() },
-		{ _blueItem.get() },
-		{ _brownItem.get() },
-		{ _greenItem.get() },
-		{ _redItem.get() },
-		{ _blackItem.get() },
-	)
-
-	fun registerBlocks(registry: DeferredRegister<Block>) {
-		_whiteBlock = registry.register("${baseName}_white") { Block(propertySupplier.invoke(DyeColor.WHITE)) }
-		_orangeBlock = registry.register("${baseName}_orange") { Block(propertySupplier.invoke(DyeColor.ORANGE)) }
-		_magentaBlock = registry.register("${baseName}_magenta") { Block(propertySupplier.invoke(DyeColor.MAGENTA)) }
-		_lightBlueBlock = registry.register("${baseName}_light_blue") { Block(propertySupplier.invoke(DyeColor.LIGHT_BLUE)) }
-		_yellowBlock = registry.register("${baseName}_yellow") { Block(propertySupplier.invoke(DyeColor.YELLOW)) }
-		_limeBlock = registry.register("${baseName}_lime") { Block(propertySupplier.invoke(DyeColor.LIME)) }
-		_pinkBlock = registry.register("${baseName}_pink") { Block(propertySupplier.invoke(DyeColor.PINK)) }
-		_grayBlock = registry.register("${baseName}_gray") { Block(propertySupplier.invoke(DyeColor.GRAY)) }
-		_lightGrayBlock = registry.register("${baseName}_light_gray") { Block(propertySupplier.invoke(DyeColor.LIGHT_GRAY)) }
-		_cyanBlock = registry.register("${baseName}_cyan") { Block(propertySupplier.invoke(DyeColor.CYAN)) }
-		_purpleBlock = registry.register("${baseName}_purple") { Block(propertySupplier.invoke(DyeColor.PURPLE)) }
-		_blueBlock = registry.register("${baseName}_blue") { Block(propertySupplier.invoke(DyeColor.BLUE)) }
-		_brownBlock = registry.register("${baseName}_brown") { Block(propertySupplier.invoke(DyeColor.BROWN)) }
-		_greenBlock = registry.register("${baseName}_green") { Block(propertySupplier.invoke(DyeColor.GREEN)) }
-		_redBlock = registry.register("${baseName}_red") { Block(propertySupplier.invoke(DyeColor.RED)) }
-		_blackBlock = registry.register("${baseName}_black") { Block(propertySupplier.invoke(DyeColor.BLACK)) }
+	val coloredBlocks: List<Block> by lazy {
+		LazyList(
+			_whiteBlock::get,
+			_orangeBlock::get,
+			_magentaBlock::get,
+			_lightBlueBlock::get,
+			_yellowBlock::get,
+			_limeBlock::get,
+			_pinkBlock::get,
+			_grayBlock::get,
+			_lightGrayBlock::get,
+			_cyanBlock::get,
+			_purpleBlock::get,
+			_blueBlock::get,
+			_brownBlock::get,
+			_greenBlock::get,
+			_redBlock::get,
+			_blackBlock::get,
+		)
 	}
 
-	fun registerItems(registry: DeferredRegister<Item>) {
-		_whiteItem = registry.register("${baseName}_white") { BlockItem(_whiteBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_orangeItem = registry.register("${baseName}_orange") { BlockItem(_orangeBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_magentaItem = registry.register("${baseName}_magenta") { BlockItem(_magentaBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_lightBlueItem = registry.register("${baseName}_light_blue") { BlockItem(_lightBlueBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_yellowItem = registry.register("${baseName}_yellow") { BlockItem(_yellowBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_limeItem = registry.register("${baseName}_lime") { BlockItem(_limeBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_pinkItem = registry.register("${baseName}_pink") { BlockItem(_pinkBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_grayItem = registry.register("${baseName}_gray") { BlockItem(_grayBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_lightGrayItem = registry.register("${baseName}_light_gray") { BlockItem(_lightGrayBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_cyanItem = registry.register("${baseName}_cyan") { BlockItem(_cyanBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_purpleItem = registry.register("${baseName}_purple") { BlockItem(_purpleBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_blueItem = registry.register("${baseName}_blue") { BlockItem(_blueBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_brownItem = registry.register("${baseName}_brown") { BlockItem(_brownBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_greenItem = registry.register("${baseName}_green") { BlockItem(_greenBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_redItem = registry.register("${baseName}_red") { BlockItem(_redBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
-		_blackItem = registry.register("${baseName}_black") { BlockItem(_blackBlock.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
+	val mappedColoredBlocks: Map<DyeColor, Block> by lazy {
+		LazyMap(
+			DyeColor.WHITE to 			_whiteBlock::get,
+			DyeColor.ORANGE to 			_orangeBlock::get,
+			DyeColor.MAGENTA to 		_magentaBlock::get,
+			DyeColor.LIGHT_BLUE to 		_lightBlueBlock::get,
+			DyeColor.YELLOW to 			_yellowBlock::get,
+			DyeColor.LIME to 			_limeBlock::get,
+			DyeColor.PINK to 			_pinkBlock::get,
+			DyeColor.GRAY to 			_grayBlock::get,
+			DyeColor.LIGHT_GRAY to 		_lightGrayBlock::get,
+			DyeColor.CYAN to 			_cyanBlock::get,
+			DyeColor.PURPLE to 			_purpleBlock::get,
+			DyeColor.BLUE to 			_blueBlock::get,
+			DyeColor.BROWN to 			_brownBlock::get,
+			DyeColor.GREEN to 			_greenBlock::get,
+			DyeColor.RED to 			_redBlock::get,
+			DyeColor.BLACK to 			_blackBlock::get,
+		)
+	}
+
+	val coloredItems: List<Item> by lazy {
+		LazyList(
+			_whiteItem::get,
+			_orangeItem::get,
+			_magentaItem::get,
+			_lightBlueItem::get,
+			_yellowItem::get,
+			_limeItem::get,
+			_pinkItem::get,
+			_grayItem::get,
+			_lightGrayItem::get,
+			_cyanItem::get,
+			_purpleItem::get,
+			_blueItem::get,
+			_brownItem::get,
+			_greenItem::get,
+			_redItem::get,
+			_blackItem::get,
+		)
+	}
+
+	val mappedColoredItems: Map<DyeColor, Item> by lazy {
+		LazyMap(
+			DyeColor.WHITE to			_whiteItem::get,
+			DyeColor.ORANGE to			_orangeItem::get,
+			DyeColor.MAGENTA to			_magentaItem::get,
+			DyeColor.LIGHT_BLUE to		_lightBlueItem::get,
+			DyeColor.YELLOW to			_yellowItem::get,
+			DyeColor.LIME to			_limeItem::get,
+			DyeColor.PINK to			_pinkItem::get,
+			DyeColor.GRAY to			_grayItem::get,
+			DyeColor.LIGHT_GRAY to		_lightGrayItem::get,
+			DyeColor.CYAN to			_cyanItem::get,
+			DyeColor.PURPLE to			_purpleItem::get,
+			DyeColor.BLUE to			_blueItem::get,
+			DyeColor.BROWN to			_brownItem::get,
+			DyeColor.GREEN to			_greenItem::get,
+			DyeColor.RED to				_redItem::get,
+			DyeColor.BLACK to			_blackItem::get,
+		)
+	}
+
+	open fun registerBlocks(registry: DeferredRegister<Block>) {
+		_whiteBlock = registry.register("${baseName}_white") { provider.invoke(DyeColor.WHITE) }
+		_orangeBlock = registry.register("${baseName}_orange") { provider.invoke(DyeColor.ORANGE) }
+		_magentaBlock = registry.register("${baseName}_magenta") { provider.invoke(DyeColor.MAGENTA) }
+		_lightBlueBlock = registry.register("${baseName}_light_blue") { provider.invoke(DyeColor.LIGHT_BLUE) }
+		_yellowBlock = registry.register("${baseName}_yellow") { provider.invoke(DyeColor.YELLOW) }
+		_limeBlock = registry.register("${baseName}_lime") { provider.invoke(DyeColor.LIME) }
+		_pinkBlock = registry.register("${baseName}_pink") { provider.invoke(DyeColor.PINK) }
+		_grayBlock = registry.register("${baseName}_gray") { provider.invoke(DyeColor.GRAY) }
+		_lightGrayBlock = registry.register("${baseName}_light_gray") { provider.invoke(DyeColor.LIGHT_GRAY) }
+		_cyanBlock = registry.register("${baseName}_cyan") { provider.invoke(DyeColor.CYAN) }
+		_purpleBlock = registry.register("${baseName}_purple") { provider.invoke(DyeColor.PURPLE) }
+		_blueBlock = registry.register("${baseName}_blue") { provider.invoke(DyeColor.BLUE) }
+		_brownBlock = registry.register("${baseName}_brown") { provider.invoke(DyeColor.BROWN) }
+		_greenBlock = registry.register("${baseName}_green") { provider.invoke(DyeColor.GREEN) }
+		_redBlock = registry.register("${baseName}_red") { provider.invoke(DyeColor.RED) }
+		_blackBlock = registry.register("${baseName}_black") { provider.invoke(DyeColor.BLACK) }
+	}
+
+	private val properties = Item.Properties().tab(itemGroup).stacksTo(64)
+
+	open fun registerItems(registry: DeferredRegister<Item>) {
+		_whiteItem = registry.register("${baseName}_white") { BlockItem(_whiteBlock.get(), properties) }
+		_orangeItem = registry.register("${baseName}_orange") { BlockItem(_orangeBlock.get(), properties) }
+		_magentaItem = registry.register("${baseName}_magenta") { BlockItem(_magentaBlock.get(), properties) }
+		_lightBlueItem = registry.register("${baseName}_light_blue") { BlockItem(_lightBlueBlock.get(), properties) }
+		_yellowItem = registry.register("${baseName}_yellow") { BlockItem(_yellowBlock.get(), properties) }
+		_limeItem = registry.register("${baseName}_lime") { BlockItem(_limeBlock.get(), properties) }
+		_pinkItem = registry.register("${baseName}_pink") { BlockItem(_pinkBlock.get(), properties) }
+		_grayItem = registry.register("${baseName}_gray") { BlockItem(_grayBlock.get(), properties) }
+		_lightGrayItem = registry.register("${baseName}_light_gray") { BlockItem(_lightGrayBlock.get(), properties) }
+		_cyanItem = registry.register("${baseName}_cyan") { BlockItem(_cyanBlock.get(), properties) }
+		_purpleItem = registry.register("${baseName}_purple") { BlockItem(_purpleBlock.get(), properties) }
+		_blueItem = registry.register("${baseName}_blue") { BlockItem(_blueBlock.get(), properties) }
+		_brownItem = registry.register("${baseName}_brown") { BlockItem(_brownBlock.get(), properties) }
+		_greenItem = registry.register("${baseName}_green") { BlockItem(_greenBlock.get(), properties) }
+		_redItem = registry.register("${baseName}_red") { BlockItem(_redBlock.get(), properties) }
+		_blackItem = registry.register("${baseName}_black") { BlockItem(_blackBlock.get(), properties) }
+	}
+
+	companion object {
+		fun simple(baseName: String, provider: (DyeColor) -> BlockBehaviour.Properties, itemGroup: CreativeModeTab = OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE): ColoredDecorativeBlock {
+			return ColoredDecorativeBlock(baseName, {
+				Block(provider.invoke(it))
+			}, itemGroup)
+		}
+	}
+}
+
+class DecorativeBlock(
+	baseName: String,
+	private val provider: (DyeColor?) -> Block,
+	itemGroup: CreativeModeTab = OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE
+) : ColoredDecorativeBlock(baseName, provider, itemGroup) {
+	private var _block: RegistryObject<Block> by WriteOnce()
+	private var _item: RegistryObject<Item> by WriteOnce()
+
+	val block: Block get() = _block.get()
+	val item: Item get() = _item.get()
+
+	val blocks: List<Block> by lazy {
+		LazyList(
+			_block::get,
+
+			_whiteBlock::get,
+			_orangeBlock::get,
+			_magentaBlock::get,
+			_lightBlueBlock::get,
+			_yellowBlock::get,
+			_limeBlock::get,
+			_pinkBlock::get,
+			_grayBlock::get,
+			_lightGrayBlock::get,
+			_cyanBlock::get,
+			_purpleBlock::get,
+			_blueBlock::get,
+			_brownBlock::get,
+			_greenBlock::get,
+			_redBlock::get,
+			_blackBlock::get,
+		)
+	}
+
+	val items: List<Item> by lazy {
+		LazyList(
+			_item::get,
+
+			_whiteItem::get,
+			_orangeItem::get,
+			_magentaItem::get,
+			_lightBlueItem::get,
+			_yellowItem::get,
+			_limeItem::get,
+			_pinkItem::get,
+			_grayItem::get,
+			_lightGrayItem::get,
+			_cyanItem::get,
+			_purpleItem::get,
+			_blueItem::get,
+			_brownItem::get,
+			_greenItem::get,
+			_redItem::get,
+			_blackItem::get,
+		)
+	}
+
+	override fun registerBlocks(registry: DeferredRegister<Block>) {
+		_block = registry.register(baseName) { provider.invoke(DyeColor.WHITE) }
+
+		super.registerBlocks(registry)
+	}
+
+	override fun registerItems(registry: DeferredRegister<Item>) {
+		_item = registry.register(baseName) { BlockItem(_block.get(), Item.Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE).stacksTo(64)) }
+
+		super.registerItems(registry)
+	}
+
+	companion object {
+		fun simple(baseName: String, provider: (DyeColor?) -> BlockBehaviour.Properties, itemGroup: CreativeModeTab = OverdriveThatMatters.INSTANCE.CREATIVE_TAB_DECORATIVE): DecorativeBlock {
+			return DecorativeBlock(baseName, {
+				Block(provider.invoke(it))
+			}, itemGroup)
+		}
 	}
 }
 
@@ -263,36 +395,38 @@ object MRegistry {
 	val ANDROID_FEATURES get() = features.get() as ForgeRegistry<AndroidFeatureType<*>>
 	val ANDROID_RESEARCH get() = research.get() as ForgeRegistry<AndroidResearchType<*>>
 
-	val TRITANIUM_BLOCK = ColoredDecorativeBlock(MNames.TRITANIUM_BLOCK) {
-		BlockBehaviour.Properties.of(Material.METAL, it.materialColor)
+	val CARGO_CRATES = DecorativeBlock(MNames.CARGO_CRATE, ::CargoCrateBlock, OverdriveThatMatters.INSTANCE.CREATIVE_TAB)
+
+	val TRITANIUM_BLOCK = DecorativeBlock.simple(MNames.TRITANIUM_BLOCK, {
+		BlockBehaviour.Properties.of(Material.METAL, it?.materialColor ?: MaterialColor.COLOR_LIGHT_BLUE)
 			.sound(SoundType.BASALT)
 			.requiresCorrectToolForDrops()
 			.explosionResistance(80f)
 			.strength(4f)
-	}
+	})
 
-	val VENT = ColoredDecorativeBlock(MNames.VENT) {
-		BlockBehaviour.Properties.of(Material.METAL, it.materialColor)
+	val VENT = DecorativeBlock.simple(MNames.VENT, {
+		BlockBehaviour.Properties.of(Material.METAL, it?.materialColor ?: MaterialColor.COLOR_LIGHT_BLUE)
 			.sound(SoundType.BASALT)
 			.requiresCorrectToolForDrops()
 			.explosionResistance(20f)
 			.strength(1.5f)
-	}
+	})
 
-	val VENT_ALTERNATIVE = ColoredDecorativeBlock(MNames.VENT_ALTERNATIVE) {
-		BlockBehaviour.Properties.of(Material.METAL, it.materialColor)
+	val VENT_ALTERNATIVE = DecorativeBlock.simple(MNames.VENT_ALTERNATIVE, {
+		BlockBehaviour.Properties.of(Material.METAL, it?.materialColor ?: MaterialColor.COLOR_LIGHT_BLUE)
 			.sound(SoundType.BASALT)
 			.requiresCorrectToolForDrops()
 			.explosionResistance(20f)
 			.strength(1.5f)
-	}
+	})
 
-	val FLOOR_TILES = ColoredDecorativeBlock(MNames.FLOOR_TILES) {
+	val FLOOR_TILES = ColoredDecorativeBlock.simple(MNames.FLOOR_TILES, {
 		BlockBehaviour.Properties.of(Material.STONE, it.materialColor)
 			.sound(SoundType.STONE)
 			.requiresCorrectToolForDrops()
 			.strength(3f)
-	}
+	})
 
 	private fun register(event: NewRegistryEvent) {
 		features.write(RegistryBuilder<AndroidFeatureType<*>>().let {
@@ -308,17 +442,37 @@ object MRegistry {
 		})
 	}
 
-	val DAMAGE_BECOME_ANDROID = ImmutableDamageSource(DamageSource("otm_become_android").bypassArmor().bypassInvul().bypassMagic())
-	val DAMAGE_BECOME_HUMANE = ImmutableDamageSource(DamageSource("otm_become_humane").bypassArmor().bypassInvul().bypassMagic())
-	val DAMAGE_EVENT_HORIZON = ImmutableDamageSource(DamageSource("otm_event_horizon").bypassMagic().bypassArmor())
-	val DAMAGE_HAWKING_RADIATION = ImmutableDamageSource(DamageSource("otm_hawking_radiation"))
-	const val DAMAGE_EMP_NAME = "otm_emp"
-	const val DAMAGE_PLASMA_NAME = "otm_plasma"
-	val DAMAGE_EMP: DamageSource = ImmutableDamageSource(EMPDamageSource())
+	val INDUSTRIAL_GLASS = DecorativeBlock(MNames.INDUSTRIAL_GLASS, { color ->
+		val properties = BlockBehaviour.Properties.of(Material.GLASS, if (color != null) color.materialColor else MaterialColor.NONE)
+			.strength(1.5f, 35.0f)
+			.requiresCorrectToolForDrops()
+			.sound(SoundType.GLASS)
+			.noOcclusion()
+			.isValidSpawn { _: BlockState, _: BlockGetter, _: BlockPos, _: EntityType<*>? -> false }
+			.isRedstoneConductor { _: BlockState, _: BlockGetter, _: BlockPos -> false }
+			.isSuffocating { _: BlockState, _: BlockGetter, _: BlockPos -> false }
+			.isViewBlocking { _: BlockState, _: BlockGetter, _: BlockPos -> false }
 
-	init {
-		// DAMAGE_HAWKING_RADIATION.bypassMagic().bypassArmor();
-	}
+		if (color != null) {
+			return@DecorativeBlock StainedGlassBlock(color, properties)
+		}
+
+		return@DecorativeBlock GlassBlock(properties)
+	})
+
+	val INDUSTRIAL_GLASS_PANE = DecorativeBlock(MNames.INDUSTRIAL_GLASS_PANE, { color ->
+		val properties = BlockBehaviour.Properties.of(Material.GLASS, if (color != null) color.materialColor else MaterialColor.NONE)
+			.strength(1.25f, 5.0f)
+			.requiresCorrectToolForDrops()
+			.sound(SoundType.GLASS)
+			.noOcclusion()
+
+		if (color != null) {
+			return@DecorativeBlock StainedGlassPaneBlock(color, properties)
+		}
+
+		return@DecorativeBlock IronBarsBlock(properties)
+	})
 
 	val CRATE_RED = CrateProperties(MaterialColor.COLOR_RED, "crate_red")
 	val CRATE_BLUE = CrateProperties(MaterialColor.COLOR_BLUE, "crate_blue")
@@ -338,43 +492,17 @@ object MRegistry {
 		CRATE_PURPLE,
 	)
 
-	val INDUSTRIAL_GLASS = IndustrialGlassProperties(null)
-	val INDUSTRIAL_GLASS_WHITE = IndustrialGlassProperties(DyeColor.WHITE)
-	val INDUSTRIAL_GLASS_ORANGE = IndustrialGlassProperties(DyeColor.ORANGE)
-	val INDUSTRIAL_GLASS_MAGENTA = IndustrialGlassProperties(DyeColor.MAGENTA)
-	val INDUSTRIAL_GLASS_LIGHT_BLUE = IndustrialGlassProperties(DyeColor.LIGHT_BLUE)
-	val INDUSTRIAL_GLASS_YELLOW = IndustrialGlassProperties(DyeColor.YELLOW)
-	val INDUSTRIAL_GLASS_LIME = IndustrialGlassProperties(DyeColor.LIME)
-	val INDUSTRIAL_GLASS_PINK = IndustrialGlassProperties(DyeColor.PINK)
-	val INDUSTRIAL_GLASS_GRAY = IndustrialGlassProperties(DyeColor.GRAY)
-	val INDUSTRIAL_GLASS_LIGHT_GRAY = IndustrialGlassProperties(DyeColor.LIGHT_GRAY)
-	val INDUSTRIAL_GLASS_CYAN = IndustrialGlassProperties(DyeColor.CYAN)
-	val INDUSTRIAL_GLASS_PURPLE = IndustrialGlassProperties(DyeColor.PURPLE)
-	val INDUSTRIAL_GLASS_BLUE = IndustrialGlassProperties(DyeColor.BLUE)
-	val INDUSTRIAL_GLASS_BROWN = IndustrialGlassProperties(DyeColor.BROWN)
-	val INDUSTRIAL_GLASS_GREEN = IndustrialGlassProperties(DyeColor.GREEN)
-	val INDUSTRIAL_GLASS_RED = IndustrialGlassProperties(DyeColor.RED)
-	val INDUSTRIAL_GLASS_BLACK = IndustrialGlassProperties(DyeColor.BLACK)
+	val DAMAGE_BECOME_ANDROID = ImmutableDamageSource(DamageSource("otm_become_android").bypassArmor().bypassInvul().bypassMagic())
+	val DAMAGE_BECOME_HUMANE = ImmutableDamageSource(DamageSource("otm_become_humane").bypassArmor().bypassInvul().bypassMagic())
+	val DAMAGE_EVENT_HORIZON = ImmutableDamageSource(DamageSource("otm_event_horizon").bypassMagic().bypassArmor())
+	val DAMAGE_HAWKING_RADIATION = ImmutableDamageSource(DamageSource("otm_hawking_radiation"))
+	const val DAMAGE_EMP_NAME = "otm_emp"
+	const val DAMAGE_PLASMA_NAME = "otm_plasma"
+	val DAMAGE_EMP: DamageSource = ImmutableDamageSource(EMPDamageSource())
 
-	val INDUSTRIAL_GLASS_LIST = listOf(
-		INDUSTRIAL_GLASS,
-		INDUSTRIAL_GLASS_WHITE,
-		INDUSTRIAL_GLASS_ORANGE,
-		INDUSTRIAL_GLASS_MAGENTA,
-		INDUSTRIAL_GLASS_LIGHT_BLUE,
-		INDUSTRIAL_GLASS_YELLOW,
-		INDUSTRIAL_GLASS_LIME,
-		INDUSTRIAL_GLASS_PINK,
-		INDUSTRIAL_GLASS_GRAY,
-		INDUSTRIAL_GLASS_LIGHT_GRAY,
-		INDUSTRIAL_GLASS_CYAN,
-		INDUSTRIAL_GLASS_PURPLE,
-		INDUSTRIAL_GLASS_BLUE,
-		INDUSTRIAL_GLASS_BROWN,
-		INDUSTRIAL_GLASS_GREEN,
-		INDUSTRIAL_GLASS_RED,
-		INDUSTRIAL_GLASS_BLACK,
-	)
+	init {
+		// DAMAGE_HAWKING_RADIATION.bypassMagic().bypassArmor();
+	}
 
 	fun initialize(context: FMLJavaModLoadingContext) {
 		context.modEventBus.addListener(this::register)
diff --git a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json
deleted file mode 100644
index cfa1c953b..000000000
--- a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json
+++ /dev/null
@@ -1,419 +0,0 @@
-{
-	"otm.sound.rifle_shoot": "Plasma rifle fires",
-	"otm.sound.plasma_weapon_overheat": "Plasma weapon overheats",
-	"otm.sound.player_become_android": "Player became android",
-
-	"itemGroup.otm": "Overdrive That Matters",
-	"itemGroup.otm_decorative": "Overdrive That Matters Decorative",
-
-	"otm.item.blackhole_immunity": "Negates gravitational effects of singularities",
-
-	"otm.pill.warning": "WARNING: This will INSTANTLY decommission you upon ingestion!",
-	"otm.pill.android": "Take this pill and lose what is holding you back.",
-
-	"otm.pill.humane": "Take this pill and wake up in bed none the wiser.",
-
-	"otm.pill.oblivion": "Items and Experience spent on research is fully refunded.",
-	"otm.pill.message_oblivion": "All android features are removed and all research refunded.",
-
-	"otm.pill.heal": "Instantly restores 4 hearts upon ingestion, provides 2 min Absorption V and 8 seconds Regeneration III.",
-	"otm.pill.heal_android": "Does nothing to androids.",
-
-	"otm.pill.message": "Nothing happened, but you feel exhausted?.. Maybe get rest.",
-	"otm.pill.message_finish": "§kONE OF US ONE OF US ONE OF US ONE OF US ONE OF US",
-
-	"otm.gui.power.percentage_level": "Energy level: %s%%",
-	"otm.gui.level": "%s / %s",
-	"otm.gui.power.name": "MtJ",
-
-	"otm.gui.power.burn_time": "Burn time left: %s ticks",
-
-	"otm.gui.progress_widget": "Progress: %s%%",
-	"otm.gui.progress_widget_stuck": "The machine can not work, check configuration",
-
-	"otm.gui.total_raw": "Total:",
-
-	"otm.gui.matter.percentage_level": "Matter level: %s%%",
-	"otm.gui.matter.format": "Matter: %s",
-	"otm.gui.matter.format_and_complexity": "%s / Complexity: %s",
-	"otm.gui.matter.name": "MtU",
-
-	"otm.gui.filter.is_whitelist": "Is Whitelist",
-	"otm.gui.filter.match_nbt": "Match NBT",
-	"otm.gui.filter.match_tag": "Match Tag",
-
-	"otm.gui.android_research": "Research Tree",
-
-	"otm.gui.pattern.percentage_level": "Fill level: %s%%",
-	"otm.gui.pattern.format": "Stored patterns: %s / %s",
-
-	"otm.gui.redstone.ignored": "Redstone mode: Ignored",
-	"otm.gui.redstone.low": "Redstone mode: Low",
-	"otm.gui.redstone.high": "Redstone mode: High",
-
-	"otm.gui.redstone.ignored.description": "Redstone signal does not affect machine's function",
-	"otm.gui.redstone.low.description": "Machine work if no redstone signal is present",
-	"otm.gui.redstone.high.description": "Machine work only if any redstone signal is present",
-
-	"otm.3d2d.gravitation_stabilizer.mass": "Singularity mass: %s",
-	"otm.3d2d.gravitation_stabilizer.strength": "Gravitation strength: %s",
-
-	"otm.death_reason": "Decommissioned!",
-
-	"otm.item.power.infinite.storage": "Stored energy: Infinity / Infinity",
-	"otm.item.power.infinite.throughput": "Max I/O Infinite / Infinite",
-	"otm.item.power.passed": "Passed energy: %s",
-	"otm.item.power.average": "Average throughput: %s/t",
-	"otm.item.power.last_20_ticks": "Last second: %s",
-	"otm.item.power.last_tick": "Last tick: %s",
-
-	"otm.item.power.normal.storage": "Stored energy: %s / %s",
-	"otm.item.power.normal.throughput": "Max I/O %s / %s",
-
-	"otm.item.pattern.stored": "Stored patterns: %s / %s",
-	"otm.item.pattern.infinite.stored": "Stored patterns %s",
-	"otm.item.pattern.line": "%s [%s%%]",
-	"otm.item.pattern.research": "Researched: %s%%",
-
-	"otm.item.matter.infinite": "Stored matter: Infinity / Infinity",
-	"otm.item.matter.normal": "Stored matter: %s / %s",
-
-	"otm.gui.matter_task.total": "Total: %s",
-	"otm.gui.matter_task.required": "Left to be done: %s",
-	"otm.gui.matter_task.in_progress": "In progress: %s",
-	"otm.gui.matter_task.finished": "Finished: %s",
-
-	"otm.android_station.research.researched": "Researched!",
-	"otm.android_station.research.can_be_researched": "Ready to research!",
-	"otm.android_station.research.can_not_be_researched": "Can not afford!",
-	"otm.android_station.research.xp_cost": "Experience cost: %s levels",
-	"otm.android_station.research.item": "Requires %s x%s",
-	"otm.android_station.research.missing_predecessors": "%s needs to be researched first",
-
-	"otm.filter.yes": "Yes",
-	"otm.filter.no": "No",
-
-	"otm.matter_bottler.switch_mode": "Switch work mode",
-
-	"android_feature.overdrive_that_matters.air_bags": "Air Bags",
-
-	"android_research.overdrive_that_matters.limb_overclocking": "Limb Overclocking %s",
-
-	"android_research.overdrive_that_matters.limb_overclocking.description": "Boosts unit's mobility by %s%% and attack speed by %s%%",
-
-	"android_research.status.requires": "Requires %s to be researched",
-	"android_research.status.blocks": "Locks %s",
-	"android_research.status.blocked_by": "Locked by %s",
-
-	"android_research.overdrive_that_matters.air_bags": "Air Bags",
-	"android_research.overdrive_that_matters.nanobots": "Nanobots",
-	"android_research.overdrive_that_matters.air_bags.description": "Allows unit to swim in water",
-	"android_research.overdrive_that_matters.nanobots.description": "Various useful nanobots for doing various tasks",
-
-	"android_research.overdrive_that_matters.nanobots_regeneration": "Regeneration %s",
-	"android_research.overdrive_that_matters.nanobots_regeneration.description": "Nanobots get ability to repair unit's internal systems on the move",
-	"android_research.overdrive_that_matters.nanobots_regeneration.description_improve": "Improves regeneration speed",
-
-	"android_research.overdrive_that_matters.nanobots_armor": "Nanobots Armor",
-	"android_research.overdrive_that_matters.nanobots_armor.description": "Allows nanobots to align themselves in cell shape, reducing incoming damage by a %% by absorbing impacts",
-
-	"android_research.overdrive_that_matters.nanobots_armor_speed": "Nanobots Armor Build Speed %s",
-	"android_research.overdrive_that_matters.nanobots_armor_speed.description": "Reduces time required for nanobots to form protection layer",
-
-	"android_research.overdrive_that_matters.nanobots_armor_strength": "Nanobots Armor Strength %s",
-	"android_research.overdrive_that_matters.nanobots_armor_strength.description": "Increases impact absorption strength of nanobots",
-
-	"android_research.overdrive_that_matters.extended_reach": "Extended Reach",
-	"android_research.overdrive_that_matters.extended_reach.description": "Increases block interaction distance",
-
-	"stat.overdrive_that_matters.health_regenerated": "Damage Regenerated by Nanobots",
-	"stat.overdrive_that_matters.damage_absorbed": "Damage Absorbed by Nanobots",
-	"stat.overdrive_that_matters.power_consumed": "MtJ Burnt as Android",
-
-	"otm.suffix.merge": "%s %s",
-
-	"otm.suffix.kilo": "%s k%s",
-	"otm.suffix.mega": "%s M%s",
-	"otm.suffix.giga": "%s G%s",
-	"otm.suffix.tera": "%s T%s",
-	"otm.suffix.peta": "%s P%s",
-	"otm.suffix.exa": "%s E%s",
-	"otm.suffix.zetta": "%s Z%s",
-	"otm.suffix.yotta": "%s Y%s",
-
-	"otm.suffix.deci": "%s d%s",
-	"otm.suffix.centi": "%s c%s",
-	"otm.suffix.milli": "%s m%s",
-	"otm.suffix.micro": "%s μ%s",
-	"otm.suffix.nano": "%s n%s",
-	"otm.suffix.pico": "%s p%s",
-	"otm.suffix.femto": "%s f%s",
-	"otm.suffix.atto": "%s a%s",
-	"otm.suffix.zepto": "%s z%s",
-	"otm.suffix.yocto": "%s y%s",
-
-	"otm.suffix_raw.kilo": "k",
-	"otm.suffix_raw.mega": "M",
-	"otm.suffix_raw.giga": "G",
-	"otm.suffix_raw.tera": "T",
-	"otm.suffix_raw.peta": "P",
-	"otm.suffix_raw.exa": "E",
-	"otm.suffix_raw.zetta": "Z",
-	"otm.suffix_raw.yotta": "Y",
-	"otm.suffix_raw.deci": "d",
-	"otm.suffix_raw.centi": "c",
-	"otm.suffix_raw.milli": "m",
-	"otm.suffix_raw.micro": "μ",
-	"otm.suffix_raw.nano": "n",
-	"otm.suffix_raw.pico": "p",
-	"otm.suffix_raw.femto": "f",
-	"otm.suffix_raw.atto": "a",
-	"otm.suffix_raw.zepto": "z",
-	"otm.suffix_raw.yocto": "y",
-
-	"death.attack.otm_become_android": "%1$s lost their humanity",
-	"death.attack.otm_become_humane": "%1$s regained their humanity",
-	"death.attack.otm_event_horizon": "%1$s never crossed event horizon",
-	"death.attack.otm_hawking_radiation": "%1$s discovered Hawking radiation",
-	"death.attack.otm_emp": "%1$s electronics' fried",
-
-	"death.attack.otm_become_android.player": "%1$s lost their humanity whilst %2$s tried to reason with them",
-	"death.attack.otm_become_humane.player": "%1$s gained their humanity whilst %2$s tried to reason with them",
-	"death.attack.otm_event_horizon.player": "%1$s tried to cross event horizon whilst trying to escape %2$s",
-	"death.attack.otm_hawking_radiation.player": "%1$s disintegrated whilst fighting %2$s",
-	"death.attack.otm_emp.player": "%1$s blew fuzes of %2$s",
-	"death.attack.otm_emp.player.item": "%1$s blew fuzes of %2$s using %3$s",
-
-	"block.overdrive_that_matters.android_station": "Android Station",
-	"block.overdrive_that_matters.battery_bank": "Battery Bank",
-	"block.overdrive_that_matters.matter_decomposer": "Matter Decomposer",
-	"block.overdrive_that_matters.matter_capacitor_bank": "Matter Capacitor Bank",
-	"block.overdrive_that_matters.matter_cable": "Matter Network Cable",
-	"block.overdrive_that_matters.pattern_storage": "Pattern Storage",
-	"block.overdrive_that_matters.matter_scanner": "Matter Scanner",
-	"block.overdrive_that_matters.matter_panel": "Pattern Monitor",
-	"block.overdrive_that_matters.matter_replicator": "Matter Replicator",
-	"block.overdrive_that_matters.matter_bottler": "Matter Bottler",
-	"block.overdrive_that_matters.drive_viewer": "Drive Viewer",
-	"block.overdrive_that_matters.black_hole": "Local Anomalous Singular Gravitation Field",
-
-	"block.overdrive_that_matters.energy_counter": "Energy Counter",
-	"block.overdrive_that_matters.energy_counter.facing": "Input facing: %s",
-	"block.overdrive_that_matters.energy_counter.switch": "Switch input facing",
-	"block.overdrive_that_matters.energy_counter.limit": "I/O Limit. -1 means no limit",
-
-	"block.overdrive_that_matters.chemical_generator": "Chemical Generator",
-	"block.overdrive_that_matters.drive_rack": "Condensation Drive Rack",
-	"block.overdrive_that_matters.item_monitor": "Item Monitor",
-	"block.overdrive_that_matters.plate_press": "Plate Press",
-	"block.overdrive_that_matters.gravitation_stabilizer": "Gravitation Stabilizer",
-	"block.overdrive_that_matters.gravitation_stabilizer_lens": "Gravitation Stabilizer Lens",
-	"block.overdrive_that_matters.gravitation_stabilizer.desc": "Reduces gravitation effects of singularities",
-	"block.overdrive_that_matters.gravitation_stabilizer.desc2": "Requires no power to operate",
-	"block.overdrive_that_matters.gravitation_stabilizer.desc3": "Keep in mind the effect of multiple stabilizers produce exponentially increasing result",
-	"block.overdrive_that_matters.gravitation_stabilizer.desc4": "Too weak gravitation field will cause singularity to melt and evaporate away very fast",
-
-	"block.overdrive_that_matters.matter_recycler": "Matter Recycler",
-
-	"otm.container.matter_panel.number_input": "Input replication task count",
-
-	"otm.container.matter_panel.increase_by": "+%s",
-	"otm.container.matter_panel.decrease_by": "-%s",
-	"otm.container.matter_panel.send": "Send",
-	"otm.container.matter_panel.close": "Close",
-	"otm.container.matter_panel.cancel_task": "Cancel task",
-	"otm.container.matter_panel.cancel": "Cancel",
-	"otm.container.matter_panel.label": "Replication request",
-	"otm.container.matter_panel.task": "Ongoing replication task",
-	"otm.container.matter_panel.task_line": "%s: %s | %s / %s",
-
-	"block.overdrive_that_matters.crate_red": "Red Container Block",
-	"block.overdrive_that_matters.crate_blue": "Blue Container Block",
-	"block.overdrive_that_matters.crate_green": "Green Container Block",
-	"block.overdrive_that_matters.crate_yellow": "Yellow Container Block",
-	"block.overdrive_that_matters.crate_black": "Black Container Block",
-	"block.overdrive_that_matters.crate_pink": "Pink Container Block",
-	"block.overdrive_that_matters.crate_purple": "Purple Container Block",
-	"block.overdrive_that_matters.carbon_fibre_block": "Carbon fibre Block",
-	"block.overdrive_that_matters.tritanium_block": "Tritanium Block",
-	"block.overdrive_that_matters.tritanium_striped_block": "Tritanium Striped Block",
-	"block.overdrive_that_matters.cargo_crate": "Cargo Crate",
-	"block.overdrive_that_matters.tritanium_ore": "Tritanium Ore",
-	"block.overdrive_that_matters.deepslate_tritanium_ore": "Deepslate Tritanium Ore",
-	"block.overdrive_that_matters.tritanium_raw_block": "Raw Tritanium Block",
-
-	"block.overdrive_that_matters.storage_cable": "Storage Cable",
-	"block.overdrive_that_matters.storage_power_supplier": "Storage Power Supplier",
-	"block.overdrive_that_matters.storage_bus": "Storage Bus",
-	"block.overdrive_that_matters.storage_importer": "Storage Importer",
-	"block.overdrive_that_matters.storage_exporter": "Storage Exporter",
-
-	"block.overdrive_that_matters.cargo_crate_white": "White Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_orange": "Orange Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_magenta":  "Magenta Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_light_blue": "Light Blue Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_yellow":  "Yellow Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_lime": "Lime Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_pink":  "Pink Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_gray": "Gray Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_light_gray": "Light Gray Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_cyan": "Cyan Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_purple":  "Purple Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_blue": "Blue Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_brown":  "Brown Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_green": "Green Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_red":  "Red Cargo Crate",
-	"block.overdrive_that_matters.cargo_crate_black": "Black Cargo Crate",
-
-	"block.overdrive_that_matters.tritanium_block_white": "White Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_orange": "Orange Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_magenta":  "Magenta Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_light_blue": "Light Blue Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_yellow":  "Yellow Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_lime": "Lime Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_pink":  "Pink Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_gray": "Gray Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_light_gray": "Light Gray Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_cyan": "Cyan Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_purple":  "Purple Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_blue": "Blue Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_brown":  "Brown Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_green": "Green Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_red":  "Red Tritanium Block",
-	"block.overdrive_that_matters.tritanium_block_black": "Black Tritanium Block",
-
-	"block.overdrive_that_matters.floor_tiles_white": "White Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_orange": "Orange Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_magenta":  "Magenta Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_light_blue": "Light Blue Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_yellow":  "Yellow Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_lime": "Lime Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_pink":  "Pink Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_gray": "Gray Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_light_gray": "Light Gray Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_cyan": "Cyan Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_purple":  "Purple Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_blue": "Blue Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_brown":  "Brown Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_green": "Green Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_red":  "Red Floor Tiles",
-	"block.overdrive_that_matters.floor_tiles_black": "Black Floor Tiles",
-
-	"block.overdrive_that_matters.industrial_glass": "Clear Industrial Glass",
-
-	"block.overdrive_that_matters.industrial_glass_white": "White Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_orange": "Orange Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_magenta":  "Magenta Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_light_blue": "Light Stained Blue Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_yellow":  "Yellow Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_lime": "Lime Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_pink":  "Pink Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_gray": "Gray Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_light_gray": "Light Stained Gray Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_cyan": "Cyan Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_purple":  "Purple Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_blue": "Blue Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_brown":  "Brown Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_green": "Green Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_red":  "Red Stained Industrial Glass",
-	"block.overdrive_that_matters.industrial_glass_black": "Black Stained Industrial Glass",
-
-	"block.overdrive_that_matters.industrial_glass_pane": "Clear Industrial Glass Pane",
-
-	"block.overdrive_that_matters.industrial_glass_pane_white": "White Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_orange": "Orange Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_magenta":  "Magenta Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_light_blue": "Light Stained Blue Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_yellow":  "Yellow Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_lime": "Lime Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_pink":  "Pink Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_gray": "Gray Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_light_gray": "Light Stained Gray Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_cyan": "Cyan Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_purple":  "Purple Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_blue": "Blue Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_brown":  "Brown Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_green": "Green Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_red":  "Red Stained Industrial Glass Pane",
-	"block.overdrive_that_matters.industrial_glass_pane_black": "Black Stained Industrial Glass Pane",
-
-	"item.overdrive_that_matters.pill_android": "Android Pill",
-	"item.overdrive_that_matters.pill_humane": "Humane Pill",
-	"item.overdrive_that_matters.pill_oblivion": "Android Factory Reset Pill",
-	"item.overdrive_that_matters.pill_heal": "Medical Pill",
-
-	"item.overdrive_that_matters.matter_dust": "Matter Dust",
-	"item.overdrive_that_matters.matter_dust.desc": "This item is product of failed decomposition or replication attempt",
-	"item.overdrive_that_matters.matter_dust.desc2": "Throw into matter recycler to get some of it's value back!",
-	"item.overdrive_that_matters.matter_dust.desc3": "Do not smell, throw at strangers or pour on donuts",
-
-	"item.overdrive_that_matters.portable_condensation_drive": "Portable Condensation Drive",
-	"item.overdrive_that_matters.portable_dense_condensation_drive": "Portable Dense Condensation Drive",
-
-	"item.overdrive_that_matters.nutrient_paste": "Nutrient paste",
-	"item.overdrive_that_matters.black_hole_scanner": "Singularity Scanner",
-	"item.overdrive_that_matters.black_hole_scanner.desc": "Scans singularities for their properties",
-	"item.overdrive_that_matters.black_hole_scanner.desc2": "Hold in hand to determine mass of singularities",
-	"item.overdrive_that_matters.gravitation_field_limiter": "Gravitation Field Limiter",
-	"item.overdrive_that_matters.gravitation_field_sensor": "Gravitation Field Sensor",
-	"item.overdrive_that_matters.portable_gravitation_stabilizer": "Portable Gravitation Stabilizer",
-
-	"item.overdrive_that_matters.battery_crude": "Crude Battery",
-	"item.overdrive_that_matters.battery_basic": "Basic Battery",
-	"item.overdrive_that_matters.battery_normal": "Ordinary Battery",
-	"item.overdrive_that_matters.battery_dense": "Dense Battery",
-	"item.overdrive_that_matters.battery_capacitor": "Capacitor Battery",
-	"item.overdrive_that_matters.battery_creative": "Creative Battery",
-
-	"item.overdrive_that_matters.energy_sword": "Powered Cake Slicer",
-	"item.overdrive_that_matters.energy_sword.desc": "Needs power to operate",
-	"item.overdrive_that_matters.energy_sword.desc2": "Deals extra damage to androids when powered",
-
-	"item.overdrive_that_matters.tritanium_sword": "Tritanium Sword",
-	"item.overdrive_that_matters.tritanium_pickaxe": "Tritanium Pickaxe",
-	"item.overdrive_that_matters.tritanium_shovel": "Tritanium Shovel",
-	"item.overdrive_that_matters.tritanium_axe": "Tritanium Axe",
-	"item.overdrive_that_matters.tritanium_hoe": "Tritanium Hoe",
-
-	"item.overdrive_that_matters.tritanium_helmet": "Tritanium Helmet",
-	"item.overdrive_that_matters.tritanium_chestplate": "Tritanium Chestplate",
-	"item.overdrive_that_matters.tritanium_pants": "Tritanium Leggings",
-	"item.overdrive_that_matters.tritanium_boots": "Tritanium Boots",
-
-	"item.overdrive_that_matters.plasma_rifle": "Plasma Rifle",
-
-	"item.overdrive_that_matters.matter_capacitor_parts": "Matter Capacitor Parts",
-	"item.overdrive_that_matters.matter_capacitor_basic": "Basic Matter Capacitor",
-	"item.overdrive_that_matters.matter_capacitor_normal": "Matter Capacitor",
-	"item.overdrive_that_matters.matter_capacitor_dense": "Dense Matter Capacitor",
-	"item.overdrive_that_matters.matter_capacitor_creative": "Creative Matter Capacitor",
-
-	"item.overdrive_that_matters.gravitational_disruptor": "Gravitational Disruptor",
-	"item.overdrive_that_matters.gravitational_disruptor.description": "Once within close proximity of supermassive body, suppresses any gravity in it's radius",
-	"item.overdrive_that_matters.gravitational_disruptor.description2": "Allows collapse of black holes",
-	"item.overdrive_that_matters.gravitational_disruptor.description3": "Doesn't destroy any of mass singularity had acquired, which result in violent explosion of matter!",
-	"item.overdrive_that_matters.gravitational_disruptor.description4": "The explosion %s be contained by %s. Do not even attempt to contain it.",
-	"item.overdrive_that_matters.gravitational_disruptor.description4_clarification": "can not",
-	"item.overdrive_that_matters.gravitational_disruptor.description4_clarification2": "anything",
-
-	"item.overdrive_that_matters.tritanium_ore_clump": "Raw Tritanium",
-
-	"item.overdrive_that_matters.tritanium_ingot": "Tritanium Ingot",
-	"item.overdrive_that_matters.matter_io_port": "Matter IO Port",
-	"item.overdrive_that_matters.matter_transform_matrix": "Matter Transformation Matrix",
-	"item.overdrive_that_matters.energy_bus": "Energy Bus",
-	"item.overdrive_that_matters.electric_parts":  "Electric Parts",
-	"item.overdrive_that_matters.machine_frame": "Machine Frame",
-	"item.overdrive_that_matters.tritanium_plate":  "Tritanium Plate",
-	"item.overdrive_that_matters.iron_plate": "Iron Plate",
-	"item.overdrive_that_matters.copper_wiring":  "Copper Wiring",
-	"item.overdrive_that_matters.gold_wiring": "Gold Wiring",
-	"item.overdrive_that_matters.portable_condensation_drive_casing": "Portable Condensation Drive Casing",
-	"item.overdrive_that_matters.portable_dense_condensation_drive_casing": "Portable Dense Condensation Drive Casing",
-	"item.overdrive_that_matters.circuit_plating": "Circuit Plating",
-	"item.overdrive_that_matters.basic_control_circuit": "Basic Control Circuit",
-	"item.overdrive_that_matters.advanced_control_circuit": "Advanced Control Circuit",
-
-	"item.overdrive_that_matters.pattern_drive_normal": "Pattern Drive",
-	"item.overdrive_that_matters.pattern_drive_creative": "Creative Pattern Drive"
-}
\ No newline at end of file