diff --git a/1.12/.gitignore b/1.12/.gitignore new file mode 100644 index 0000000..a2db5a4 --- /dev/null +++ b/1.12/.gitignore @@ -0,0 +1,32 @@ +bin +*.launch +.settings +.metadata +.classpath +.project +out +*.ipr +*.iws +*.iml +.idea +build +.gradle +*.tmp +*.log +*.jks +eclipse +run +tests +/dist +signing.* +src/main/java/archive +src/main/resources/assets/minecraft +.vscode +/classes +/dev +/tmp +/archive +/assets-src +.gimp +*.xcf +desktop.ini diff --git a/1.12/Makefile b/1.12/Makefile new file mode 100644 index 0000000..54355cb --- /dev/null +++ b/1.12/Makefile @@ -0,0 +1,98 @@ +# @file Makefile +# @author Stefan Wilhelm (wile) +# @license MIT +# +# GNU Make makefile for, well, speeding +# up the development a bit. +# You very likely need some tools installed +# to use all build targets, so this file is +# not "official". If you work on windows and +# install GIT with complete shell PATH (the +# red marked option in the GIT installer) you +# should have the needed unix tools available. +# For image stripping install imagemagick and +# also put the "magick" executable in the PATH. +# +MOD_JAR_PREFIX=engineersdecor- +MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar)) + +ifeq ($(OS),Windows_NT) +GRADLE=gradlew.bat --no-daemon +GRADLE_STOP=gradlew.bat --stop +INSTALL_DIR=$(realpath ${APPDATA}/.minecraft) +SERVER_INSTALL_DIR=$(realpath ${APPDATA}/minecraft-server-forge-1.12.2-14.23.5.2768) +DJS=djs +else +GRADLE=./gradlew --no-daemon +GRADLE_STOP=./gradlew --stop +INSTALL_DIR=~/.minecraft +SERVER_INSTALL_DIR=~/.minecraft-server-forge-1.12.2-14.23.5.2768 +DJS=djs +endif + +wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d)) + +# +# Targets +# +.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server + +default: mod + +all: clean clean-all mod | install + +mod: + @echo "[1.12] Building mod using gradle ..." + @$(GRADLE) build $(GRADLE_OPTS) + +clean: + @echo "[1.12] Cleaning ..." + @rm -f build/libs/* + @$(GRADLE) clean + +clean-all: clean + @echo "[1.12] Cleaning using gradle ..." + @rm -f dist/* + @$(GRADLE) clean cleanCache + +init: + @echo "[1.12] Initialising eclipse workspace using gradle ..." + @$(GRADLE) setupDecompWorkspace + +run: + @echo "[1.12] Running client ..." + @$(GRADLE) runClient + +install: $(MOD_JAR) | + @sleep 2s + @if [ ! -d "$(INSTALL_DIR)" ]; then echo "Cannot find installation minecraft directory."; false; fi + @echo "[1.12] Installing '$(MOD_JAR)' to '$(INSTALL_DIR)/mods' ..." + @[ -d "$(INSTALL_DIR)/mods" ] || mkdir "$(INSTALL_DIR)/mods" + @rm -f "$(INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar + @cp -f "$(MOD_JAR)" "$(INSTALL_DIR)/mods/" + @echo "[1.12] Installing '$(MOD_JAR)' to '$(SERVER_INSTALL_DIR)/mods' ..." + @rm -f "$(SERVER_INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar + @[ -d "$(SERVER_INSTALL_DIR)/mods" ] && cp -f "$(MOD_JAR)" "$(SERVER_INSTALL_DIR)/mods/" + +start-server: install + @echo "[1.12] Starting local dedicated server ..." + @cd "$(SERVER_INSTALL_DIR)" && java -jar forge-1.12.2-14.23.5.2768-universal.jar nogui + +sanatize: + @echo "[1.12] Running sanatising tasks ..." + @djs tasks.js trailing-whitespaces + @djs tasks.js tabs-to-spaces + @djs tasks.js sync-languages + @djs tasks.js version-check + @djs tasks.js update-json + @git status -s . + +dist-check: + @echo "[1.12] Running dist checks ..." + @djs tasks.js dist-check + +dist: sanatize dist-check clean-all mod + @echo "[1.12] Distribution files ..." + @mkdir -p dist + @cp build/libs/$(MOD_JAR_PREFIX)* dist/ + @djs tasks.js dist diff --git a/build.gradle b/1.12/build.gradle similarity index 100% rename from build.gradle rename to 1.12/build.gradle diff --git a/gradle.properties b/1.12/gradle.properties similarity index 100% rename from gradle.properties rename to 1.12/gradle.properties diff --git a/gradle/wrapper/gradle-wrapper.jar b/1.12/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle/wrapper/gradle-wrapper.jar rename to 1.12/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/1.12/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle/wrapper/gradle-wrapper.properties rename to 1.12/gradle/wrapper/gradle-wrapper.properties diff --git a/gradlew b/1.12/gradlew similarity index 100% rename from gradlew rename to 1.12/gradlew diff --git a/gradlew.bat b/1.12/gradlew.bat similarity index 100% rename from gradlew.bat rename to 1.12/gradlew.bat diff --git a/1.12/meta/update.json b/1.12/meta/update.json new file mode 100644 index 0000000..3e4df43 --- /dev/null +++ b/1.12/meta/update.json @@ -0,0 +1,14 @@ +{ + "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", + "1.12.2": { + "1.0.0": "[R] Release based on v1.0.0-b4", + "1.0.0-b4": "[F] Fixed vanished recipe for the rebar concrete wall.\n[A] Concrete wall, material: IE concrete.", + "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.\n[A] Added rebar concrete wall.", + "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", + "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." + }, + "promos": { + "1.12.2-recommended": "1.0.0", + "1.12.2-latest": "1.0.0" + } +} \ No newline at end of file diff --git a/1.12/readme.md b/1.12/readme.md new file mode 100644 index 0000000..dff2b72 --- /dev/null +++ b/1.12/readme.md @@ -0,0 +1,34 @@ + +## Engineer's Decor (MC1.12.2) + +Mod sources for Minecraft version 1.12.2. + +- Description, credits, and features: Please see the readme in the repository root. + +- Compiled mod distribution channel is curseforge: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files. + +---- +## Revision history + + ------------------------------------------------------------------- + - v1.0.0 [R] Release based on v1.0.0-b4 + ------------------------------------------------------------------- + + - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall. + [A] Concrete wall, material: IE concrete. + + - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved. + [A] Added rebar concrete wall. + + - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). + + - v1.0.0-b1 [A] Initial structure. + [A] Added clinker bricks and clinker brick stairs. + [A] Added slag bricks and slag brick stairs. + [A] Added metal rung ladder. + [A] Added staggered metal steps ladder. + [A] Added treated wood ladder. + [A] Added treated wood pole. + [A] Added treated wood table. + +---- diff --git a/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java similarity index 100% rename from src/main/java/wile/engineersdecor/ModEngineersDecor.java rename to 1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecor.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecor.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecor.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java similarity index 100% rename from src/main/java/wile/engineersdecor/blocks/ModBlocks.java rename to 1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java diff --git a/src/main/java/wile/engineersdecor/detail/ClientProxy.java b/1.12/src/main/java/wile/engineersdecor/detail/ClientProxy.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ClientProxy.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ClientProxy.java diff --git a/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/1.12/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java diff --git a/src/main/java/wile/engineersdecor/detail/ModConfig.java b/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ModConfig.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java diff --git a/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java b/1.12/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java rename to 1.12/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java diff --git a/src/main/java/wile/engineersdecor/detail/ServerProxy.java b/1.12/src/main/java/wile/engineersdecor/detail/ServerProxy.java similarity index 100% rename from src/main/java/wile/engineersdecor/detail/ServerProxy.java rename to 1.12/src/main/java/wile/engineersdecor/detail/ServerProxy.java diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json similarity index 100% rename from src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json rename to 1.12/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang similarity index 100% rename from src/main/resources/assets/engineersdecor/lang/en_us.lang rename to 1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang diff --git a/src/main/resources/assets/engineersdecor/logo.png b/1.12/src/main/resources/assets/engineersdecor/logo.png similarity index 100% rename from src/main/resources/assets/engineersdecor/logo.png rename to 1.12/src/main/resources/assets/engineersdecor/logo.png diff --git a/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json b/1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json rename to 1.12/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json diff --git a/src/main/resources/assets/engineersdecor/recipes/_constants.json b/1.12/src/main/resources/assets/engineersdecor/recipes/_constants.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/_constants.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/_constants.json diff --git a/src/main/resources/assets/engineersdecor/recipes/_factories.json b/1.12/src/main/resources/assets/engineersdecor/recipes/_factories.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/_factories.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/_factories.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json b/1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json diff --git a/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json b/1.12/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json diff --git a/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json diff --git a/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json diff --git a/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json similarity index 100% rename from src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json rename to 1.12/src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png similarity index 100% rename from src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png rename to 1.12/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png diff --git a/src/main/resources/mcmod.info b/1.12/src/main/resources/mcmod.info similarity index 100% rename from src/main/resources/mcmod.info rename to 1.12/src/main/resources/mcmod.info diff --git a/src/main/resources/pack.mcmeta b/1.12/src/main/resources/pack.mcmeta similarity index 100% rename from src/main/resources/pack.mcmeta rename to 1.12/src/main/resources/pack.mcmeta diff --git a/1.12/tasks.js b/1.12/tasks.js new file mode 100644 index 0000000..40669ff --- /dev/null +++ b/1.12/tasks.js @@ -0,0 +1,347 @@ +#!/usr/bin/djs +"use strict"; +if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod source directory."); +if(!fs.isdir("../.git")) throw new Error("Missing git repository in parent directory of mod source."); + +var tasks = {}; + +tasks["dist-check"] = function() { + const uncommitted_changes = sys.shell("git status -s").trim(); + const gittags = sys.shell('git log -1 --format="%D"') + .replace(/[\s]/g,"").split(",") + .filter(function(s){ return s.indexOf("tag:")==0;}) + .map(function(s){ return s.replace(/^tag:/,"");}); + const version_engineersdecor = fs.readfile("gradle.properties", function(line){ + if(line.trim().indexOf("version_engineersdecor")!=0) return false; + return line.replace(/^.*?=/,"").trim() + }).trim(); + const git_remote = sys.shell("git remote -v").trim(); + const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim(); + const git_diff = sys.shell("git diff .").trim(); + var fails = []; + if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties."); + if(!gittags.length) fails.push("Version not tagged."); + if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version."); + if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository."); + if((git_branch != "develop") && (git_branch != "master")) { + fails.push("No valid branch for dist. (branch:'"+git_branch+"')"); + } else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) { + fails.push("Cannot make release dist on develop branch."); + } else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) { + fails.push("Cannot make beta dist on master branch."); + } + if(git_diff !== "") fails.push("Not everything committed to the GIT repository."); + if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing."); + if(fails.length>0) { + for(var i in fails) fails[i] = " - " + fails[i]; + alert("Dist check failed"); + alert(fails.join("\n")+"\n"); + exit(1); + } +}; + +tasks["sync-languages"] = function() { + function load() { + var lang_data = {}; + fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){ + var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase(); + var lines = fs.readfile(f).trim().split("\n"); + var was_eol_escape = false; + for(var i in lines) { + if(was_eol_escape) { + var k=0; + for(k=i-1; k>=0; --k) { + if(lines[k] != null) { + lines[k] += "\n" + lines[i]; + break; + } + } + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + lines[i] = null; + } else { + lines[i] = lines[i].trim(); + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + } + } + lang_data[lang_code] = lines.filter(function(l){return (l!==null);}); + return false; + }); + return lang_data; + } + function reference_content(lang_data, reflang_code) { + var lang_lines = []; + for(var i in lang_data[reflang_code]) { + var txt = lang_data[reflang_code][i].trim(); + if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var o = {key:key, tr:{}}; + o.tr[reflang_code] = val; + lang_lines.push(o); + } + delete lang_data[reflang_code]; + return lang_lines; + } + function add_language(lang_lines, lang_name, lang_data) { + const find_line = function(lines, key) { + for(var i in lines) { + if((typeof(lines[i]) !== "object")) continue; + if(lines[i].key.toLowerCase()==key.toLowerCase()) return i; + } + return -1; + }; + for(var i in lang_data) { + var txt = lang_data[i].trim(); + if(txt.search(/^#/)>=0) continue; + if(txt.search("=")<0) continue; + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var line_i = find_line(lang_lines, key); + if(line_i >= 0) { + lang_data[i] = undefined; + lang_lines[line_i].tr[lang_name] = val; + } + } + return lang_data; + } + + function complete_lang_lines(lang_lines, lang_names, reflang_code) { + var lang_outputs = {}; + for(var i in lang_names) lang_outputs[lang_names[i]] = []; + for(var i_line in lang_lines) { + var entry = lang_lines[i_line]; + if(typeof(entry) !== "object") { + for(var i in lang_names) lang_outputs[lang_names[i]].push(entry); + } else { + for(var i in lang_names) { + var name = lang_names[i]; + if(entry.tr[name] !== undefined) { + lang_outputs[name].push(entry.key + "=" + entry.tr[name]); + } else { + var added = entry.key + "=" + entry.tr[reflang_code]; + if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added; + lang_outputs[name].push(added); + if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'"); + } + } + } + } + return lang_outputs; + } + + const reflang_code = "en_us"; + var lang_data = load(); + var lang_names = Object.keys(lang_data); + var lang_lines = reference_content(lang_data, reflang_code); + for(var lang_name in lang_data) { + lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]); + lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; }); + if(lang_data[lang_name].length == 0) delete lang_data[lang_name]; + } + var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code); + for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n"; + + // Remaining lines in lang files (not in the reference lang file) + for(var lang_name in lang_data) { + for(var i in lang_data[lang_name]) { + if(lang_data[lang_name][i].search(/^#/)<0) { + var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,""); + output_data[lang_name] += added + "\n"; + print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'"); + } + } + } + for(var name in output_data) output_data[name] = output_data[name].trim() + "\n"; + + for(var name in output_data) { + fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]); + } +}; + +tasks["tabs-to-spaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\t]/g," "); + const n = txt.length - txt_length; + if(n > 0) { + print("File '" + file + "': Changed " + n + " tabs to 2 spaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["trailing-whitespaces"] = function() { + var file_list = (function() { + var ls = []; + const ext = ['java','json','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; + })(); + for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\r\t ]+[\n]/g,"\n"); + const n = txt_length - txt.length; + if(n > 0) { + print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." ); + fs.writefile(file, txt); + } + } +}; + +tasks["version-check"] = function() { + var version_minecraft=""; + var version_forge=""; + var version_engineersdecor=""; + fs.readfile("gradle.properties", function(line){ + if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) { + version_minecraft = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) { + version_forge = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) { + version_engineersdecor = line.replace(/^[^=]+=/,"").trim(); + } + return false; + }) + const combined_version = version_minecraft + "-" + version_engineersdecor; + var readme_version_found = fs.readfile("readme.md", function(line){ + var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) { + m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) return false; + } + return m[1]==version_engineersdecor; + }); + var ok=true; + if(!readme_version_found) { + alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog."); + ok = false; + } + if(!ok) { + alert("Version data:"); + alert(" - combined_version : '" + combined_version + "'"); + alert(" - version_forge : '" + version_forge + "'"); + exit(1); + } +}; + +tasks["dist"] = function() { + function readme_history(file_path) { + var readme = fs.readfile(file_path); + if(!readme) throw new Error("Failed to load readme.md"); + readme = readme.split(/[\r]?[\n]/); + while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift(); + while((readme.length > 0) && readme[0].trim()=="") readme.shift(); + // revision history section + if(!readme.length) throw new Error("Revision history section not found in readme"); + readme.shift(); + var end_of_history = readme.length; + for(var i=0; i= 0) { end_of_history=i; break; } + if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker."); + // remove empty lines, splitters + while(readme.length >= end_of_history) readme.pop(); + while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop(); + + const min_indent = readme + .map(function(s){return s.search(/[^\s]/)}) + .filter(function(e){return e>=0}) + .reduce(function(acc,e){return (e 1) { + for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); } + } + return readme.join("\n"); + } + const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
+  fs.writefile("dist/revision-history.html", html);
+};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.cwd();
+  function read_history() {
+    var readme = fs.readfile(root_dir + "/readme.md");
+    if(!readme) throw new Error("Failed to load readme.md");
+    readme = readme.split(/[\r]?[\n]/);
+    while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+    // revision history section
+    if(!readme.length) throw new Error("Revision history section not found in readme");
+    readme.shift();
+    var end_of_history = readme.length;
+    for(var i=0; i= 0) { end_of_history=i; break; }
+    if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+    // remove empty lines, splitters
+    while(readme.length >= end_of_history) readme.pop();
+    for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
+    readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
+    // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^[\[\-]/) < 0) {
+        readme[i-1] += " " + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Condense log entries sepatated with newlines to one line for each version
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^-/) < 0) {
+        readme[i-1] += "\n" + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Separate versions.
+    var history = {};
+    for(var i in readme) {
+      var line = readme[i].replace(/^[\sv-]+/g,"").trim();
+      var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
+      var txt = line.substr(line.search(" ")).trim();
+      if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
+      history[ver] = txt;
+    }
+    return history;
+  }
+  var history = read_history();
+  var latest_release = "";
+  var latest_beta = "";
+  for(var ver in history) { latest_beta=ver; break; }
+  for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.12.2": history,
+    promos: {
+      "1.12.2-recommended": latest_release,
+      "1.12.2-latest": latest_beta,
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}
diff --git a/1.13/.gitignore b/1.13/.gitignore
new file mode 100644
index 0000000..2103c59
--- /dev/null
+++ b/1.13/.gitignore
@@ -0,0 +1,35 @@
+bin
+*.launch
+.settings
+.metadata
+.classpath
+.project
+out
+*.ipr
+*.iws
+*.iml
+.idea
+build
+.gradle
+*.tmp
+*.log
+*.jks
+eclipse
+run
+tests
+/dist
+signing.*
+src/main/java/archive
+src/main/resources/assets/minecraft
+.vscode
+/classes
+/dev
+/tmp
+/archive
+/assets-src
+.gimp
+*.xcf
+desktop.ini
+.DS_Store
+Thumbs.db
+forge*changelog.txt
diff --git a/1.13/Makefile b/1.13/Makefile
new file mode 100644
index 0000000..1d2c95e
--- /dev/null
+++ b/1.13/Makefile
@@ -0,0 +1,75 @@
+# @file Makefile
+# @author Stefan Wilhelm (wile)
+# @license MIT
+#
+# GNU Make makefile for, well, speeding
+# up the development a bit.
+# You very likely need some tools installed
+# to use all build targets, so this file is
+# not "official". If you work on windows and
+# install GIT with complete shell PATH (the
+# red marked option in the GIT installer) you
+# should have the needed unix tools available.
+# For image stripping install imagemagick and
+# also put the "magick" executable in the PATH.
+#
+MOD_JAR_PREFIX=engineersdecor-
+MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar))
+
+ifeq ($(OS),Windows_NT)
+GRADLE=gradlew.bat --no-daemon
+GRADLE_STOP=gradlew.bat --stop
+DJS=djs
+else
+GRADLE=./gradlew --no-daemon
+GRADLE_STOP=./gradlew --stop
+DJS=djs
+endif
+
+wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d))
+
+#
+# Targets
+#
+.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server
+
+default: mod
+
+all: clean clean-all mod | install
+
+mod:
+	@echo "[1.13] Building mod using gradle ..."
+	@$(GRADLE) build $(GRADLE_OPTS)
+
+clean:
+	@echo "[1.13] Cleaning ..."
+	@rm -f build/libs/*
+	@$(GRADLE) clean
+
+clean-all:
+	@echo "[1.13] Cleaning using gradle ..."
+	@rm -f dist/*
+	@$(GRADLE) clean cleanCache
+
+init:
+	@echo "[1.13] Initialising eclipse workspace using gradle ..."
+	@$(GRADLE) eclipse
+
+sanatize:
+	@echo "[1.13] Running sanatising tasks ..."
+	@djs tasks.js trailing-whitespaces
+	@djs tasks.js tabs-to-spaces
+	@djs tasks.js sync-languages
+	@djs tasks.js version-check
+	@djs tasks.js update-json
+	@git status -s .
+
+dist-check:
+	@echo "[1.13] Running dist checks ..."
+	@djs tasks.js dist-check
+
+dist: sanatize dist-check clean-all mod
+	@echo "[1.13] Distribution files ..."
+	@mkdir -p dist
+	@cp build/libs/$(MOD_JAR_PREFIX)* dist/
+	@djs tasks.js dist
diff --git a/1.13/build.gradle b/1.13/build.gradle
new file mode 100644
index 0000000..5d48315
--- /dev/null
+++ b/1.13/build.gradle
@@ -0,0 +1,79 @@
+// @file build.gradle
+// Engineer's decor mod gradle build relay (mc1.13.2)
+buildscript {
+  repositories {
+    maven { url = 'https://files.minecraftforge.net/maven' }
+    jcenter()
+    mavenCentral()
+  }
+  dependencies {
+    classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
+  }
+}
+apply plugin: 'net.minecraftforge.gradle'
+apply plugin: 'eclipse'
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
+//-----------------------------------------------------------------------------
+version = "${version_engineersdecor}"
+group = "wile.engineersdecor"
+archivesBaseName = "engineersdecor-${version_minecraft}"
+
+// def signing = { ->
+//   def sp = new Properties()
+//   if(file("signing.properties").exists()) file("signing.properties").withInputStream { sp.load(it) }
+//   return sp
+// }()
+
+// def git_version = { ->
+//   def stdout = new ByteArrayOutputStream()
+//   exec {
+//     commandLine 'git', 'log', '-1', '--format=%h'
+//     standardOutput = stdout
+//   }
+//   return stdout.toString().trim()
+// }()
+
+minecraft {
+  mappings channel: 'snapshot', version: '20180921-1.13'
+  // accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg')
+  runs {
+    client {
+      workingDirectory project.file('run')
+      property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
+      property 'forge.logging.console.level', 'debug'
+      mods {
+        engineersdecor {
+          source sourceSets.main
+        }
+      }
+    }
+    server {
+      workingDirectory project.file('run')
+      property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
+      property 'forge.logging.console.level', 'debug'
+      mods {
+        engineersdecor {
+          source sourceSets.main
+        }
+      }
+    }
+  }
+}
+
+dependencies {
+  minecraft "net.minecraftforge:forge:${version_forge_minecraft}"
+}
+
+jar {
+  manifest {
+    attributes([
+      "Specification-Title": "engineersdecor",
+      "Specification-Vendor": "wilechaote",
+      "Specification-Version": "1", // We are version 1 of ourselves
+      "Implementation-Title": project.name,
+      "Implementation-Version": "${version_engineersdecor}",
+      "Implementation-Vendor" :"wilechaote",
+      "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
+    ])
+  }
+}
diff --git a/1.13/gradle.properties b/1.13/gradle.properties
new file mode 100644
index 0000000..b6af3b5
--- /dev/null
+++ b/1.13/gradle.properties
@@ -0,0 +1,14 @@
+# @file gradle.properties
+org.gradle.daemon=false
+org.gradle.jvmargs=-Xmx8G
+version_minecraft=1.13.2
+version_forge_minecraft=1.13.2-25.0.44
+version_engineersdecor=1.0.0-a1
+#
+# jar signing data loaded from signing.properties in the project root.
+#
+#signing.keystore_file=
+#signing.keystore_alias=
+#signing.keystore_pass=
+#signing.keystore_keypass=
+#fingerprint_sha1.fp_sha1=
diff --git a/1.13/gradle/wrapper/gradle-wrapper.jar b/1.13/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7a3265e
Binary files /dev/null and b/1.13/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/1.13/gradle/wrapper/gradle-wrapper.properties b/1.13/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..949819d
--- /dev/null
+++ b/1.13/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
diff --git a/1.13/gradlew b/1.13/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/1.13/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/1.13/gradlew.bat b/1.13/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/1.13/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/1.13/meta/update.json b/1.13/meta/update.json
new file mode 100644
index 0000000..f52ed78
--- /dev/null
+++ b/1.13/meta/update.json
@@ -0,0 +1,10 @@
+{
+  "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+  "1.13.2": {
+    "1.0.0-a1": "[A] Initial port to 1.13.2 with Forge beta."
+  },
+  "promos": {
+    "1.13.2-recommended": "",
+    "1.13.2-latest": "1.0.0-a1"
+  }
+}
\ No newline at end of file
diff --git a/1.13/readme.md b/1.13/readme.md
new file mode 100644
index 0000000..3790500
--- /dev/null
+++ b/1.13/readme.md
@@ -0,0 +1,15 @@
+
+## Engineer's Decor (MC1.13.2)
+
+Mod sources for Minecraft version 1.13.2.
+
+- Description, credits, and features: Please see the readme in the repository root.
+
+- Compiled mod distribution channel is curseforge: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files.
+
+----
+## Revision history
+
+    - v1.0.0-a1 [A] Initial port to 1.13.2 with Forge beta.
+
+----
diff --git a/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java
new file mode 100644
index 0000000..48d24da
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/ModEngineersDecor.java
@@ -0,0 +1,100 @@
+package wile.engineersdecor;
+
+import net.minecraft.item.ItemGroup;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.crafting.CraftingHelper;
+import wile.engineersdecor.blocks.ModBlocks;
+import wile.engineersdecor.detail.ModConfig;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.client.model.obj.OBJLoader;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.DistExecutor;
+import net.minecraftforge.fml.ModLoadingContext;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
+import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
+import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
+import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
+import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import wile.engineersdecor.detail.RecipeCondModSpecific;
+
+
+@Mod("engineersdecor")
+public class ModEngineersDecor
+{
+  public static final String MODID = "engineersdecor"; // fixed name for double checks
+  private static final Logger LOGGER = LogManager.getLogger();
+
+  public ModEngineersDecor()
+  {
+    FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetup);
+    FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSendImc);
+    FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onRecvImc);
+    FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onClientSetup);
+    MinecraftForge.EVENT_BUS.register(this);
+  }
+
+  public static final Logger logger() { return LOGGER; }
+
+  //
+  // Events
+  //
+
+  private void onSetup(final FMLCommonSetupEvent event)
+  {
+    ModLoadingContext.get().registerConfig(net.minecraftforge.fml.config.ModConfig.Type.COMMON, ModConfig.conf_spec);
+    LOGGER.info("Registering recipe condition processor ...");
+    CraftingHelper.register(new ResourceLocation(MODID, "grc"), new RecipeCondModSpecific());
+  }
+
+  private void onClientSetup(final FMLClientSetupEvent event)
+  {} // Currently not needed: OBJLoader.INSTANCE.addDomain(ModEngineersDecor.MODID);
+
+  private void onSendImc(final InterModEnqueueEvent event)
+  {}
+
+  private void onRecvImc(final InterModProcessEvent event)
+  {}
+
+  @SubscribeEvent
+  public void onServerStarting(FMLServerStartingEvent event)
+  {}
+
+  @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
+  public static class RegistryEvents
+  {
+    @SubscribeEvent
+    public static void onBlocksRegistry(final RegistryEvent.Register event)
+    { ModBlocks.registerBlocks(event); }
+
+    @SubscribeEvent
+    public static void onItemRegistry(final RegistryEvent.Register event)
+    { ModBlocks.registerItemBlocks(event); }
+  }
+
+  //
+  // Sided proxy functionality (skel)
+  //
+  public static ISidedProxy proxy = DistExecutor.runForDist(()->ClientProxy::new, ()->ServerProxy::new);
+  public interface ISidedProxy {}
+  public static final class ClientProxy implements ISidedProxy {}
+  public static final class ServerProxy implements ISidedProxy {}
+
+  //
+  // Item group / creative tab
+  //
+  public static final ItemGroup ITEMGROUP = (new ItemGroup("tab" + MODID) {
+    @OnlyIn(Dist.CLIENT)
+    public ItemStack createIcon()
+    { return new ItemStack(ModBlocks.TREATED_WOOD_LADDER); }
+  });
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java
new file mode 100644
index 0000000..5c0018b
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecor.java
@@ -0,0 +1,73 @@
+/*
+ * @file BlockDecorFull.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Common functionality class for decor blocks.
+ * Mainly needed for:
+ * - MC block defaults.
+ * - Tooltip functionality
+ * - Model initialisation
+ */
+package wile.engineersdecor.blocks;
+
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.EnumPushReaction;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.util.*;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BlockDecor extends Block
+{
+
+  // The config combines some aspects of blocks, allowing to define different behaviour at construction time, without excessive polymorphy.
+  // It's an old school flag set as it is used internally only and shall not have as littlt impact on performance as possible.
+  public final long config;
+  public static final long CFG_DEFAULT                = 0x0000000000000000L; // no special config
+  public static final long CFG_CUTOUT                 = 0x0000000000000001L; // cutout rendering
+  public static final long CFG_HORIZIONTAL            = 0x0000000000000002L; // horizontal block, affects bounding box calculation at construction time
+  public static final long CFG_HORIZIONTAL_PLACEMENT  = 0x0000000000000004L; // placed in the horizontzal direction the player is looking when placing.
+  public static final long CFG_WALL_DOOR_CONNECTION   = 0x0000000000000008L; // wall block connects to fence gates and doors.
+
+  public BlockDecor(long config, Block.Properties properties)
+  { super(properties); this.config = config; }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public BlockRenderLayer getRenderLayer()
+  { return ((config & CFG_CUTOUT)!=0) ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isFullCube(IBlockState state)
+  { return ((config & CFG_CUTOUT)==0); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isNormalCube(IBlockState state)
+  { return ((config & CFG_CUTOUT)==0); }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public EnumPushReaction getPushReaction(IBlockState state)
+  { return EnumPushReaction.NORMAL; }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java
new file mode 100644
index 0000000..0801e72
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java
@@ -0,0 +1,103 @@
+/*
+ * @file BlockDecorDirected.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Smaller (cutout) block with a defined facing.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.state.StateContainer;
+import net.minecraft.util.math.shapes.VoxelShapes;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.item.BlockItemUseContext;
+import net.minecraft.state.DirectionProperty;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDirectional;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.util.BlockRenderLayer;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+
+public class BlockDecorDirected extends BlockDecor
+{
+  public static final DirectionProperty FACING = BlockDirectional.FACING;
+  protected final ArrayList AABBs;
+
+  public BlockDecorDirected(long config, Block.Properties builder, final AxisAlignedBB unrotatedAABB)
+  {
+    super(config, builder);
+    setDefaultState(stateContainer.getBaseState().with(FACING, EnumFacing.UP));
+    final boolean is_horizontal = ((config & BlockDecor.CFG_HORIZIONTAL)!=0);
+    AABBs = new ArrayList(Arrays.asList(
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.DOWN, is_horizontal)),
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.UP, is_horizontal)),
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.NORTH, is_horizontal)),
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.SOUTH, is_horizontal)),
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.WEST, is_horizontal)),
+      VoxelShapes.create(ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST, is_horizontal)),
+      VoxelShapes.create(unrotatedAABB),
+      VoxelShapes.create(unrotatedAABB)
+    ));
+  }
+
+  @Override
+  public boolean isFullCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isNormalCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public BlockFaceShape getBlockFaceShape(IBlockReader world, IBlockState state, BlockPos pos, EnumFacing face)
+  { return BlockFaceShape.UNDEFINED; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public VoxelShape getShape(IBlockState state, IBlockReader source, BlockPos pos)
+  { return AABBs.get(((EnumFacing)state.get(FACING)).getIndex() & 0x7); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public VoxelShape getCollisionShape(IBlockState state, IBlockReader world, BlockPos pos)
+  { return getShape(state, world, pos); }
+
+  @Override
+  protected void fillStateContainer(StateContainer.Builder builder)
+  { builder.add(FACING); }
+
+  @Override
+  @Nullable
+  public IBlockState getStateForPlacement(BlockItemUseContext context) {
+    if((config & CFG_HORIZIONTAL_PLACEMENT)!=0) {
+      // placement in direction the player is facing
+      return getDefaultState().with(FACING, context.getPlacementHorizontalFacing());
+    } else {
+      // default: placement on the face the player clicking
+      return getDefaultState().with(FACING, context.getFace());
+    }
+  }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public BlockRenderLayer getRenderLayer()
+  { return BlockRenderLayer.CUTOUT; }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java
new file mode 100644
index 0000000..f18eabf
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java
@@ -0,0 +1,49 @@
+/*
+ * @file BlockDecorFull.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Full block characteristics class. Explicitly overrides some
+ * `Block` methods to return faster due to exclusive block properties.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import javax.annotation.Nullable;
+import java.util.List;
+
+
+public class BlockDecorFull extends BlockDecor
+{
+  public BlockDecorFull(long config, Block.Properties properties)
+  { super(config, properties); }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isFullCube(IBlockState state)
+  { return true; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isNormalCube(IBlockState state)
+  { return true; }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java
new file mode 100644
index 0000000..c91a98c
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java
@@ -0,0 +1,69 @@
+/*
+ * @file BlockDecorLadder.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Ladder block. The implementation is based on the vanilla
+ * net.minecraft.block.BlockLadder. Minor changes to enable
+ * later configuration (for block list based construction
+ * time configuration), does not drop when the block behind
+ * is broken, etc.
+ */
+package wile.engineersdecor.blocks;
+
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.block.*;
+import net.minecraft.block.material.EnumPushReaction;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.util.math.shapes.VoxelShapes;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.util.*;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import javax.annotation.Nullable;
+import java.util.List;
+
+
+public class BlockDecorLadder extends BlockLadder
+{
+  protected static final AxisAlignedBB EDLADDER_UNROTATED_AABB = ModAuxiliaries.getPixeledAABB(3, 0, 0, 13, 16, 2);
+  protected static final VoxelShape EDLADDER_SOUTH_AABB =  VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.SOUTH, false));
+  protected static final VoxelShape EDLADDER_EAST_AABB  = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.EAST, false));
+  protected static final VoxelShape EDLADDER_WEST_AABB  = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.WEST, false));
+  protected static final VoxelShape EDLADDER_NORTH_AABB = VoxelShapes.create(ModAuxiliaries.getRotatedAABB(EDLADDER_UNROTATED_AABB, EnumFacing.NORTH, false));
+
+  public BlockDecorLadder(long config, Block.Properties builder)
+  { super(builder); }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  public VoxelShape getShape(IBlockState state, IBlockReader worldIn, BlockPos pos)
+  {
+    switch ((EnumFacing)state.get(FACING)) {
+      case NORTH: return EDLADDER_NORTH_AABB;
+      case SOUTH: return EDLADDER_SOUTH_AABB;
+      case WEST: return EDLADDER_WEST_AABB;
+      default: return EDLADDER_EAST_AABB;
+    }
+  }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public EnumPushReaction getPushReaction(IBlockState state)
+  { return EnumPushReaction.NORMAL; }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java
new file mode 100644
index 0000000..f0433db
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java
@@ -0,0 +1,45 @@
+/*
+ * @file BlockDecorStairs.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Stairs and roof blocks, almost entirely based on vanilla stairs.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.*;
+import net.minecraft.block.material.EnumPushReaction;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import wile.engineersdecor.detail.ModAuxiliaries;
+
+import javax.annotation.Nullable;
+import java.util.List;
+
+
+public class BlockDecorStairs extends BlockStairs
+{
+  public BlockDecorStairs(long config, IBlockState state, Block.Properties properties)
+  { super(state, properties); }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public EnumPushReaction getPushReaction(IBlockState state)
+  { return EnumPushReaction.NORMAL; }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java
new file mode 100644
index 0000000..916a970
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java
@@ -0,0 +1,75 @@
+/*
+ * @file BlockDecorWall.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Wall blocks.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.*;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.init.Fluids;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.shapes.VoxelShape;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.world.IBlockReader;
+import net.minecraft.world.IWorld;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import wile.engineersdecor.detail.ModAuxiliaries;
+
+import javax.annotation.Nullable;
+import java.util.List;
+
+
+public class BlockDecorWall extends BlockWall
+{
+  private final VoxelShape[] shape_voxels;
+  private final VoxelShape[] collision_shape_voxels;
+
+  public BlockDecorWall(long config, Block.Properties builder)
+  {
+    super(builder);
+    this.shape_voxels = buildWallShapes(4.0F, 4.0F, 16.0F, 0.0F, 16.0F);
+    this.collision_shape_voxels = buildWallShapes(4.0F, 4.0F, 24.0F, 0.0F, 24.0F);
+  }
+
+  @Override
+  @OnlyIn(Dist.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  protected VoxelShape[] buildWallShapes(float pole_width_x, float pole_width_z, float pole_height, float side_min_y, float side_max_y)
+  { return super.func_196408_a(pole_width_x, pole_width_z, pole_height, side_min_y, side_max_y); }
+
+  @Override
+  public VoxelShape getShape(IBlockState state, IBlockReader world, BlockPos pos)
+  { return shape_voxels[this.getIndex(state)]; }
+
+  @Override
+  public VoxelShape getCollisionShape(IBlockState state, IBlockReader world, BlockPos pos)
+  { return collision_shape_voxels[this.getIndex(state)]; }
+
+  private boolean attachesTo(IBlockState state, BlockFaceShape shape)
+  { final Block block = state.getBlock(); return (shape==BlockFaceShape.SOLID) && (!isExcepBlockForAttachWithPiston(block)) || (shape==BlockFaceShape.MIDDLE_POLE_THICK) || ((shape==BlockFaceShape.MIDDLE_POLE) && (block instanceof BlockFenceGate)); }
+
+  @Override
+  public IBlockState updatePostPlacement(IBlockState state, EnumFacing facing, IBlockState facingState, IWorld world, BlockPos currentPos, BlockPos facingPos)
+  {
+    if(state.get(WATERLOGGED)) world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world));
+    if(facing == EnumFacing.DOWN) return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos);
+    boolean n = (facing==EnumFacing.NORTH) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(NORTH);
+    boolean e = (facing==EnumFacing.EAST) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(EAST);
+    boolean s = (facing==EnumFacing.SOUTH) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(SOUTH);
+    boolean w = (facing==EnumFacing.WEST) ? this.attachesTo(facingState, facingState.getBlockFaceShape(world, facingPos, facing.getOpposite())) : state.get(WEST);
+    boolean not_straight = (!n || !s || e || w) && (n  || s || !e || !w);
+    return state.with(UP, not_straight).with(NORTH, n).with(EAST, e).with(SOUTH, s).with(WEST, w);
+  }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java
new file mode 100644
index 0000000..e736ad6
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/blocks/ModBlocks.java
@@ -0,0 +1,164 @@
+/*
+ * @file ModBlocks.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Definition and initialisation of blocks of this
+ * module, along with their tile entities if applicable.
+ *
+ * Note: Straight forward definition of different blocks/entities
+ *       to make recipes, models and texture definitions easier.
+ */
+package wile.engineersdecor.blocks;
+
+import wile.engineersdecor.ModEngineersDecor;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.material.MaterialColor;
+import net.minecraft.block.Block;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.event.RegistryEvent;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import javax.annotation.Nonnull;
+
+@SuppressWarnings("unused")
+public class ModBlocks
+{
+  public static final BlockDecorFull CLINKER_BRICK_BLOCK = (BlockDecorFull)(new BlockDecorFull(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_block"));
+
+  public static final BlockDecorStairs CLINKER_BRICK_STAIRS = (BlockDecorStairs)(new BlockDecorStairs(
+    BlockDecor.CFG_DEFAULT,
+    CLINKER_BRICK_BLOCK.getDefaultState(),
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_stairs"));
+
+  public static final BlockDecorFull SLAG_BRICK_BLOCK = (BlockDecorFull)(new BlockDecorFull(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "slag_brick_block"));
+
+  public static final BlockDecorStairs SLAG_BRICK_STAIRS = (BlockDecorStairs)(new BlockDecorStairs(
+    BlockDecor.CFG_DEFAULT,
+    SLAG_BRICK_BLOCK.getDefaultState(),
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "slag_brick_stairs"));
+
+  public static final BlockDecorFull REBAR_CONCRETE_BLOCK = (BlockDecorFull)(new BlockDecorFull(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(6f, 2000f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete"));
+
+  public static final BlockDecorStairs REBAR_CONCRETE_STAIRS = (BlockDecorStairs)(new BlockDecorStairs(
+    BlockDecor.CFG_DEFAULT,
+    REBAR_CONCRETE_BLOCK.getDefaultState(),
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 2000f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete_stairs"));
+
+  public static final BlockDecorWall REBAR_CONCRETE_WALL = (BlockDecorWall)(new BlockDecorWall(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 2000f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "rebar_concrete_wall"));
+
+  public static final BlockDecorWall CONCRETE_WALL = (BlockDecorWall)(new BlockDecorWall(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(2f, 50f).sound(SoundType.STONE)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "concrete_wall"));
+
+  public static final BlockDecorLadder METAL_RUNG_LADDER = (BlockDecorLadder)(new BlockDecorLadder(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(1.8f, 25f).sound(SoundType.METAL)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "metal_rung_ladder"));
+
+  public static final BlockDecorLadder METAL_RUNG_STEPS = (BlockDecorLadder)(new BlockDecorLadder(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(1.8f, 25f).sound(SoundType.METAL)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "metal_rung_steps"));
+
+  public static final BlockDecorLadder TREATED_WOOD_LADDER = (BlockDecorLadder)(new BlockDecorLadder(
+    BlockDecor.CFG_DEFAULT,
+    Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.8f, 25f).sound(SoundType.WOOD)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_ladder"));
+
+  public static final BlockDecor TREATED_WOOD_TABLE = (BlockDecor)(new BlockDecor(
+    BlockDecor.CFG_CUTOUT,
+    Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.0f, 15f).sound(SoundType.WOOD)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_table"));
+
+  public static final BlockDecorDirected TREATED_WOOD_POLE = (BlockDecorDirected)(new BlockDecorDirected(
+    BlockDecor.CFG_CUTOUT,
+    Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1.0f, 15f).sound(SoundType.WOOD),
+    ModAuxiliaries.getPixeledAABB(5.8,5.8,0, 10.2,10.2,16)
+  )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "treated_wood_pole"));
+
+  //  public static final BlockDecorFull IRON_SHEET_ROOF_FULLBLOCK = new BlockDecorFull("iron_sheet_roof_block", 0, Material.IRON, 1.8f, 25f, SoundType.METAL);
+  //  public static final BlockDecorStairs IRON_SHEET_ROOF = new BlockDecorStairs("iron_sheet_roof", IRON_SHEET_ROOF_FULLBLOCK.getDefaultState());
+
+  private static final Block modBlocks[] = {
+    CLINKER_BRICK_BLOCK,
+    CLINKER_BRICK_STAIRS,
+    SLAG_BRICK_BLOCK,
+    SLAG_BRICK_STAIRS,
+    REBAR_CONCRETE_BLOCK,
+    REBAR_CONCRETE_STAIRS,
+    REBAR_CONCRETE_WALL,
+
+    METAL_RUNG_LADDER,
+    METAL_RUNG_STEPS,
+    TREATED_WOOD_LADDER,
+
+    TREATED_WOOD_POLE,
+    TREATED_WOOD_TABLE,
+  };
+
+  private static final Block ieDependentBlocks[] = {
+    CONCRETE_WALL
+  };
+
+  private static final Block devBlocks[] = {
+//    IRON_SHEET_ROOF, // model looks not good enough yet
+  };
+
+  private static ArrayList registeredBlocks = new ArrayList<>();
+
+  @Nonnull
+  public static List getRegisteredBlocks()
+  { return Collections.unmodifiableList(registeredBlocks); }
+
+  public static final void registerBlocks(RegistryEvent.Register event)
+  {
+    ArrayList allBlocks = new ArrayList<>();
+    Collections.addAll(allBlocks, modBlocks);
+    // @todo: find way to remove items from JEI, creative tab, etc instead of omitting registration.
+    if(ModAuxiliaries.isModLoaded("immersiveengineering")) ModAuxiliaries.logInfo("Immersive Engineering also installed ...");
+    Collections.addAll(allBlocks, ieDependentBlocks);
+    // @todo: config not available yet, other registration control for experimental features needed.
+    //if(ModConfig.MISC.with_experimental.get()) Collections.addAll(allBlocks, devBlocks);
+    registeredBlocks.addAll(allBlocks);
+    for(Block e:registeredBlocks) event.getRegistry().register(e);
+    ModAuxiliaries.logInfo("Registered " + Integer.toString(registeredBlocks.size()) + " blocks.");
+  }
+
+  /**
+   * Registers items for all blocks. Requires registerBlocks() event to be received first.
+   */
+  public static final void registerItemBlocks(RegistryEvent.Register event)
+  {
+    int n = 0;
+    for(Block e:registeredBlocks) {
+      ResourceLocation rl = e.getRegistryName();
+      if(rl == null) continue;
+      event.getRegistry().register(new ItemBlock(e, (new ItemBlock.Properties().group(ModEngineersDecor.ITEMGROUP))).setRegistryName(rl));
+      ++n;
+    }
+  }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java
new file mode 100644
index 0000000..f26125f
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java
@@ -0,0 +1,167 @@
+/*
+ * @file ModAuxiliaries.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * General commonly used functionality.
+ *
+ * @TODO KEYBOARD INPUT
+ */
+package wile.engineersdecor.detail;
+
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.util.text.TextComponentString;
+import net.minecraft.world.IBlockReader;
+import net.minecraftforge.fml.ModList;
+import org.lwjgl.glfw.GLFW;
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.client.util.InputMappings;
+import net.minecraft.util.text.TextComponentTranslation;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+
+
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ModAuxiliaries
+{
+  /**
+   * Text localisation wrapper, implicitly prepends `ModEngineersDecor.MODID` to the
+   * translation keys. Forces formatting argument, nullable if no special formatting shall be applied..
+   */
+  public static TextComponentTranslation localizable(String modtrkey, @Nullable TextFormatting color, Object... args)
+  {
+    TextComponentTranslation tr = new TextComponentTranslation(ModEngineersDecor.MODID+"."+modtrkey, args);
+    if(color!=null) tr.getStyle().setColor(color);
+    return tr;
+  }
+
+  @OnlyIn(Dist.CLIENT)
+  public static String localize(String translationKey, Object... args)
+  {
+    TextComponentTranslation tr = new TextComponentTranslation(translationKey, args);
+    tr.getStyle().setColor(TextFormatting.RESET);
+    final String ft = tr.getFormattedText();
+    if(ft.contains("${")) {
+      // Non-recursive, non-argument lang file entry cross referencing.
+      Pattern pt = Pattern.compile("\\$\\{([\\w\\.]+)\\}");
+      Matcher mt = pt.matcher(ft);
+      StringBuffer sb = new StringBuffer();
+      while(mt.find()) mt.appendReplacement(sb, (new TextComponentTranslation(mt.group(1))).getFormattedText().trim());
+      mt.appendTail(sb);
+      return sb.toString();
+    } else {
+      return ft;
+    }
+  }
+
+  /**
+   * Returns true if a given key is translated for the current language.
+   */
+  @OnlyIn(Dist.CLIENT)
+  public static boolean hasTranslation(String key)
+  { return net.minecraft.client.resources.I18n.hasKey(key); }
+
+  public static final class Tooltip
+  {
+    @OnlyIn(Dist.CLIENT)
+    public static boolean extendedTipCondition()
+    { return InputMappings.isKeyDown(GLFW.GLFW_KEY_LEFT_SHIFT) || InputMappings.isKeyDown(GLFW.GLFW_KEY_RIGHT_SHIFT); }
+
+    @OnlyIn(Dist.CLIENT)
+    public static boolean helpCondition()
+    { return extendedTipCondition() && (InputMappings.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL) || InputMappings.isKeyDown(GLFW.GLFW_KEY_RIGHT_CONTROL)); }
+
+    /**
+     * Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT.
+     * Returns true if the localisable help/tip was added, false if not (either not CTL/SHIFT or
+     * no translation found).
+     */
+    @OnlyIn(Dist.CLIENT)
+    public static boolean addInformation(@Nullable String advancedTooltipTranslationKey, @Nullable String helpTranslationKey, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints)
+    {
+      // Note: intentionally not using keybinding here, this must be `control` or `shift`. MC uses lwjgl Keyboard,
+      //       so using this also here should be ok.
+      final boolean help_available = (helpTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".help");
+      final boolean tip_available = (advancedTooltipTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".tip");
+      if((!help_available) && (!tip_available)) return false;
+      if(helpCondition()) {
+        if(!help_available) return false;
+        String s = localize(helpTranslationKey + ".help");
+        if(s.isEmpty()) return false;
+        tooltip.add(new TextComponentString(s)); // @todo: check how to optimise that (to use TextComponentTranslation directly without compat losses)
+        return true;
+      } else if(extendedTipCondition()) {
+        if(!tip_available) return false;
+        String s = localize(advancedTooltipTranslationKey + ".tip");
+        if(s.isEmpty()) return false;
+        tooltip.add(new TextComponentString(s));
+        return true;
+      } else if(addAdvancedTooltipHints) {
+        String s = "";
+        if(tip_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
+        if(help_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.help");
+        tooltip.add(new TextComponentString(s));
+      }
+      return false;
+    }
+
+    /**
+     * Adds an extended tooltip or help tooltip for a given stack depending on the key states of CTRL and SHIFT.
+     * Format in the lang file is (e.g. for items): "item.MODID.REGISTRYNAME.tip" and "item.MODID.REGISTRYNAME.help".
+     * Return value see method pattern above.
+     */
+    @OnlyIn(Dist.CLIENT)
+    public static boolean addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints)
+    { return addInformation(stack.getTranslationKey(), stack.getTranslationKey(), tooltip, flag, addAdvancedTooltipHints); }
+  }
+
+  public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1)
+  { return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); }
+
+  public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, EnumFacing new_facing, boolean horizontal_rotation)
+  {
+    if(!horizontal_rotation) {
+      switch(new_facing.getIndex()) {
+        case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D
+        case 1: return new AxisAlignedBB(1-bb.maxX,   bb.minZ,   bb.minY, 1-bb.minX,   bb.maxZ,   bb.maxY); // U
+        case 2: return new AxisAlignedBB(1-bb.maxX,   bb.minY, 1-bb.maxZ, 1-bb.minX,   bb.maxY, 1-bb.minZ); // N
+        case 3: return new AxisAlignedBB(  bb.minX,   bb.minY,   bb.minZ,   bb.maxX,   bb.maxY,   bb.maxZ); // S --> bb
+        case 4: return new AxisAlignedBB(1-bb.maxZ,   bb.minY,   bb.minX, 1-bb.minZ,   bb.maxY,   bb.maxX); // W
+        case 5: return new AxisAlignedBB(  bb.minZ,   bb.minY, 1-bb.maxX,   bb.maxZ,   bb.maxY, 1-bb.minX); // E
+      }
+    } else {
+      switch(new_facing.getIndex()) {
+        case 0: return new AxisAlignedBB(  bb.minX, bb.minY,   bb.minZ,   bb.maxX, bb.maxY,   bb.maxZ); // D --> bb
+        case 1: return new AxisAlignedBB(  bb.minX, bb.minY,   bb.minZ,   bb.maxX, bb.maxY,   bb.maxZ); // U --> bb
+        case 2: return new AxisAlignedBB(  bb.minX, bb.minY,   bb.minZ,   bb.maxX, bb.maxY,   bb.maxZ); // N --> bb
+        case 3: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // S
+        case 4: return new AxisAlignedBB(  bb.minZ, bb.minY, 1-bb.maxX,   bb.maxZ, bb.maxY, 1-bb.minX); // W
+        case 5: return new AxisAlignedBB(1-bb.maxZ, bb.minY,   bb.minX, 1-bb.minZ, bb.maxY,   bb.maxX); // E
+      }
+    }
+    return bb;
+  }
+
+  public static final boolean isModLoaded(final String registry_name)
+  { return ModList.get().isLoaded(registry_name); }
+
+  public static final void logInfo(final String msg)
+  { ModEngineersDecor.logger().info(msg); }
+
+  public static final void logWarn(final String msg)
+  { ModEngineersDecor.logger().warn(msg); }
+
+  public static final void logError(final String msg)
+  { ModEngineersDecor.logger().error(msg); }
+
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java b/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java
new file mode 100644
index 0000000..7e9600a
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/detail/ModConfig.java
@@ -0,0 +1,35 @@
+/*
+ * @file ModConfig.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Main class for module settings. Handles reading and
+ * saving the config file.
+ */
+package wile.engineersdecor.detail;
+
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraftforge.common.ForgeConfigSpec;
+
+public class ModConfig
+{
+  private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();
+  public static final Miscellaneous MISC = new Miscellaneous(BUILDER);
+  public static final ForgeConfigSpec conf_spec = BUILDER.build();
+
+  public static final class Miscellaneous
+  {
+    public final ForgeConfigSpec.ConfigValue with_experimental;
+
+    public Miscellaneous(ForgeConfigSpec.Builder builder)
+    {
+      builder.push("Miscellaneous");
+      with_experimental = builder
+        .translation(ModEngineersDecor.MODID + ".config.with_experimental")
+        .comment("Enables experimental features. Use at own risk.")
+        .define("with_experimental", false);
+      builder.pop();
+    }
+  }
+}
diff --git a/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java b/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java
new file mode 100644
index 0000000..bc6f7f9
--- /dev/null
+++ b/1.13/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java
@@ -0,0 +1,71 @@
+/*
+ * @file RecipeCondRegistered.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Recipe condition to enable opt'ing out JSON based recipes, referenced
+ * in assets/engineersdecor/recipes/_factories.json with full path (therefore
+ * I had to make a separate file for that instead of a few lines in
+ * ModAuxiliaries).
+ */
+package wile.engineersdecor.detail;
+
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.crafting.IConditionSerializer;
+import net.minecraftforge.registries.IForgeRegistry;
+import net.minecraftforge.registries.ForgeRegistries;
+
+import com.google.gson.*;
+import javax.annotation.Nullable;
+import javax.annotation.Nonnull;
+import java.util.function.BooleanSupplier;
+
+
+public class RecipeCondModSpecific implements IConditionSerializer
+{
+  public static final BooleanSupplier RECIPE_INCLUDE = ()->true;
+  public static final BooleanSupplier RECIPE_EXCLUDE = ()->false;
+
+  @Override
+  public @Nonnull BooleanSupplier parse(@Nullable JsonObject json) {
+    try {
+      if(json==null) return RECIPE_EXCLUDE;
+      final IForgeRegistry block_registry = ForgeRegistries.BLOCKS;
+      final IForgeRegistry item_registry = ForgeRegistries.ITEMS;
+      final JsonArray items = json.getAsJsonArray("required");
+      if(items!=null) {
+        for(JsonElement e: items) {
+          if(!e.isJsonPrimitive()) continue;
+          final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
+          if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required item not registered
+        }
+      }
+      final JsonPrimitive result = json.getAsJsonPrimitive("result");
+      if(result != null) {
+        final ResourceLocation rl = new ResourceLocation(result.getAsString());
+        if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required result not registered
+      }
+      final JsonArray missing = json.getAsJsonArray("missing");
+      if((missing!=null) && (missing.size() > 0)) {
+        for(JsonElement e: missing) {
+          if(!e.isJsonPrimitive()) continue;
+          final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
+          // At least one item missing, enable this recipe as alternative recipe for another one that check the missing item as required item.
+          // --> e.g. if IE not installed there is no slag. One recipe requires slag, and another one (for the same result) is used if there
+          //     is no slag.
+          if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_INCLUDE;
+        }
+        return RECIPE_EXCLUDE; // all required there, but there is no item missing, so another recipe
+      } else {
+        return RECIPE_INCLUDE; // no missing given, means include if result and required are all there.
+      }
+    } catch(Throwable ex) {
+      ModAuxiliaries.logError("rsgauges::ResultRegisteredCondition failed: " + ex.toString());
+    }
+    return RECIPE_EXCLUDE; // skip on exception.
+  }
+}
diff --git a/1.13/src/main/resources/META-INF/mods.toml b/1.13/src/main/resources/META-INF/mods.toml
new file mode 100644
index 0000000..ca3f229
--- /dev/null
+++ b/1.13/src/main/resources/META-INF/mods.toml
@@ -0,0 +1,31 @@
+# @file mods.toml
+# @spec TOML v0.5.0 (https://github.com/toml-lang/toml)
+modLoader="javafml" # forge FML java
+loaderVersion="[25,)"
+issueTrackerURL="https://github.com/stfwi/engineers-decor/issues/"
+
+[[mods]]
+
+modId="engineersdecor"
+version="${file.jarVersion}"
+displayName="Engineer's Decor"
+description="Adds cosmetic blocks for the engineer's workshop, factory and home."
+authors="wilechaote"
+credits="BluSunrize, malte0811, et al., the Forge Smiths, the Modders of the World."
+updateJSONURL="https://raw.githubusercontent.com/stfwi/engineers-decor/develop/meta/update.json"
+displayURL="https://github.com/stfwi/engineers-decor/"
+logoFile="engineersdecor.png"   # Double check: A file name (in the root of the mod JAR) containing a logo for display
+
+[[dependencies.engineersdecor]]
+  modId="forge"
+  mandatory=true
+  versionRange="[25,)" #mandatory
+  ordering="NONE"
+  side="BOTH"
+
+[[dependencies.engineersdecor]]
+  modId="minecraft"
+  mandatory=true
+  versionRange="[1.13.2]"
+  ordering="NONE"
+  side="BOTH"
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json
new file mode 100644
index 0000000..ed80404
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json
@@ -0,0 +1,14 @@
+{
+  "variants": {
+    "": [
+      { "model": "engineersdecor:block/brick/clinker_brick_model0" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model1" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model2" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model3" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model4" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model5" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model6" },
+      { "model": "engineersdecor:block/brick/clinker_brick_model7" }
+    ]
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json
new file mode 100644
index 0000000..2a934f4
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json
@@ -0,0 +1,44 @@
+{
+  "variants": {
+      "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:block/brick/clinker_brick_stairs" },
+      "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer" },
+      "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer" },
+      "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "y": 180, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner" },
+      "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner" },
+      "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "y": 180, "uvlock": true },
+      "facing=east,half=top,shape=straight":  { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=straight":  { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/brick/clinker_brick_stairs", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/clinker_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json
new file mode 100644
index 0000000..c9525c6
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json
@@ -0,0 +1,9 @@
+{
+  "multipart": [
+    { "when": { "up":    "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_post" } },
+    { "when": { "north": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "uvlock": true } },
+    { "when": { "east":  "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 90, "uvlock": true } },
+    { "when": { "south": "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 180, "uvlock": true } },
+    { "when": { "west":  "true" }, "apply": { "model": "engineersdecor:block/concrete/concrete_wall_side", "y": 270, "uvlock": true } }
+  ]
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json
new file mode 100644
index 0000000..1bf9c8e
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json
@@ -0,0 +1,55 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:block/stairs/decor_straight_roof_model",
+    "textures": {
+      "bottom": "engineersdecor:block/iestyle/ironsheet_roof_top",
+      "side": "engineersdecor:block/iestyle/ironsheet_roof",
+      "top": "engineersdecor:block/iestyle/ironsheet_roof_top"
+    }
+  },
+  "variants": {
+    "": [{}],
+    "inventory": [{}],
+    "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:block/stairs/decor_straight_roof_model" },
+    "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model" },
+    "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model" },
+    "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "y": 180, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model" },
+    "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model" },
+    "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "y": 180, "uvlock": true },
+    "facing=east,half=top,shape=straight":  { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=straight":  { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/stairs/decor_straight_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json
new file mode 100644
index 0000000..a7ff079
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json
@@ -0,0 +1,11 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:block/std/decor_full_block_model",
+    "textures": { "all": "engineersdecor:block/iestyle/ironsheet_roof" }
+  },
+  "variants": {
+    "": [{}],
+    "inventory": [{}]
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json
new file mode 100644
index 0000000..07c32af
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json
@@ -0,0 +1,8 @@
+{
+  "variants": {
+    "facing=north": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model"          },
+    "facing=south": { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":180 },
+    "facing=west":  { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":270 },
+    "facing=east":  { "model": "engineersdecor:block/ladder/metal_rung_ladder_model", "y":90  }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json
new file mode 100644
index 0000000..794103c
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json
@@ -0,0 +1,8 @@
+{
+  "variants": {
+    "facing=north": { "model": "engineersdecor:block/ladder/metal_rung_steps_model"          },
+    "facing=south": { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":180 },
+    "facing=west":  { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":270 },
+    "facing=east":  { "model": "engineersdecor:block/ladder/metal_rung_steps_model", "y":90  }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json
new file mode 100644
index 0000000..a4d790a
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json
@@ -0,0 +1,14 @@
+{
+  "variants": {
+    "": [
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model0" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model1" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model2" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model3" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model4" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model5" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model6" },
+      { "model": "engineersdecor:block/concrete/rebar_concrete_model7" }
+    ]
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json
new file mode 100644
index 0000000..a137d62
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json
@@ -0,0 +1,44 @@
+{
+  "variants": {
+      "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs" },
+      "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer" },
+      "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer" },
+      "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "y": 180, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner" },
+      "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner" },
+      "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "y": 180, "uvlock": true },
+      "facing=east,half=top,shape=straight":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=straight":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/concrete/rebar_concrete_stairs_inner", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json
new file mode 100644
index 0000000..dee0d7c
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json
@@ -0,0 +1,9 @@
+{
+  "multipart": [
+    { "when": { "up":    "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_post" } },
+    { "when": { "north": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "uvlock": true } },
+    { "when": { "east":  "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 90, "uvlock": true } },
+    { "when": { "south": "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 180, "uvlock": true } },
+    { "when": { "west":  "true" }, "apply": { "model": "engineersdecor:block/concrete/rebar_concrete_wall_side", "y": 270, "uvlock": true } }
+  ]
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json
new file mode 100644
index 0000000..41db44e
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json
@@ -0,0 +1,14 @@
+{
+  "variants": {
+    "": [
+      { "model": "engineersdecor:block/brick/slag_brick_model0" },
+      { "model": "engineersdecor:block/brick/slag_brick_model1" },
+      { "model": "engineersdecor:block/brick/slag_brick_model2" },
+      { "model": "engineersdecor:block/brick/slag_brick_model3" },
+      { "model": "engineersdecor:block/brick/slag_brick_model4" },
+      { "model": "engineersdecor:block/brick/slag_brick_model5" },
+      { "model": "engineersdecor:block/brick/slag_brick_model6" },
+      { "model": "engineersdecor:block/brick/slag_brick_model7" }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json
new file mode 100644
index 0000000..c89f2a2
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json
@@ -0,0 +1,44 @@
+{
+  "variants": {
+      "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:block/brick/slag_brick_stairs" },
+      "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer" },
+      "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer" },
+      "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "y": 180, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner" },
+      "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 180, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 90, "uvlock": true },
+      "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 270, "uvlock": true },
+      "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 270, "uvlock": true },
+      "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 90, "uvlock": true },
+      "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner" },
+      "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "y": 180, "uvlock": true },
+      "facing=east,half=top,shape=straight":  { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=straight":  { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=straight": { "model": "engineersdecor:block/brick/slag_brick_stairs", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_outer", "x": 180, "y": 270, "uvlock": true },
+      "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true },
+      "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "uvlock": true },
+      "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "uvlock": true },
+      "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 180, "uvlock": true },
+      "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 90, "uvlock": true },
+      "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:block/brick/slag_brick_stairs_inner", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json
new file mode 100644
index 0000000..b17f5a4
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json
@@ -0,0 +1,8 @@
+{
+  "variants": {
+    "facing=north": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model"          },
+    "facing=south": { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":180 },
+    "facing=west":  { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":270 },
+    "facing=east":  { "model": "engineersdecor:block/ladder/treated_wood_ladder_model", "y":90  }
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json
new file mode 100644
index 0000000..eb3a59b
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json
@@ -0,0 +1,14 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:pole/straight_pole_model",
+    "textures": {
+      "particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+      "side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+      "top": "engineersdecor:block/pole/treated_wood_pole_top_texture"
+    }
+  },
+  "variants": {
+    "facing": { "north": {"y":180}, "south": {"y":0}, "west": {"y":90}, "east": {"y":270}, "up": {"x":90}, "down": {"x":270}}
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json
new file mode 100644
index 0000000..80afd09
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json
@@ -0,0 +1,5 @@
+{
+  "forge_marker": 1,
+  "defaults": { "model": "engineersdecor:furniture/treated_wood_table_model" },
+  "variants": { "": [{}] }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json b/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json
new file mode 100644
index 0000000..feee385
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/lang/en_us.json
@@ -0,0 +1,53 @@
+{
+  "language": "English",
+  "language.region": "United States",
+  "language.code": "en_us",
+
+  "itemGroup.tabengineersdecor":"Engineer's Decor",
+
+  "engineersdecor.config.title":"Engineer's Decor config",
+  "engineersdecor.tooltip.hint.extended":"§6[§9SHIFT§r More info§6]§r",
+  "engineersdecor.tooltip.hint.help":"§6[§9CTRL-SHIFT§r Help§6]§r",
+
+  "block.engineersdecor.clinker_brick_block":"Clinker brick",
+  "block.engineersdecor.clinker_brick_block.help":"§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.",
+  "block.engineersdecor.clinker_brick_stairs":"Clinker brick stairs",
+  "block.engineersdecor.clinker_brick_stairs.help":"§6Looks slightly darker and more color intensive than the vanilla brick block.",
+
+  "block.engineersdecor.slag_brick_block":"Slag brick",
+  "block.engineersdecor.slag_brick_block.help":"§6A gray-brown brick block with position dependent texture variations.",
+  "block.engineersdecor.slag_brick_stairs":"Slag brick stairs",
+  "block.engineersdecor.slag_brick_stairs.help":"§6Gray-brown brick stairs.",
+
+  "block.engineersdecor.rebar_concrete":"Rebar concrete",
+  "block.engineersdecor.rebar_concrete.help":"§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian.",
+  "block.engineersdecor.rebar_concrete_stairs":"Rebar concrete stairs",
+  "block.engineersdecor.rebar_concrete_stairs.help":"§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.",
+  "block.engineersdecor.rebar_concrete_wall":"Rebar concrete wall",
+  "block.engineersdecor.rebar_concrete_wall.help":"§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian.",
+
+  "block.engineersdecor.concrete_wall":"Concrete wall",
+  "block.engineersdecor.concrete_wall.help":"§6Wall made of solid concrete.",
+
+  "block.engineersdecor.metal_rung_ladder":"Metal rung ladder",
+  "block.engineersdecor.metal_rung_ladder.help":"§6Typical industrial wall ladder, consisting of horizontal metal rod rungs.",
+
+  "block.engineersdecor.metal_rung_steps":"Staggered metal steps",
+  "block.engineersdecor.metal_rung_steps.help":"§6Staggered rod rungs affixed to a wall, allowing to climb up, fall down, and so on.",
+
+  "block.engineersdecor.treated_wood_ladder":"Treated wood ladder",
+  "block.engineersdecor.treated_wood_ladder.help":"§6Weather-proof wooden ladder.",
+
+
+
+
+  "block.engineersdecor.iron_sheet_roof":"Iron sheet metal roof",
+  "block.engineersdecor.iron_sheet_roof.help":"§6Well, it's a roof.",
+
+  "block.engineersdecor.treated_wood_pole":"Straight treated wood pole",
+  "block.engineersdecor.treated_wood_pole.help":"§6Straight pole fragment with the diameter of a wire relay.§r\nCan be useful as alternative to the wire posts if special special lengths are needed, or as support for structures.",
+
+  "block.engineersdecor.treated_wood_table":"Treated wood table",
+  "block.engineersdecor.treated_wood_table.help":"§6Robust four-legged wood table."
+
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/logo.png b/1.13/src/main/resources/assets/engineersdecor/logo.png
new file mode 100644
index 0000000..793e40f
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/logo.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model0.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model0.json
new file mode 100644
index 0000000..5f7fcf3
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model0.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture0" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model1.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model1.json
new file mode 100644
index 0000000..831dc09
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model1.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture1" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model2.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model2.json
new file mode 100644
index 0000000..3a712ce
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model2.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture2" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model3.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model3.json
new file mode 100644
index 0000000..1abe010
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model3.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture3" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model4.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model4.json
new file mode 100644
index 0000000..3854790
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model4.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture4" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model5.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model5.json
new file mode 100644
index 0000000..3acb321
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model5.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture5" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model6.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model6.json
new file mode 100644
index 0000000..8e9f23f
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model6.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture6" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model7.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model7.json
new file mode 100644
index 0000000..943acaf
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_model7.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture7" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs.json
new file mode 100644
index 0000000..caf694a
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "top": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "side": "engineersdecor:block/clinker_brick/clinker_brick_texture0"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_inner.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_inner.json
new file mode 100644
index 0000000..f0f846f
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_inner.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/inner_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "top": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "side": "engineersdecor:block/clinker_brick/clinker_brick_texture0"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_outer.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_outer.json
new file mode 100644
index 0000000..c231a1b
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/clinker_brick_stairs_outer.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/outer_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "top": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
+    "side": "engineersdecor:block/clinker_brick/clinker_brick_texture0"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model0.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model0.json
new file mode 100644
index 0000000..2980acf
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model0.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture0" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model1.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model1.json
new file mode 100644
index 0000000..4bf5cef
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model1.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture1" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model2.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model2.json
new file mode 100644
index 0000000..c256403
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model2.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture2" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model3.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model3.json
new file mode 100644
index 0000000..f554b58
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model3.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture3" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model4.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model4.json
new file mode 100644
index 0000000..3e33703
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model4.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture4" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model5.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model5.json
new file mode 100644
index 0000000..cc5d796
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model5.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture5" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model6.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model6.json
new file mode 100644
index 0000000..74999bb
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model6.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture6" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model7.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model7.json
new file mode 100644
index 0000000..ade69c1
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_model7.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/slag_brick/slag_brick_texture7" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs.json
new file mode 100644
index 0000000..2be0d00
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/slag_brick/slag_brick_texture0",
+    "top": "engineersdecor:block/slag_brick/slag_brick_texture0",
+    "side": "engineersdecor:block/slag_brick/slag_brick_texture0"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_inner.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_inner.json
new file mode 100644
index 0000000..82576d5
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_inner.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/inner_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/slag_brick/slag_brick_texture0",
+    "top": "engineersdecor:block/slag_brick/slag_brick_texture1",
+    "side": "engineersdecor:block/slag_brick/slag_brick_texture2"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_outer.json b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_outer.json
new file mode 100644
index 0000000..9242715
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/brick/slag_brick_stairs_outer.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/outer_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/slag_brick/slag_brick_texture0",
+    "top": "engineersdecor:block/slag_brick/slag_brick_texture0",
+    "side": "engineersdecor:block/slag_brick/slag_brick_texture0"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_default.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_default.json
new file mode 100644
index 0000000..5d32d22
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_default.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_default",
+	"textures": {
+    "wall": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete",
+    "particle": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_inventory.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_inventory.json
new file mode 100644
index 0000000..7edb877
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_inventory.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_inventory",
+	"textures": {
+    "wall": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete",
+    "particle": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_post.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_post.json
new file mode 100644
index 0000000..77ebaa5
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_post.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_post",
+	"textures": {
+    "wall": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete",
+    "particle": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_side.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_side.json
new file mode 100644
index 0000000..1e1ba7f
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/concrete_wall_side.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_side",
+	"textures": {
+    "wall": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete",
+    "particle": "engineersdecor:block/ieoriginal/ie_stone_decoration_concrete"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model0.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model0.json
new file mode 100644
index 0000000..08e166a
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model0.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture0" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model1.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model1.json
new file mode 100644
index 0000000..275a434
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model1.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture1" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model2.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model2.json
new file mode 100644
index 0000000..c685dcf
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model2.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture2" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model3.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model3.json
new file mode 100644
index 0000000..fac71fb
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model3.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture3" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model4.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model4.json
new file mode 100644
index 0000000..08b007c
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model4.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture4" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model5.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model5.json
new file mode 100644
index 0000000..53c1799
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model5.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture5" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model6.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model6.json
new file mode 100644
index 0000000..c1ee5ce
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model6.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture6" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model7.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model7.json
new file mode 100644
index 0000000..893d1c1
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_model7.json
@@ -0,0 +1 @@
+{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/concrete/rebar_concrete_texture7" } }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs.json
new file mode 100644
index 0000000..b082edd
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "top": "engineersdecor:block/concrete/rebar_concrete_texture1",
+    "side": "engineersdecor:block/concrete/rebar_concrete_texture2"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_inner.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_inner.json
new file mode 100644
index 0000000..96fe26d
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_inner.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/inner_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "top": "engineersdecor:block/concrete/rebar_concrete_texture1",
+    "side": "engineersdecor:block/concrete/rebar_concrete_texture2"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_outer.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_outer.json
new file mode 100644
index 0000000..ff881a2
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_stairs_outer.json
@@ -0,0 +1,8 @@
+{
+  "parent": "minecraft:block/outer_stairs",
+  "textures": {
+    "bottom": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "top": "engineersdecor:block/concrete/rebar_concrete_texture1",
+    "side": "engineersdecor:block/concrete/rebar_concrete_texture2"
+  }
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_default.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_default.json
new file mode 100644
index 0000000..5ac9d0c
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_default.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_default",
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_inventory.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_inventory.json
new file mode 100644
index 0000000..98c15ce
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_inventory.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_inventory",
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_post.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_post.json
new file mode 100644
index 0000000..2dded83
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_post.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_post",
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_side.json b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_side.json
new file mode 100644
index 0000000..0994e40
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/concrete/rebar_concrete_wall_side.json
@@ -0,0 +1,7 @@
+{
+  "parent":"engineersdecor:block/wall/concrete_wall_side",
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	}
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json
new file mode 100644
index 0000000..a6db2bc
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json
@@ -0,0 +1,190 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/cube",
+	"textures": {
+		"o": "engineersdecor:block/iestyle/treated_wood_framed_texture",
+		"particle": "engineersdecor:block/iestyle/treated_wood_framed_texture"
+	},
+	"elements": [
+		{
+			"from": [1, 0, 1],
+			"to": [3, 14, 3],
+			"faces": {
+				"north": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"east": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"south": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"west": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"up": {"uv": [1, 1, 3, 3], "texture": "#o"},
+				"down": {"uv": [1, 13, 3, 15], "texture": "#o", "cullface": "down"}
+			}
+		},
+		{
+			"from": [13, 0, 1],
+			"to": [15, 14, 3],
+			"faces": {
+				"north": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"east": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"south": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"west": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"up": {"uv": [13, 1, 15, 3], "texture": "#o"},
+				"down": {"uv": [13, 13, 15, 15], "texture": "#o", "cullface": "down"}
+			}
+		},
+		{
+			"from": [13, 0, 13],
+			"to": [15, 14, 15],
+			"faces": {
+				"north": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"east": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"south": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"west": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"up": {"uv": [13, 13, 15, 15], "texture": "#o"},
+				"down": {"uv": [13, 1, 15, 3], "texture": "#o", "cullface": "down"}
+			}
+		},
+		{
+			"from": [1, 0, 13],
+			"to": [3, 14, 15],
+			"faces": {
+				"north": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"east": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"south": {"uv": [1, 2, 3, 16], "texture": "#o"},
+				"west": {"uv": [13, 2, 15, 16], "texture": "#o"},
+				"up": {"uv": [1, 13, 3, 15], "texture": "#o"},
+				"down": {"uv": [1, 1, 3, 3], "texture": "#o", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 14, 0],
+			"to": [16, 15.875, 16],
+			"faces": {
+				"north": {"uv": [0, 0.125, 16, 2], "texture": "#o"},
+				"east": {"uv": [0, 0.125, 16, 2], "texture": "#o"},
+				"south": {"uv": [0, 0.125, 16, 2], "texture": "#o"},
+				"west": {"uv": [0, 0.125, 16, 2], "texture": "#o"},
+				"up": {"uv": [0, 0, 16, 16], "texture": "#o"},
+				"down": {"uv": [0, 0, 16, 16], "texture": "#o"}
+			}
+		},
+		{
+			"from": [0.125, 15.875, 0.125],
+			"to": [15.875, 16, 15.875],
+			"faces": {
+				"north": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"},
+				"east": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"},
+				"south": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"},
+				"west": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"},
+				"up": {"uv": [0.25, 0.25, 15.75, 15.75], "texture": "#o"},
+				"down": {"uv": [0.25, 0.25, 15.75, 15.75], "texture": "#o"}
+			}
+		},
+		{
+			"from": [13, 13.5, 3],
+			"to": [15, 14, 5],
+			"faces": {
+				"north": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"east": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"south": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"west": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"up": {"uv": [13, 3, 15, 5], "texture": "#o"},
+				"down": {"uv": [13, 11, 15, 13], "texture": "#o"}
+			}
+		},
+		{
+			"from": [13, 13.5, 11],
+			"to": [15, 14, 13],
+			"faces": {
+				"north": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"east": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"south": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"west": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"up": {"uv": [13, 11, 15, 13], "texture": "#o"},
+				"down": {"uv": [13, 3, 15, 5], "texture": "#o"}
+			}
+		},
+		{
+			"from": [1, 13.5, 11],
+			"to": [3, 14, 13],
+			"faces": {
+				"north": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"east": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"south": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"west": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"up": {"uv": [1, 11, 3, 13], "texture": "#o"},
+				"down": {"uv": [1, 3, 3, 5], "texture": "#o"}
+			}
+		},
+		{
+			"from": [1, 13.5, 3],
+			"to": [3, 14, 5],
+			"faces": {
+				"north": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"east": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"south": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"west": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"up": {"uv": [1, 3, 3, 5], "texture": "#o"},
+				"down": {"uv": [1, 11, 3, 13], "texture": "#o"}
+			}
+		},
+		{
+			"from": [11, 13.5, 1],
+			"to": [13, 14, 3],
+			"faces": {
+				"north": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"east": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"south": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"west": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"up": {"uv": [11, 1, 13, 3], "texture": "#o"},
+				"down": {"uv": [11, 13, 13, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 13.5, 1],
+			"to": [5, 14, 3],
+			"faces": {
+				"north": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"east": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"south": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"west": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"up": {"uv": [3, 1, 5, 3], "texture": "#o"},
+				"down": {"uv": [3, 13, 5, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [11, 13.5, 13],
+			"to": [13, 14, 15],
+			"faces": {
+				"north": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"east": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"south": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"west": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"up": {"uv": [11, 13, 13, 15], "texture": "#o"},
+				"down": {"uv": [11, 1, 13, 3], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 13.5, 13],
+			"to": [5, 14, 15],
+			"faces": {
+				"north": {"uv": [11, 2, 13, 2.5], "texture": "#o"},
+				"east": {"uv": [1, 2, 3, 2.5], "texture": "#o"},
+				"south": {"uv": [3, 2, 5, 2.5], "texture": "#o"},
+				"west": {"uv": [13, 2, 15, 2.5], "texture": "#o"},
+				"up": {"uv": [3, 13, 5, 15], "texture": "#o"},
+				"down": {"uv": [3, 1, 5, 3], "texture": "#o"}
+			}
+		}
+	],
+	"display": {
+		"ground": {
+			"scale": [0.2, 0.2, 0.2]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json
new file mode 100644
index 0000000..f09e516
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json
@@ -0,0 +1,159 @@
+{
+  "credit": "I made this with the Blockbench",
+  "parent": "block/cube",
+	"textures": {
+    "particle": "engineersdecor:block/iestyle/steel_texture",
+		"o": "engineersdecor:block/iestyle/steel_texture"
+  },
+  "display": {
+		"gui":    { "rotation": [ 30, 225, 0 ], "scale": [0.625, 0.625, 0.625] },
+		"fixed":  { "scale": [0.5, 0.5, 0.5] },
+		"ground": {	"scale": [0.2, 0.2, 0.2] }
+	},
+	"elements": [
+		{
+			"from": [3, 2, 14],
+			"to": [13, 3, 15],
+			"faces": {
+				"north": {"uv": [1, 13, 16, 15], "texture": "#o"},
+				"east": {"uv": [12, 13, 14, 15], "texture": "#o"},
+				"south": {"uv": [1, 13, 16, 15], "texture": "#o"},
+				"west": {"uv": [13, 11, 15, 13], "texture": "#o"},
+				"up": {"uv": [1, 11, 16, 13], "texture": "#o"},
+				"down": {"uv": [1, 13, 16, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 6, 14],
+			"to": [13, 7, 15],
+			"faces": {
+				"north": {"uv": [3, 13, 16, 15], "texture": "#o"},
+				"east": {"uv": [6, 14, 8, 16], "texture": "#o"},
+				"south": {"uv": [3, 13, 16, 15], "texture": "#o"},
+				"west": {"uv": [7, 9, 9, 11], "texture": "#o"},
+				"up": {"uv": [0, 13, 13, 15], "texture": "#o"},
+				"down": {"uv": [3, 13, 16, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 14, 14],
+			"to": [13, 15, 15],
+			"faces": {
+				"north": {"uv": [2, 6, 16, 8], "texture": "#o"},
+				"east": {"uv": [7, 3, 9, 5], "texture": "#o"},
+				"south": {"uv": [2, 6, 16, 8], "texture": "#o"},
+				"west": {"uv": [2, 6, 4, 8], "texture": "#o"},
+				"up": {"uv": [0, 4, 14, 6], "texture": "#o"},
+				"down": {"uv": [2, 6, 16, 8], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 10, 14],
+			"to": [13, 11, 15],
+			"faces": {
+				"north": {"uv": [0, 11, 13, 13], "texture": "#o"},
+				"east": {"uv": [1, 13, 3, 15], "texture": "#o"},
+				"south": {"uv": [0, 11, 13, 13], "texture": "#o"},
+				"west": {"uv": [0, 11, 2, 13], "texture": "#o"},
+				"up": {"uv": [0, 9, 13, 11], "texture": "#o"},
+				"down": {"uv": [0, 11, 13, 13], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 2, 15],
+			"to": [13.25, 3, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [7, 9, 9, 11], "texture": "#o"},
+				"south": {"uv": [1, 12, 4.25, 14], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"up": {"uv": [13, 4, 16, 6], "texture": "#o"},
+				"down": {"uv": [1, 12, 4, 14], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 2, 15],
+			"to": [4, 3, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [11, 1, 14.25, 3], "texture": "#o"},
+				"west": {"uv": [11, 9, 13, 11], "texture": "#o"},
+				"up": {"uv": [12, 11, 15, 13], "texture": "#o"},
+				"down": {"uv": [7, 3, 10, 5], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 10, 15],
+			"to": [4, 11, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [12, 14, 15.25, 16], "texture": "#o"},
+				"west": {"uv": [7, 10, 9, 12], "texture": "#o"},
+				"up": {"uv": [5, 12, 8, 14], "texture": "#o"},
+				"down": {"uv": [4, 14, 7, 16], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 10, 15],
+			"to": [13.25, 11, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1.25], "texture": "#o"},
+				"east": {"uv": [2, 4, 5, 6.25], "texture": "#o"},
+				"south": {"uv": [10, 10, 13, 12], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1.25], "texture": "#o"},
+				"up": {"uv": [7, 11, 9, 13], "texture": "#o"},
+				"down": {"uv": [8, 0, 11, 2], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 6, 15],
+			"to": [4, 7, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [4, 7, 7.25, 9], "texture": "#o"},
+				"west": {"uv": [11, 9, 13, 11], "texture": "#o"},
+				"up": {"uv": [0, 13, 3, 15], "texture": "#o"},
+				"down": {"uv": [4, 7, 7, 9], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 6, 15],
+			"to": [13.25, 7, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [8, 9, 10, 11], "texture": "#o"},
+				"south": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"up": {"uv": [5, 13, 8, 15], "texture": "#o"},
+				"down": {"uv": [8, 14, 11, 16], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 14, 15],
+			"to": [4, 15, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [3, 11, 6, 13], "texture": "#o"},
+				"west": {"uv": [14, 7, 16, 9], "texture": "#o"},
+				"up": {"uv": [7, 12, 10, 14], "texture": "#o"},
+				"down": {"uv": [12, 7, 15, 9], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 14, 15],
+			"to": [13.25, 15, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1.25], "texture": "#o"},
+				"east": {"uv": [0, 0, 3, 2.25], "texture": "#o"},
+				"south": {"uv": [0, 13, 3, 15], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1.25], "texture": "#o"},
+				"up": {"uv": [3, 7, 5.25, 9], "texture": "#o"},
+				"down": {"uv": [0, 0, 1.25, 1], "texture": "#o"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json
new file mode 100644
index 0000000..efa86fa
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json
@@ -0,0 +1,166 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/cube",
+	"textures": {
+		"o": "engineersdecor:block/iestyle/steel_texture",
+		"particle": "engineersdecor:block/iestyle/steel_texture"
+	},
+	"elements": [
+		{
+			"from": [3, 2, 14],
+			"to": [7, 3, 15],
+			"faces": {
+				"north": {"uv": [1, 13, 9, 15], "texture": "#o"},
+				"east": {"uv": [12, 13, 14, 15], "texture": "#o"},
+				"south": {"uv": [4, 10, 11, 12], "texture": "#o"},
+				"west": {"uv": [13, 11, 15, 13], "texture": "#o"},
+				"up": {"uv": [1, 11, 9, 13], "texture": "#o"},
+				"down": {"uv": [7, 2, 14, 4], "texture": "#o"}
+			}
+		},
+		{
+			"from": [9, 6, 14],
+			"to": [13, 7, 15],
+			"faces": {
+				"north": {"uv": [3, 13, 9, 15], "texture": "#o"},
+				"east": {"uv": [6, 14, 8, 16], "texture": "#o"},
+				"south": {"uv": [4, 10, 11, 12], "texture": "#o"},
+				"west": {"uv": [7, 9, 9, 11], "texture": "#o"},
+				"up": {"uv": [6, 11, 13, 13], "texture": "#o"},
+				"down": {"uv": [9, 12, 16, 14], "texture": "#o"}
+			}
+		},
+		{
+			"from": [9, 14, 14],
+			"to": [13, 15, 15],
+			"faces": {
+				"north": {"uv": [2, 6, 9, 8], "texture": "#o"},
+				"east": {"uv": [7, 3, 9, 5], "texture": "#o"},
+				"south": {"uv": [5, 13, 13, 15], "texture": "#o"},
+				"west": {"uv": [2, 6, 4, 8], "texture": "#o"},
+				"up": {"uv": [6, 9, 13, 11], "texture": "#o"},
+				"down": {"uv": [4, 10, 11, 12], "texture": "#o"}
+			}
+		},
+		{
+			"from": [3, 10, 14],
+			"to": [7, 11, 15],
+			"faces": {
+				"north": {"uv": [0, 11, 6, 13], "texture": "#o"},
+				"east": {"uv": [1, 13, 3, 15], "texture": "#o"},
+				"south": {"uv": [4, 6, 12, 8], "texture": "#o"},
+				"west": {"uv": [0, 11, 2, 13], "texture": "#o"},
+				"up": {"uv": [3, 5, 11, 7], "texture": "#o"},
+				"down": {"uv": [5, 7, 12, 9], "texture": "#o"}
+			}
+		},
+		{
+			"from": [6, 2, 15],
+			"to": [7.25, 3, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [7, 9, 9, 11], "texture": "#o"},
+				"south": {"uv": [1, 12, 4.25, 14], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"up": {"uv": [13, 4, 16, 6], "texture": "#o"},
+				"down": {"uv": [1, 12, 4, 14], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 2, 15],
+			"to": [4, 3, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [11, 1, 14.25, 3], "texture": "#o"},
+				"west": {"uv": [11, 9, 13, 11], "texture": "#o"},
+				"up": {"uv": [12, 11, 15, 13], "texture": "#o"},
+				"down": {"uv": [7, 3, 10, 5], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 10, 15],
+			"to": [4, 11, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [12, 14, 15.25, 16], "texture": "#o"},
+				"west": {"uv": [7, 10, 9, 12], "texture": "#o"},
+				"up": {"uv": [5, 12, 8, 14], "texture": "#o"},
+				"down": {"uv": [4, 14, 7, 16], "texture": "#o"}
+			}
+		},
+		{
+			"from": [6, 10, 15],
+			"to": [7.25, 11, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1.25], "texture": "#o"},
+				"east": {"uv": [2, 4, 5, 6.25], "texture": "#o"},
+				"south": {"uv": [10, 10, 13, 12], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1.25], "texture": "#o"},
+				"up": {"uv": [7, 11, 9, 13], "texture": "#o"},
+				"down": {"uv": [8, 0, 11, 2], "texture": "#o"}
+			}
+		},
+		{
+			"from": [8.75, 6, 15],
+			"to": [10, 7, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [4, 7, 7.25, 9], "texture": "#o"},
+				"west": {"uv": [11, 9, 13, 11], "texture": "#o"},
+				"up": {"uv": [0, 13, 3, 15], "texture": "#o"},
+				"down": {"uv": [4, 7, 7, 9], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 6, 15],
+			"to": [13.25, 7, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [8, 9, 10, 11], "texture": "#o"},
+				"south": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"up": {"uv": [5, 13, 8, 15], "texture": "#o"},
+				"down": {"uv": [8, 14, 11, 16], "texture": "#o"}
+			}
+		},
+		{
+			"from": [8.75, 14, 15],
+			"to": [10, 15, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1], "texture": "#o"},
+				"east": {"uv": [0, 0, 1, 1], "texture": "#o"},
+				"south": {"uv": [3, 11, 6, 13], "texture": "#o"},
+				"west": {"uv": [14, 7, 16, 9], "texture": "#o"},
+				"up": {"uv": [7, 12, 10, 14], "texture": "#o"},
+				"down": {"uv": [12, 7, 15, 9], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 14, 15],
+			"to": [13.25, 15, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1.25, 1.25], "texture": "#o"},
+				"east": {"uv": [0, 0, 3, 2.25], "texture": "#o"},
+				"south": {"uv": [0, 13, 3, 15], "texture": "#o"},
+				"west": {"uv": [0, 0, 1, 1.25], "texture": "#o"},
+				"up": {"uv": [3, 7, 5.25, 9], "texture": "#o"},
+				"down": {"uv": [0, 0, 1.25, 1], "texture": "#o"}
+			}
+		}
+	],
+	"display": {
+		"ground": {
+			"scale": [0.2, 0.2, 0.2]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json
new file mode 100644
index 0000000..dbf9523
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json
@@ -0,0 +1,94 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/cube",
+	"textures": {
+		"o": "engineersdecor:block/iestyle/treated_wood_rough_texture",
+		"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture"
+	},
+	"elements": [
+		{
+			"from": [4, 2, 14.625],
+			"to": [12, 3, 15.625],
+			"faces": {
+				"north": {"uv": [0, 11, 15, 13], "texture": "#o"},
+				"east": {"uv": [12, 13, 14, 15], "texture": "#o"},
+				"south": {"uv": [1, 13, 16, 15], "texture": "#o"},
+				"west": {"uv": [13, 11, 15, 13], "texture": "#o"},
+				"up": {"uv": [1, 11, 16, 13], "texture": "#o"},
+				"down": {"uv": [1, 13, 16, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [4, 6, 14.625],
+			"to": [12, 7, 15.625],
+			"faces": {
+				"north": {"uv": [1, 6, 14, 8], "texture": "#o"},
+				"east": {"uv": [6, 14, 8, 16], "texture": "#o"},
+				"south": {"uv": [3, 13, 16, 15], "texture": "#o"},
+				"west": {"uv": [7, 9, 9, 11], "texture": "#o"},
+				"up": {"uv": [0, 13, 13, 15], "texture": "#o"},
+				"down": {"uv": [3, 13, 16, 15], "texture": "#o"}
+			}
+		},
+		{
+			"from": [4, 14, 14.625],
+			"to": [12, 15, 15.625],
+			"faces": {
+				"north": {"uv": [0, 4, 14, 6], "texture": "#o"},
+				"east": {"uv": [7, 3, 9, 5], "texture": "#o"},
+				"south": {"uv": [2, 6, 16, 8], "texture": "#o"},
+				"west": {"uv": [2, 6, 4, 8], "texture": "#o"},
+				"up": {"uv": [0, 4, 14, 6], "texture": "#o"},
+				"down": {"uv": [2, 6, 16, 8], "texture": "#o"}
+			}
+		},
+		{
+			"from": [4, 10, 14.625],
+			"to": [12, 11, 15.625],
+			"faces": {
+				"north": {"uv": [3, 5, 16, 7], "texture": "#o"},
+				"east": {"uv": [1, 13, 3, 15], "texture": "#o"},
+				"south": {"uv": [0, 11, 13, 13], "texture": "#o"},
+				"west": {"uv": [0, 11, 2, 13], "texture": "#o"},
+				"up": {"uv": [0, 9, 13, 11], "texture": "#o"},
+				"down": {"uv": [0, 11, 13, 13], "texture": "#o"}
+			}
+		},
+		{
+			"from": [2.75, 0, 14.5],
+			"to": [4, 16, 16],
+			"faces": {
+				"north": {"uv": [2, 0, 4, 16], "texture": "#o"},
+				"east": {"uv": [2, 0, 4, 16], "texture": "#o"},
+				"south": {"uv": [5, 0, 7, 16], "texture": "#o"},
+				"west": {"uv": [8, 0, 11, 16], "texture": "#o"},
+				"up": {"uv": [11, 9, 13, 12], "texture": "#o"},
+				"down": {"uv": [13, 9, 15, 12], "texture": "#o"}
+			}
+		},
+		{
+			"from": [12, 0, 14.5],
+			"to": [13.25, 16, 16],
+			"faces": {
+				"north": {"uv": [1, 0, 3, 16], "texture": "#o"},
+				"east": {"uv": [5, 0, 7, 16], "texture": "#o"},
+				"south": {"uv": [13, 0, 15, 16], "texture": "#o"},
+				"west": {"uv": [1, 0, 3, 16], "texture": "#o"},
+				"up": {"uv": [6, 6, 8, 9], "texture": "#o"},
+				"down": {"uv": [8, 5, 10, 8], "texture": "#o"}
+			}
+		}
+	],
+	"display": {
+		"ground": {
+			"scale": [0.2, 0.2, 0.2]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json
new file mode 100644
index 0000000..064dcc4
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json
@@ -0,0 +1,75 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/cube",
+	"textures": {
+		"side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+		"particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+		"top": "engineersdecor:block/pole/treated_wood_pole_top_texture"
+	},
+	"elements": [
+		{
+			"from": [5.75, 5.75, 0],
+			"to": [10.25, 10.25, 16],
+			"faces": {
+				"north": {"uv": [5.25, 5.25, 10.75, 10.75], "texture": "#top", "cullface": "north"},
+				"south": {"uv": [5.25, 5.25, 10.75, 10.75], "texture": "#top", "cullface": "south"}
+			}
+		},
+		{
+			"from": [5.75, 10.25, 0],
+			"to": [10.25, 10.5, 16],
+			"faces": {
+				"north": {"uv": [5.25, 10.75, 10.75, 11], "texture": "#top", "cullface": "north"},
+				"east": {"uv": [10.75, 0, 11, 16], "rotation": 90, "texture": "#side"},
+				"south": {"uv": [5.25, 5, 10.75, 5.25], "texture": "#top", "cullface": "south"},
+				"west": {"uv": [5, 0, 5.25, 16], "rotation": 90, "texture": "#side"},
+				"up": {"uv": [5.25, 0, 10.75, 16], "texture": "#side"}
+			}
+		},
+		{
+			"from": [5.75, 5.5, 0],
+			"to": [10.25, 5.75, 16],
+			"faces": {
+				"north": {"uv": [5.25, 5, 10.75, 5.25], "texture": "#top", "cullface": "north"},
+				"east": {"uv": [5, 0, 5.25, 16], "rotation": 90, "texture": "#side"},
+				"south": {"uv": [5.25, 10.75, 10.75, 11], "texture": "#top", "cullface": "south"},
+				"west": {"uv": [10.75, 0, 11, 16], "rotation": 90, "texture": "#side"},
+				"down": {"uv": [5.25, 0, 10.75, 16], "rotation": 180, "texture": "#side"}
+			}
+		},
+		{
+			"from": [10.25, 5.75, 0],
+			"to": [10.5, 10.25, 16],
+			"faces": {
+				"north": {"uv": [10.75, 5.25, 11, 10.75], "texture": "#top", "cullface": "north"},
+				"east": {"uv": [5.25, 0, 10.75, 16], "rotation": 90, "texture": "#side"},
+				"south": {"uv": [10.75, 5.25, 11, 10.75], "texture": "#top", "cullface": "south"},
+				"up": {"uv": [5, 0, 5.25, 16], "texture": "#side"},
+				"down": {"uv": [10.75, 0, 11, 16], "rotation": 180, "texture": "#side"}
+			}
+		},
+		{
+			"from": [5.5, 5.75, 0],
+			"to": [5.75, 10.25, 16],
+			"faces": {
+				"north": {"uv": [5, 5.25, 5.25, 10.75], "texture": "#top", "cullface": "north"},
+				"south": {"uv": [5, 5.25, 5.25, 10.75], "texture": "#top", "cullface": "south"},
+				"west": {"uv": [5.25, 0, 10.75, 16], "rotation": 90, "texture": "#side"},
+				"up": {"uv": [10.75, 0, 11, 16], "texture": "#side"},
+				"down": {"uv": [5, 0, 5.25, 16], "rotation": 180, "texture": "#side"}
+			}
+		}
+	],
+	"display": {
+		"ground": {
+			"scale": [0.2, 0.2, 0.2]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_up_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_up_model.json
new file mode 100644
index 0000000..9b919eb
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_up_model.json
@@ -0,0 +1,75 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/cube",
+	"textures": {
+		"side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+		"particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
+		"top": "engineersdecor:block/pole/treated_wood_pole_top_texture"
+	},
+	"elements": [
+		{
+			"from": [5.75, 0, 5.75],
+			"to": [10.25, 16, 10.25],
+			"faces": {
+				"up": {"uv": [5.25, 5.25, 10.75, 10.75], "rotation": 180, "texture": "#top", "cullface": "north"},
+				"down": {"uv": [5.25, 5.25, 10.75, 10.75], "texture": "#top", "cullface": "south"}
+			}
+		},
+		{
+			"from": [5.75, 0, 10.25],
+			"to": [10.25, 16, 10.5],
+			"faces": {
+				"east": {"uv": [10.75, 0, 11, 16], "texture": "#side"},
+				"south": {"uv": [5.25, 0, 10.75, 16], "texture": "#side"},
+				"west": {"uv": [5, 0, 5.25, 16], "rotation": 180, "texture": "#side"},
+				"up": {"uv": [5.25, 10.75, 10.75, 11], "rotation": 180, "texture": "#top", "cullface": "north"},
+				"down": {"uv": [5.25, 5, 10.75, 5.25], "texture": "#top", "cullface": "south"}
+			}
+		},
+		{
+			"from": [5.75, 0, 5.5],
+			"to": [10.25, 16, 5.75],
+			"faces": {
+				"north": {"uv": [5.25, 0, 10.75, 16], "texture": "#side"},
+				"east": {"uv": [5, 0, 5.25, 16], "texture": "#side"},
+				"west": {"uv": [10.75, 0, 11, 16], "rotation": 180, "texture": "#side"},
+				"up": {"uv": [5.25, 5, 10.75, 5.25], "rotation": 180, "texture": "#top", "cullface": "north"},
+				"down": {"uv": [5.25, 10.75, 10.75, 11], "texture": "#top", "cullface": "south"}
+			}
+		},
+		{
+			"from": [10.25, 0, 5.75],
+			"to": [10.5, 16, 10.25],
+			"faces": {
+				"north": {"uv": [10.75, 0, 11, 16], "texture": "#side"},
+				"east": {"uv": [5.25, 0, 10.75, 16], "texture": "#side"},
+				"south": {"uv": [5, 0, 5.25, 16], "texture": "#side"},
+				"up": {"uv": [10.75, 5.25, 11, 10.75], "rotation": 180, "texture": "#top", "cullface": "north"},
+				"down": {"uv": [10.75, 5.25, 11, 10.75], "texture": "#top", "cullface": "south"}
+			}
+		},
+		{
+			"from": [5.5, 0, 5.75],
+			"to": [5.75, 16, 10.25],
+			"faces": {
+				"north": {"uv": [5, 0, 5.25, 16], "texture": "#side"},
+				"south": {"uv": [10.75, 0, 11, 16], "texture": "#side"},
+				"west": {"uv": [5.25, 0, 10.75, 16], "rotation": 180, "texture": "#side"},
+				"up": {"uv": [5, 5.25, 5.25, 10.75], "rotation": 180, "texture": "#top", "cullface": "north"},
+				"down": {"uv": [5, 5.25, 5.25, 10.75], "texture": "#top", "cullface": "south"}
+			}
+		}
+	],
+	"display": {
+		"ground": {
+			"scale": [0.2, 0.2, 0.2]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_full_block_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_full_block_model.json
new file mode 100644
index 0000000..7fa7672
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_full_block_model.json
@@ -0,0 +1,4 @@
+{
+  "parent": "block/cube_all",
+  "textures": { "all": "engineersdecor:block/clinker_brick/clinker_brick_texture0" }
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_inner_roof_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_inner_roof_model.json
new file mode 100644
index 0000000..9e964fd
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_inner_roof_model.json
@@ -0,0 +1,163 @@
+{
+	"credit": "I made this with the Blockbench",
+	"textures": {
+		"side": "engineersdecor:block/iestyle/ironsheet_roof",
+		"particle": "engineersdecor:block/iestyle/ironsheet_roof",
+		"top": "engineersdecor:block/iestyle/ironsheet_roof_top"
+	},
+	"elements": [
+		{
+			"from": [6, 0, 0],
+			"to": [8, 8, 8],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [14, 0, 0],
+			"to": [16, 16, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top", "cullface": "up"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 14],
+			"to": [14, 16, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"rotation": 270, "texture": "#top", "cullface": "up"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [10, 0, 0],
+			"to": [12, 12, 12],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 10],
+			"to": [10, 12, 12],
+			"faces": {
+				"north": {"texture": "#top"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"rotation": 90, "texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 6],
+			"to": [6, 8, 8],
+			"faces": {
+				"north": {"texture": "#top"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 0],
+			"to": [2, 2, 2],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [12, 0, 0],
+			"to": [14, 14, 14],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 12],
+			"to": [12, 14, 14],
+			"faces": {
+				"north": {"texture": "#top"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"rotation": 270, "texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [8, 0, 0],
+			"to": [10, 10, 10],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 8],
+			"to": [8, 10, 10],
+			"faces": {
+				"north": {"texture": "#top"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"rotation": 90, "texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [4, 0, 0],
+			"to": [6, 6, 4],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 4],
+			"to": [6, 6, 6],
+			"faces": {
+				"north": {"texture": "#side"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [0, 0, 2],
+			"to": [4, 4, 4],
+			"faces": {
+				"north": {"texture": "#top"},
+				"west": {"texture": "#side", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [2, 0, 0],
+			"to": [4, 4, 2],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_outer_roof_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_outer_roof_model.json
new file mode 100644
index 0000000..492bb6f
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_outer_roof_model.json
@@ -0,0 +1,99 @@
+{
+	"credit": "I made this with the Blockbench",
+	"textures": {
+		"particle": "engineersdecor:block/iestyle/ironsheet_roof",
+		"side": "engineersdecor:block/iestyle/ironsheet_roof",
+		"top": "engineersdecor:block/iestyle/ironsheet_roof_top"
+	},
+	"elements": [
+		{
+			"from": [0, 0, 0],
+			"to": [16, 2, 16],
+			"faces": {
+				"north": {"texture": "#top", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [2, 2, 2],
+			"to": [16, 4, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [4, 4, 4],
+			"to": [16, 6, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [6, 6, 6],
+			"to": [16, 8, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [8, 8, 8],
+			"to": [16, 10, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [10, 10, 10],
+			"to": [16, 12, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [12, 12, 12],
+			"to": [16, 14, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [14, 14, 14],
+			"to": [16, 16, 16],
+			"faces": {
+				"north": {"texture": "#top"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_straight_roof_model.json b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_straight_roof_model.json
new file mode 100644
index 0000000..5013b30
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/roof/decor_straight_roof_model.json
@@ -0,0 +1,114 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/block",
+	"textures": {
+		"side": "engineersdecor:block/iestyle/ironsheet_roof",
+		"particle": "engineersdecor:block/iestyle/ironsheet_roof",
+		"top": "engineersdecor:block/iestyle/ironsheet_roof_top"
+	},
+	"elements": [
+		{
+			"from": [2, 2, 0],
+			"to": [16, 4, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [14, 14, 0],
+			"to": [16, 16, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top", "cullface": "up"}
+			}
+		},
+		{
+			"from": [0, 0, 0],
+			"to": [16, 2, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top", "cullface": "west"},
+				"up": {"texture": "#top"},
+				"down": {"texture": "#side", "cullface": "down"}
+			}
+		},
+		{
+			"from": [4, 4, 0],
+			"to": [16, 6, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [6, 6, 0],
+			"to": [16, 8, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [12, 12, 0],
+			"to": [16, 14, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [10, 10, 0],
+			"to": [16, 12, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		},
+		{
+			"from": [8, 8, 0],
+			"to": [16, 10, 16],
+			"faces": {
+				"north": {"texture": "#side", "cullface": "north"},
+				"east": {"texture": "#side", "cullface": "east"},
+				"south": {"texture": "#side", "cullface": "south"},
+				"west": {"texture": "#top"},
+				"up": {"texture": "#top"}
+			}
+		}
+	],
+	"display": {
+		"thirdperson_lefthand": {
+			"rotation": [75, -135, 0],
+			"translation": [0, 2.5, 0],
+			"scale": [0.375, 0.375, 0.375]
+		},
+		"gui": {
+			"rotation": [30, 135, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"head": {
+			"rotation": [0, -90, 0]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json
new file mode 100644
index 0000000..32b23df
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json
@@ -0,0 +1,9 @@
+{
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	},
+	"elements": [{
+    "from": [7.9, 7.9, 7.9], "to": [8, 8, 8], "faces": { "down": {"texture": "#wall"} }
+  }]
+}
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json
new file mode 100644
index 0000000..25b37f6
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json
@@ -0,0 +1,164 @@
+{
+	"credit": "I made this with the Blockbench",
+	"parent": "block/block",
+	"ambientocclusion": false,
+	"textures": {
+		"wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+		"particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	},
+	"elements": [
+		{
+			"name": "Center post",
+			"from": [4, 0, 4],
+			"to": [12, 16, 12],
+			"faces": {
+				"north": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"east": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"south": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"west": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"up": {"uv": [4, 4, 12, 12], "texture": "#wall"},
+				"down": {"uv": [4, 4, 12, 12], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [5, 0, 12],
+			"to": [11, 16, 16],
+			"faces": {
+				"north": {"uv": [5, 1, 11, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [0, 1, 4, 16], "texture": "#wall"},
+				"south": {"uv": [5, 1, 11, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [12, 1, 16, 16], "texture": "#wall"},
+				"up": {"uv": [5, 12, 11, 16], "texture": "#wall"},
+				"down": {"uv": [5, 0, 11, 4], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [11, 0, 12],
+			"to": [12, 1, 16],
+			"faces": {
+				"north": {"uv": [4, 15, 5, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [0, 15, 4, 16], "texture": "#wall"},
+				"south": {"uv": [11, 15, 12, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [12, 15, 16, 16], "texture": "#wall"},
+				"up": {"uv": [11, 12, 12, 16], "texture": "#wall"},
+				"down": {"uv": [11, 0, 12, 4], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [5, 0, 0],
+			"to": [11, 16, 4],
+			"faces": {
+				"north": {"uv": [5, 1, 11, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [12, 1, 16, 16], "texture": "#wall"},
+				"south": {"uv": [5, 1, 11, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [0, 1, 4, 16], "texture": "#wall"},
+				"up": {"uv": [5, 0, 11, 4], "texture": "#wall"},
+				"down": {"uv": [5, 12, 11, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [11, 0, 0],
+			"to": [12, 1, 4],
+			"faces": {
+				"north": {"uv": [4, 15, 5, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [12, 15, 16, 16], "texture": "#wall"},
+				"south": {"uv": [11, 15, 12, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [0, 15, 4, 16], "texture": "#wall"},
+				"up": {"uv": [11, 0, 12, 4], "texture": "#wall"},
+				"down": {"uv": [11, 12, 12, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [11, 14, 12],
+			"to": [12, 16, 16],
+			"faces": {
+				"north": {"uv": [4, 0, 5, 2], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [0, 0, 4, 2], "texture": "#wall"},
+				"south": {"uv": [11, 0, 12, 2], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [12, 0, 16, 2], "texture": "#wall"},
+				"up": {"uv": [11, 12, 12, 16], "texture": "#wall"},
+				"down": {"uv": [11, 0, 12, 4], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [11, 14, 0],
+			"to": [12, 16, 4],
+			"faces": {
+				"north": {"uv": [4, 0, 5, 2], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [12, 0, 16, 2], "texture": "#wall"},
+				"south": {"uv": [11, 0, 12, 2], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [0, 0, 4, 2], "texture": "#wall"},
+				"up": {"uv": [11, 0, 12, 4], "texture": "#wall"},
+				"down": {"uv": [11, 12, 12, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [4, 0, 12],
+			"to": [5, 1, 16],
+			"faces": {
+				"north": {"uv": [11, 15, 12, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [0, 15, 4, 16], "texture": "#wall"},
+				"south": {"uv": [4, 15, 5, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [12, 15, 16, 16], "texture": "#wall"},
+				"up": {"uv": [4, 12, 5, 16], "texture": "#wall"},
+				"down": {"uv": [4, 0, 5, 4], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [4, 0, 0],
+			"to": [5, 1, 4],
+			"faces": {
+				"north": {"uv": [11, 15, 12, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [12, 15, 16, 16], "texture": "#wall"},
+				"south": {"uv": [4, 15, 5, 16], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [0, 15, 4, 16], "texture": "#wall"},
+				"up": {"uv": [4, 0, 5, 4], "texture": "#wall"},
+				"down": {"uv": [4, 12, 5, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [4, 14, 0],
+			"to": [5, 16, 4],
+			"faces": {
+				"north": {"uv": [11, 0, 12, 2], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [12, 0, 16, 2], "texture": "#wall"},
+				"south": {"uv": [4, 0, 5, 2], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [0, 0, 4, 2], "texture": "#wall"},
+				"up": {"uv": [4, 0, 5, 4], "texture": "#wall"},
+				"down": {"uv": [4, 12, 5, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "Full wall",
+			"from": [4, 14, 12],
+			"to": [5, 16, 16],
+			"faces": {
+				"north": {"uv": [11, 0, 12, 2], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [0, 0, 4, 2], "texture": "#wall"},
+				"south": {"uv": [4, 0, 5, 2], "texture": "#wall", "cullface": "south"},
+				"west": {"uv": [12, 0, 16, 2], "texture": "#wall"},
+				"up": {"uv": [4, 12, 5, 16], "texture": "#wall"},
+				"down": {"uv": [4, 0, 5, 4], "texture": "#wall", "cullface": "down"}
+			}
+		}
+	],
+	"display": {
+		"gui": {
+			"rotation": [30, 135, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"rotation": [0, 90, 0],
+			"scale": [0.5, 0.5, 0.5]
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json
new file mode 100644
index 0000000..3012ac0
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json
@@ -0,0 +1,22 @@
+{
+	"credit": "I made this with the Blockbench",
+	"textures": {
+    "wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+    "particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	},
+	"elements": [
+		{
+			"name": "Center post",
+			"from": [4, 0, 4],
+			"to": [12, 16, 12],
+			"faces": {
+				"north": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"east": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"south": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"west": {"uv": [4, 0, 12, 16], "texture": "#wall"},
+				"up": {"uv": [4, 4, 12, 12], "texture": "#wall", "cullface": "up"},
+				"down": {"uv": [4, 4, 12, 12], "texture": "#wall", "cullface": "down"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json
new file mode 100644
index 0000000..c39c2e1
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json
@@ -0,0 +1,65 @@
+{
+	"credit": "I made this with the Blockbench",
+	"textures": {
+		"wall": "engineersdecor:block/concrete/rebar_concrete_texture0",
+		"particle": "engineersdecor:block/concrete/rebar_concrete_texture0"
+	},
+	"elements": [
+		{
+			"name": "wall",
+			"from": [5, 0, 0],
+			"to": [11, 16, 8],
+			"faces": {
+				"north": {"uv": [5, 0, 11, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [8, 0, 16, 16], "texture": "#wall"},
+				"west": {"uv": [0, 0, 8, 16], "texture": "#wall"},
+				"up": {"uv": [5, 0, 11, 8], "texture": "#wall"},
+				"down": {"uv": [5, 8, 11, 16], "texture": "#wall"}
+			}
+		},
+		{
+			"name": "wall",
+			"from": [11, 14, 0],
+			"to": [11.875, 16, 8],
+			"faces": {
+				"north": {"uv": [4.25, 0, 5, 1.875], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [8, 0, 16, 1.875], "texture": "#wall"},
+				"up": {"uv": [11, 0, 11.75, 8], "texture": "#wall"},
+				"down": {"uv": [11, 8, 11.75, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "wall",
+			"from": [11, 0, 0],
+			"to": [11.875, 1, 8],
+			"faces": {
+				"north": {"uv": [4.125, 15, 5, 16], "texture": "#wall", "cullface": "north"},
+				"east": {"uv": [8, 15, 16, 16], "texture": "#wall"},
+				"up": {"uv": [11, 0, 11.875, 8], "texture": "#wall"},
+				"down": {"uv": [11, 8, 11.875, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "wall",
+			"from": [4.125, 14, 0],
+			"to": [5, 16, 8],
+			"faces": {
+				"north": {"uv": [11, 0, 11.75, 1.875], "texture": "#wall", "cullface": "north"},
+				"west": {"uv": [0, 0, 8, 1.875], "texture": "#wall"},
+				"up": {"uv": [4.25, 0, 5, 8], "texture": "#wall"},
+				"down": {"uv": [4.25, 8, 5, 16], "texture": "#wall", "cullface": "down"}
+			}
+		},
+		{
+			"name": "wall",
+			"from": [4.125, 0, 0],
+			"to": [5, 1, 8],
+			"faces": {
+				"north": {"uv": [10.875, 15, 11.75, 16], "texture": "#wall", "cullface": "north"},
+				"west": {"uv": [0, 15, 8, 16], "texture": "#wall"},
+				"up": {"uv": [4.25, 0, 5.125, 8], "texture": "#wall"},
+				"down": {"uv": [4.25, 8, 5.125, 16], "texture": "#wall", "cullface": "down"}
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_block.json
new file mode 100644
index 0000000..62cf8c5
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_block.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/brick/clinker_brick_model0" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_stairs.json
new file mode 100644
index 0000000..8e07eed
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/clinker_brick_stairs.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/brick/clinker_brick_stairs" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/models/item/concrete_wall.json
new file mode 100644
index 0000000..32b7819
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/concrete_wall.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/concrete/concrete_wall_inventory" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_ladder.json b/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_ladder.json
new file mode 100644
index 0000000..330536f
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_ladder.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/ladder/metal_rung_ladder_model" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_steps.json b/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_steps.json
new file mode 100644
index 0000000..e951242
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/metal_rung_steps.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/ladder/metal_rung_steps_model" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete.json b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete.json
new file mode 100644
index 0000000..dbd6702
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/concrete/rebar_concrete_model0" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_stairs.json
new file mode 100644
index 0000000..dd9a672
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_stairs.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/concrete/rebar_concrete_stairs" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_wall.json b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_wall.json
new file mode 100644
index 0000000..61ad001
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/rebar_concrete_wall.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/concrete/rebar_concrete_wall_inventory" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_block.json b/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_block.json
new file mode 100644
index 0000000..3095b6c
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_block.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/brick/slag_brick_model0" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_stairs.json b/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_stairs.json
new file mode 100644
index 0000000..efc9526
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/slag_brick_stairs.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/brick/slag_brick_stairs" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_ladder.json b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_ladder.json
new file mode 100644
index 0000000..b707210
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_ladder.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/ladder/treated_wood_ladder_model" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_pole.json b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_pole.json
new file mode 100644
index 0000000..492d632
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_pole.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/pole/straight_pole_up_model" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_table.json b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_table.json
new file mode 100644
index 0000000..e294add
--- /dev/null
+++ b/1.13/src/main/resources/assets/engineersdecor/models/item/treated_wood_table.json
@@ -0,0 +1 @@
+{ "parent": "engineersdecor:block/furniture/treated_wood_table_model" }
\ No newline at end of file
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture0.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture0.png
new file mode 100644
index 0000000..5a06481
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture0.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture1.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture1.png
new file mode 100644
index 0000000..1d536e6
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture1.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture2.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture2.png
new file mode 100644
index 0000000..04b7f03
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture2.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png
new file mode 100644
index 0000000..cb6f0f7
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture3.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture4.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture4.png
new file mode 100644
index 0000000..77541ae
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture4.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture5.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture5.png
new file mode 100644
index 0000000..a73f43f
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture5.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture6.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture6.png
new file mode 100644
index 0000000..6002fdf
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture6.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture7.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture7.png
new file mode 100644
index 0000000..5b39955
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/clinker_brick/clinker_brick_texture7.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png
new file mode 100644
index 0000000..c0157c1
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture0.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png
new file mode 100644
index 0000000..5645eab
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture1.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture2.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture2.png
new file mode 100644
index 0000000..f1a97db
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture2.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture3.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture3.png
new file mode 100644
index 0000000..6e39b40
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture3.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture4.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture4.png
new file mode 100644
index 0000000..8773119
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture4.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture5.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture5.png
new file mode 100644
index 0000000..c9aab19
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture5.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png
new file mode 100644
index 0000000..99e6367
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture6.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png
new file mode 100644
index 0000000..8ee5d60
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/concrete/rebar_concrete_texture7.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/ieoriginal/ie_stone_decoration_concrete.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/ieoriginal/ie_stone_decoration_concrete.png
new file mode 100644
index 0000000..b19d0ef
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/ieoriginal/ie_stone_decoration_concrete.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof.png
new file mode 100644
index 0000000..23dff87
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png
new file mode 100644
index 0000000..a5f0382
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/ironsheet_roof_top.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/steel_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/steel_texture.png
new file mode 100644
index 0000000..9584364
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/steel_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png
new file mode 100644
index 0000000..a1d0537
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_nailed_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_nailed_texture.png
new file mode 100644
index 0000000..6c7a9c6
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_nailed_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_texture.png
new file mode 100644
index 0000000..3ce7527
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_framed_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png
new file mode 100644
index 0000000..8c50fc8
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_pole_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_rough_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_rough_texture.png
new file mode 100644
index 0000000..fccfc82
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/iestyle/treated_wood_rough_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_side_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_side_texture.png
new file mode 100644
index 0000000..533f852
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_side_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_top_texture.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_top_texture.png
new file mode 100644
index 0000000..4605187
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/pole/treated_wood_pole_top_texture.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture0.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture0.png
new file mode 100644
index 0000000..8378625
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture0.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png
new file mode 100644
index 0000000..1e56869
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture1.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png
new file mode 100644
index 0000000..8832f88
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture2.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture3.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture3.png
new file mode 100644
index 0000000..d1edf88
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture3.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture4.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture4.png
new file mode 100644
index 0000000..dea4b97
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture4.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png
new file mode 100644
index 0000000..baa5672
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture5.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png
new file mode 100644
index 0000000..6895552
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture6.png differ
diff --git a/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png
new file mode 100644
index 0000000..966aee4
Binary files /dev/null and b/1.13/src/main/resources/assets/engineersdecor/textures/block/slag_brick/slag_brick_texture7.png differ
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json b/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json
new file mode 100644
index 0000000..3099a1d
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/_constants.json
@@ -0,0 +1,89 @@
+[
+  {
+    "items": [
+      { "item": "minecraft:brick" },
+      { "item": "minecraft:nether_brick" }
+    ],
+    "name": "engineersdecor:any_brick_ingot"
+  },
+  {
+    "items": [
+      { "item": "minecraft:bricks" },
+      { "item": "minecraft:nether_bricks" }
+    ],
+    "name": "engineersdecor:any_brick_block"
+  },
+  {
+    "items": [
+      { "item": "minecraft:black_concrete_powder" },
+      { "item": "minecraft:blue_concrete_powder" },
+      { "item": "minecraft:brown_concrete_powder" },
+      { "item": "minecraft:cyan_concrete_powder" },
+      { "item": "minecraft:gray_concrete_powder" },
+      { "item": "minecraft:green_concrete_powder" },
+      { "item": "minecraft:light_blue_concrete_powder" },
+      { "item": "minecraft:light_gray_concrete_powder" },
+      { "item": "minecraft:lime_concrete_powder" },
+      { "item": "minecraft:magenta_concrete_powder" },
+      { "item": "minecraft:orange_concrete_powder" },
+      { "item": "minecraft:pink_concrete_powder" },
+      { "item": "minecraft:purple_concrete_powder" },
+      { "item": "minecraft:red_concrete_powder" },
+      { "item": "minecraft:white_concrete_powder" },
+      { "item": "minecraft:yellow_concrete_powder" },
+      { "item": "minecraft:black_concrete" },
+      { "item": "minecraft:blue_concrete" },
+      { "item": "minecraft:brown_concrete" },
+      { "item": "minecraft:cyan_concrete" },
+      { "item": "minecraft:gray_concrete" },
+      { "item": "minecraft:green_concrete" },
+      { "item": "minecraft:light_blue_concrete" },
+      { "item": "minecraft:light_gray_concrete" },
+      { "item": "minecraft:lime_concrete" },
+      { "item": "minecraft:magenta_concrete" },
+      { "item": "minecraft:orange_concrete" },
+      { "item": "minecraft:pink_concrete" },
+      { "item": "minecraft:purple_concrete" },
+      { "item": "minecraft:red_concrete" },
+      { "item": "minecraft:white_concrete" },
+      { "item": "minecraft:yellow_concrete" }
+    ],
+    "name": "engineersdecor:concrete"
+  },
+  {
+    "items": [
+      { "item": "minecraft:bone_meal" }
+    ],
+    "name": "engineersdecor:any_slag"
+  },
+  {
+    "items": [
+      { "item": "minecraft:iron_nugget" }
+    ],
+    "name": "engineersdecor:any_ferro_metal_stick"
+  },
+  {
+    "items": [
+      { "item": "minecraft:iron_nugget" }
+    ],
+    "name": "engineersdecor:steel_stick"
+  },
+  {
+    "items": [
+      { "item": "minecraft:stick" }
+    ],
+    "name": "engineersdecor:treated_wood_stick"
+  },
+  {
+    "items": [
+      { "item": "minecraft:dark_oak_planks" }
+    ],
+    "name": "engineersdecor:treated_wood_planks"
+  },
+  {
+    "items": [
+      { "item": "minecraft:dark_oak_slab" }
+    ],
+    "name": "engineersdecor:treated_wood_slab"
+  }
+]
\ No newline at end of file
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json
new file mode 100644
index 0000000..25f383d
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_recipe.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:clinker_brick_block"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "BBB",
+    "BNB",
+    "BBB"
+  ],
+  "key": {
+    "B": { "constant": "engineersdecor:any_brick_ingot" },
+    "N": { "constant": "engineersdecor:any_brick_block" }
+  },
+  "result": {
+    "item": "engineersdecor:clinker_brick_block",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json
new file mode 100644
index 0000000..a4cea28
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:clinker_brick_stairs"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "C  ",
+    "CC ",
+    "CCC"
+  ],
+  "key": {
+    "C": {
+      "item": "engineersdecor:clinker_brick_block"
+    }
+  },
+  "result": {
+    "item": "engineersdecor:clinker_brick_stairs",
+    "count": 9
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json
new file mode 100644
index 0000000..7cd85bc
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:clinker_brick_block"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "SS",
+    "SS"
+  ],
+  "key": {
+    "S": {
+      "item": "engineersdecor:clinker_brick_stairs"
+    }
+  },
+  "result": {
+    "item": "engineersdecor:clinker_brick_block",
+    "count": 3
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json
new file mode 100644
index 0000000..1e457b2
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_ladder_recipe.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:metal_rung_ladder",
+  "later_required": ["immersiveengineering:material"]
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "S S",
+    "SSS",
+    "   "
+  ],
+  "key": {
+    "S": { "constant": "engineersdecor:any_ferro_metal_stick" }
+  },
+  "result": {
+    "item": "engineersdecor:metal_rung_ladder",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json
new file mode 100644
index 0000000..44abd9f
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/metal_rung_steps_recipe.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:metal_rung_steps",
+"later_required": ["immersiveengineering:material"]
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    " SS",
+    "SS ",
+    " SS"
+  ],
+  "key": {
+    "S": { "constant": "engineersdecor:any_ferro_metal_stick" }
+  },
+  "result": {
+    "item": "engineersdecor:metal_rung_steps",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json
new file mode 100644
index 0000000..8b61f31
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_recipe.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:rebar_concrete"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "SCS",
+    "CSC",
+    "SCS"
+  ],
+  "key": {
+    "C": { "constant": "engineersdecor:concrete" },
+    "S": { "constant": "engineersdecor:steel_stick" }
+  },
+  "result": {
+    "item": "engineersdecor:rebar_concrete",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json
new file mode 100644
index 0000000..1b05f55
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_stairs_recipe.json
@@ -0,0 +1,21 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:rebar_concrete_stairs"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "C  ",
+    "CC ",
+    "CCC"
+  ],
+  "key": {
+    "C": { "item": "engineersdecor:rebar_concrete" }
+  },
+  "result": {
+    "item": "engineersdecor:rebar_concrete_stairs",
+    "count": 9
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json
new file mode 100644
index 0000000..9afdf8d
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/rebar_concrete_wall_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:rebar_concrete_wall"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "   ",
+    "CCC",
+    "CCC"
+  ],
+  "key": {
+    "C": {
+      "item": "engineersdecor:rebar_concrete"
+    }
+  },
+  "result": {
+    "item": "engineersdecor:rebar_concrete_wall",
+    "count": 6
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json
new file mode 100644
index 0000000..9f07a06
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_recipe_with_slag.json
@@ -0,0 +1,22 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:slag_brick_block"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "BBB",
+    "BSB",
+    "BBB"
+  ],
+  "key": {
+    "B": { "constant": "engineersdecor:any_brick_ingot" },
+    "S": { "constant": "engineersdecor:any_slag" }
+  },
+  "result": {
+    "item": "engineersdecor:slag_brick_block",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json
new file mode 100644
index 0000000..20adf39
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/slag_brick_stairs_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:slag_brick_stairs"
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "C  ",
+    "CC ",
+    "CCC"
+  ],
+  "key": {
+    "C": {
+      "item": "engineersdecor:slag_brick_block"
+    }
+  },
+  "result": {
+    "item": "engineersdecor:slag_brick_stairs",
+    "count": 9
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json
new file mode 100644
index 0000000..8db74e1
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_ladder_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:treated_wood_ladder",
+"later_required": ["immersiveengineering:material"]
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "S#S",
+    "SSS",
+    "S#S"
+  ],
+  "key": {
+    "S": { "constant": "engineersdecor:treated_wood_stick" },
+    "#": { "item": "minecraft:bone_meal" }
+  },
+  "result": {
+    "item": "engineersdecor:treated_wood_ladder",
+    "count": 4
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json
new file mode 100644
index 0000000..8d16ec3
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_pole_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:treated_wood_pole",
+"later_required": ["immersiveengineering:material"]
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    " S ",
+    " W ",
+    " W "
+  ],
+  "key": {
+    "W": { "constant": "engineersdecor:treated_wood_planks" },
+    "S": { "constant": "engineersdecor:treated_wood_slab" }
+  },
+  "result": {
+    "item": "engineersdecor:treated_wood_pole",
+    "count": 6
+  }
+}
diff --git a/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json
new file mode 100644
index 0000000..d366991
--- /dev/null
+++ b/1.13/src/main/resources/data/engineersdecor/recipes/treated_wood_table_recipe.json
@@ -0,0 +1,23 @@
+{
+  "conditions": [
+    {
+      "type": "engineersdecor:grc",
+      "result": "engineersdecor:treated_wood_table",
+"later_required": ["immersiveengineering:material"]
+    }
+  ],
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "WWW",
+    "S S",
+    "S S"
+  ],
+  "key": {
+    "W": { "constant": "engineersdecor:treated_wood_slab" },
+    "S": { "item": "engineersdecor:treated_wood_pole" }
+  },
+  "result": {
+    "item": "engineersdecor:treated_wood_table",
+    "count": 1
+  }
+}
diff --git a/1.13/src/main/resources/pack.mcmeta b/1.13/src/main/resources/pack.mcmeta
new file mode 100644
index 0000000..f642e0f
--- /dev/null
+++ b/1.13/src/main/resources/pack.mcmeta
@@ -0,0 +1,7 @@
+{
+  "pack": {
+    "description": "engineersdecor resources",
+    "pack_format": 4,
+    "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods."
+  }
+}
diff --git a/1.13/tasks.js b/1.13/tasks.js
new file mode 100644
index 0000000..2d1953a
--- /dev/null
+++ b/1.13/tasks.js
@@ -0,0 +1,231 @@
+#!/usr/bin/djs
+"use strict";
+if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod source directory.");
+if(!fs.isdir("../.git")) throw new Error("Missing git repository in parent directory of mod source.");
+
+var tasks = {};
+
+tasks["dist-check"] = function() {
+  const uncommitted_changes = sys.shell("git status -s").trim();
+  const gittags = sys.shell('git log -1 --format="%D"')
+                  .replace(/[\s]/g,"").split(",")
+                  .filter(function(s){ return s.indexOf("tag:")==0;})
+                  .map(function(s){ return s.replace(/^tag:/,"");});
+  const version_engineersdecor = fs.readfile("gradle.properties", function(line){
+    if(line.trim().indexOf("version_engineersdecor")!=0) return false;
+    return line.replace(/^.*?=/,"").trim()
+  }).trim();
+  const git_remote = sys.shell("git remote -v").trim();
+  const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim();
+  const git_diff = sys.shell("git diff").trim();
+  var fails = [];
+  if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties.");
+  if(!gittags.length) fails.push("Version not tagged.");
+  if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version.");
+  if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository.");
+  if((git_branch != "develop") && (git_branch != "master")) {
+    fails.push("No valid branch for dist. (branch:'"+git_branch+"')");
+  } else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) {
+    fails.push("Cannot make release dist on develop branch.");
+  } else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) {
+    fails.push("Cannot make beta dist on master branch.");
+  }
+  if(git_diff !== "") fails.push("Not everything committed to the GIT repository.");
+  if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing.");
+  if(fails.length>0) {
+    for(var i in fails) fails[i] = "  - " + fails[i];
+    alert("Dist check failed");
+    alert(fails.join("\n")+"\n");
+    exit(1);
+  }
+};
+
+tasks["sync-languages"] = function() {
+ // @todo: has become easier but needs impl.
+};
+
+tasks["tabs-to-spaces"] = function() {
+  var file_list = (function() {
+    var ls = [];
+    const ext = ['java'];
+    for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
+    for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
+    ls.sort();
+    ls.push("readme.md");
+    return ls;
+  })();
+  for(var file_i in file_list) {
+    var file = file_list[file_i];
+    var txt = fs.readfile(file);
+    if(txt===undefined) throw new Error("Failed to read '" + file + "'");
+    const txt_length = txt.length;
+    txt = txt.replace(/[\t]/g,"  ");
+    const n = txt.length - txt_length;
+    if(n > 0) {
+      print("File '" + file + "': Changed " + n + " tabs to 2 spaces." );
+      fs.writefile(file, txt);
+    }
+  }
+};
+
+tasks["trailing-whitespaces"] = function() {
+  var file_list = (function() {
+    var ls = [];
+    const ext = ['java','json','lang'];
+    for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
+    for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
+    ls.sort();
+    ls.push("readme.md");
+    return ls;
+  })();
+  for(var file_i in file_list) {
+    var file = file_list[file_i];
+    var txt = fs.readfile(file);
+    if(txt===undefined) throw new Error("Failed to read '" + file + "'");
+    const txt_length = txt.length;
+    txt = txt.replace(/[\r\t ]+[\n]/g,"\n");
+    const n = txt_length - txt.length;
+    if(n > 0) {
+      print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." );
+      fs.writefile(file, txt);
+    }
+  }
+};
+
+tasks["version-check"] = function() {
+  var version_minecraft="";
+  var version_forge="";
+  var version_engineersdecor="";
+  fs.readfile("gradle.properties", function(line){
+    if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) {
+      version_minecraft = line.replace(/^[^=]+=/,"").trim();
+    } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) {
+      version_forge = line.replace(/^[^=]+=/,"").trim();
+    } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) {
+      version_engineersdecor = line.replace(/^[^=]+=/,"").trim();
+    }
+    return false;
+  })
+  const combined_version = version_minecraft + "-" + version_engineersdecor;
+  var readme_version_found = fs.readfile("readme.md", function(line){
+    var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i);
+    if((!m) || (!m.length) || (m.length < 2)) {
+      m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i);
+      if((!m) || (!m.length) || (m.length < 2)) return false;
+    }
+    return m[1]==version_engineersdecor;
+  });
+  var ok=true;
+  if(!readme_version_found) {
+    alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog.");
+    ok = false;
+  }
+  if(!ok) {
+    alert("Version data:");
+    alert(" - combined_version  : '" + combined_version + "'");
+    alert(" - version_forge     : '" + version_forge + "'");
+    exit(1);
+  }
+};
+
+tasks["dist"] = function() {
+  function readme_history(file_path) {
+    var readme = fs.readfile(file_path);
+    if(!readme) throw new Error("Failed to load readme.md");
+    readme = readme.split(/[\r]?[\n]/);
+    while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+    while((readme.length > 0) && readme[0].trim()=="") readme.shift();
+    // revision history section
+    if(!readme.length) throw new Error("Revision history section not found in readme");
+    readme.shift();
+    var end_of_history = readme.length;
+    for(var i=0; i= 0) { end_of_history=i; break; }
+    if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+    // remove empty lines, splitters
+    while(readme.length >= end_of_history) readme.pop();
+    while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop();
+
+    const min_indent = readme
+      .map(function(s){return s.search(/[^\s]/)})
+      .filter(function(e){return e>=0})
+      .reduce(function(acc,e){return (e 1) {
+      for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); }
+    }
+    return readme.join("\n");
+  }
+  const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
+  fs.writefile("dist/revision-history.html", html);
+};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.cwd();
+  function read_history() {
+    var readme = fs.readfile(root_dir + "/readme.md");
+    if(!readme) throw new Error("Failed to load readme.md");
+    readme = readme.split(/[\r]?[\n]/);
+    while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+    // revision history section
+    if(!readme.length) throw new Error("Revision history section not found in readme");
+    readme.shift();
+    var end_of_history = readme.length;
+    for(var i=0; i= 0) { end_of_history=i; break; }
+    if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+    // remove empty lines, splitters
+    while(readme.length >= end_of_history) readme.pop();
+    for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
+    readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
+    // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^[\[\-]/) < 0) {
+        readme[i-1] += " " + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Condense log entries sepatated with newlines to one line for each version
+    for(var i=readme.length-1; i>0; --i) {
+      var line = readme[i].replace(/^\s+/,"");
+      if(line.search(/^-/) < 0) {
+        readme[i-1] += "\n" + line;
+        readme[i] = "";
+      }
+    }
+    readme = readme.filter(function(a){return a!="";});
+    // Separate versions.
+    var history = {};
+    for(var i in readme) {
+      var line = readme[i].replace(/^[\sv-]+/g,"").trim();
+      var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
+      var txt = line.substr(line.search(" ")).trim();
+      if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
+      history[ver] = txt;
+    }
+    return history;
+  }
+  var history = read_history();
+  var latest_release = "";
+  var latest_beta = "";
+  for(var ver in history) { latest_beta=ver; break; }
+  for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.13.2": history,
+    promos: {
+      "1.13.2-recommended": latest_release,
+      "1.13.2-latest": latest_beta,
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}
diff --git a/Makefile b/Makefile
index 4594403..cec0991 100644
--- a/Makefile
+++ b/Makefile
@@ -13,93 +13,37 @@
 # For image stripping install imagemagick and
 # also put the "magick" executable in the PATH.
 #
-MOD_JAR_PREFIX=engineersdecor-
-MOD_JAR=$(filter-out %-sources.jar,$(wildcard build/libs/${MOD_JAR_PREFIX}*.jar))
+.PHONY: default init clean clean-all dist sync-main-repo sanatize update-json
+.PHONY: init-1.12 clean-1.12 clean-all-1.12 dist-1.12 sanatize-1.12
+.PHONY: init-1.13 clean-1.13 clean-all-1.13 dist-1.13 sanatize-1.13
 
-ifeq ($(OS),Windows_NT)
-GRADLE=gradlew.bat --no-daemon
-GRADLE_STOP=gradlew.bat --stop
-INSTALL_DIR=$(realpath ${APPDATA}/.minecraft)
-SERVER_INSTALL_DIR=$(realpath ${APPDATA}/minecraft-server-forge-1.12.2-14.23.5.2768)
-DJS=djs
-else
-GRADLE=./gradlew --no-daemon
-GRADLE_STOP=./gradlew --stop
-INSTALL_DIR=~/.minecraft
-SERVER_INSTALL_DIR=~/.minecraft-server-forge-1.12.2-14.23.5.2768
-DJS=djs
-endif
+default:	;	@echo "(You are not in a MC specific version directory)"
+clean: clean-1.12 clean-1.13
+clean-all: clean-all-1.13
+init: init-1.12 init-1.13
 
-wildcardr=$(foreach d,$(wildcard $1*),$(call wildcardr,$d/,$2) $(filter $(subst *,%,$2),$d))
+clean-1.12: 		; -@cd 1.12; make -s clean
+clean-1.13: 		; -@cd 1.13; make -s clean
+clean-all-1.12: ;	-@cd 1.12; make -s clean-all
+clean-all-1.13: ;	-@cd 1.13; make -s clean-all
+init-1.12:			; -@cd 1.12; make -s init
+init-1.13:			; -@cd 1.13; make -s init
+dist-1.12:			; @cd 1.12; make -s dist
+dist-1.13:			; @cd 1.13; make -s dist
+dist: dist-1.12 dist-1.13 | update-json
 
-#
-# Targets
-#
-.PHONY: default mod init clean clean-all all run install sanatize dist-check dist start-server sync-main-repo
-
-default: mod
-
-all: clean clean-all mod | install
-
-mod:
-	@echo "Building mod using gradle ..."
-	@$(GRADLE) build $(GRADLE_OPTS)
-
-clean:
-	@echo "Cleaning ..."
-	@rm -f build/libs/*
-	@$(GRADLE) clean
-
-clean-all: clean
-	@echo "Cleaning using gradle ..."
-	@rm -f dist/*
-	@$(GRADLE) clean cleanCache
-
-init:
-	@echo "Initialising eclipse workspace using gradle ..."
-	@$(GRADLE) setupDecompWorkspace
-
-run:
-	@echo "Running client ..."
-	@$(GRADLE) runClient
-
-install: $(MOD_JAR) |
-	@sleep 2s
-	@if [ ! -d "$(INSTALL_DIR)" ]; then echo "Cannot find installation minecraft directory."; false; fi
-	@echo "Installing '$(MOD_JAR)' to '$(INSTALL_DIR)/mods' ..."
-	@[ -d "$(INSTALL_DIR)/mods" ] || mkdir "$(INSTALL_DIR)/mods"
-	@rm -f "$(INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar
-	@cp -f "$(MOD_JAR)" "$(INSTALL_DIR)/mods/"
-	@echo "Installing '$(MOD_JAR)' to '$(SERVER_INSTALL_DIR)/mods' ..."
-	@rm -f "$(SERVER_INSTALL_DIR)/mods/${MOD_JAR_PREFIX}"*.jar
-	@[ -d "$(SERVER_INSTALL_DIR)/mods" ] && cp -f "$(MOD_JAR)" "$(SERVER_INSTALL_DIR)/mods/"
-
-start-server: install
-	@echo "Starting local dedicated server ..."
-	@cd "$(SERVER_INSTALL_DIR)" && java -jar forge-1.12.2-14.23.5.2768-universal.jar nogui
+update-json:
+	@echo "[main] Update update.json ..."
+	@djs tasks.js update-json
 
 sanatize:
-	@echo "Running sanatising tasks ..."
-	@djs scripts/sanatize-trailing-whitespaces.js
-	@djs scripts/sanatize-tabs-to-spaces.js
-	@djs scripts/sanatize-sync-languages.js
-	@djs scripts/sanatize-version-check.js
-	@djs scripts/task-update-json.js
-	@git status -s
-
-dist-check:
-	@echo "Running dist checks ..."
-	@djs scripts/sanatize-dist-check.js
-
-dist: sanatize dist-check clean-all mod
-	@echo "Distribution files ..."
-	@mkdir -p dist
-	@cp build/libs/$(MOD_JAR_PREFIX)* dist/
-	@djs scripts/task-dist.js
+	@cd 1.12; make -s sanatize
+	@cd 1.13; make -s sanatize
+	@make -s update-json
 
 # For reviewers: I am using a local repository for experimental changes,
 # this target copies the local working tree to the location of the
 # repository that you cloned.
-sync-main-repo: sanatize
-	@echo "Synchronising to github repository working tree ..."
-	@djs scripts/sync-main-repo.js
+sync-main-repo: sanatize update-json
+	@echo "[main] Synchronising to github repository working tree ..."
+	@djs tasks.js sync-main-repository
diff --git a/credits.md b/credits.md
index 14493f4..cb49019 100644
--- a/credits.md
+++ b/credits.md
@@ -11,3 +11,8 @@ Mod components derived/inspired by IE:
 
   - Style color scheme of treated wood/steel/concrete to match IE color scheme.
   - Recipe _constants.json file (for using IE items as ingredients)
+
+IE components referenced in this mod:
+
+  - immersiveengineering:textures/block/stone_decoration_concrete.png (for IE
+    concrete wall).
diff --git a/meta/update.json b/meta/update.json
index 3e4df43..c8558cd 100644
--- a/meta/update.json
+++ b/meta/update.json
@@ -7,8 +7,13 @@
     "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).",
     "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table."
   },
+  "1.13.2": {
+    "1.0.0-a1": "[A] Initial port to 1.13.2 with Forge beta."
+  },
   "promos": {
     "1.12.2-recommended": "1.0.0",
-    "1.12.2-latest": "1.0.0"
+    "1.12.2-latest": "1.0.0",
+    "1.13.2-recommended": "",
+    "1.13.2-latest": "1.0.0-a1"
   }
 }
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 2c045f4..ad50f75 100644
--- a/readme.md
+++ b/readme.md
@@ -7,6 +7,13 @@ for the Engineer's factory, workshop, and home.
 
 ![](documentation/engineers-decor-v100a-summary.png)
 
+### Distribution file download
+
+Main distribution channel for this mod is CurseForge:
+
+  - Release/beta versions: https://www.curseforge.com/minecraft/mc-mods/engineers-decor/files
+  - All versions: https://minecraft.curseforge.com/projects/engineers-decor/files
+
 ----
 ### Details
 
@@ -73,26 +80,15 @@ More to come slowly but steadily.
 ----
 ## Revision history
 
-                -------------------------------------------------------------------
-    - v1.0.0    [R] Release based on v1.0.0-b4
-                -------------------------------------------------------------------
+Mod versions are tracked in the readme files for individual Minecraft versions, and
+of course in the commits of this repository. Beta and release versions that are
+distributed as compiled `jar`s are tagged accordingly. Release versions are merged
+into the `master` branch, while beta/alpha version tags link to `develop` branch
+commits.
 
-    - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall.
-                [A] Concrete wall, material: IE concrete.
+  - [1.12](1.12/readme.md)
 
-    - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved.
-                [A] Added rebar concrete wall.
-
-    - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof).
-
-    - v1.0.0-b1 [A] Initial structure.
-                [A] Added clinker bricks and clinker brick stairs.
-                [A] Added slag bricks and slag brick stairs.
-                [A] Added metal rung ladder.
-                [A] Added staggered metal steps ladder.
-                [A] Added treated wood ladder.
-                [A] Added treated wood pole.
-                [A] Added treated wood table.
+  - [1.13](1.13/readme.md)
 
 ### Community references
 
diff --git a/scripts/sanatize-dist-check.js b/scripts/sanatize-dist-check.js
deleted file mode 100644
index bdb67ef..0000000
--- a/scripts/sanatize-dist-check.js
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-
-const uncommitted_changes = sys.shell("git status -s").trim();
-
-const gittags = sys.shell('git log -1 --format="%D"')
-                .replace(/[\s]/g,"").split(",")
-                .filter(function(s){ return s.indexOf("tag:")==0;})
-                .map(function(s){ return s.replace(/^tag:/,"");});
-
-const version_engineersdecor = fs.readfile("gradle.properties", function(line){
-  if(line.trim().indexOf("version_engineersdecor")!=0) return false;
-  return line.replace(/^.*?=/,"").trim()
-}).trim();
-
-const git_remote = sys.shell("git remote -v").trim();
-const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim();
-const git_diff = sys.shell("git diff").trim();
-var fails = [];
-
-if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties.");
-if(!gittags.length) fails.push("Version not tagged.");
-if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version.");
-if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository.");
-if((git_branch != "develop") && (git_branch != "master")) {
-  fails.push("No valid branch for dist. (branch:'"+git_branch+"')");
-} else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) {
-  fails.push("Cannot make release dist on develop branch.");
-} else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) {
-  fails.push("Cannot make beta dist on master branch.");
-}
-if(git_diff !== "") fails.push("Not everything committed to the GIT repository.");
-if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing.");
-
-if(fails.length>0) {
-  for(var i in fails) fails[i] = "  - " + fails[i];
-  alert("Dist check failed");
-  alert(fails.join("\n")+"\n");
-  exit(1);
-}
diff --git a/scripts/sanatize-sync-languages.js b/scripts/sanatize-sync-languages.js
deleted file mode 100644
index 3390036..0000000
--- a/scripts/sanatize-sync-languages.js
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-function load() {
-  var lang_data = {};
-  fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){
-    var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase();
-    var lines = fs.readfile(f).trim().split("\n");
-    var was_eol_escape = false;
-    for(var i in lines) {
-      if(was_eol_escape) {
-        var k=0;
-        for(k=i-1; k>=0; --k) {
-          if(lines[k] != null) {
-            lines[k] += "\n" + lines[i];
-            break;
-          }
-        }
-        was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
-        lines[i] = null;
-      } else {
-        lines[i] = lines[i].trim();
-        was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
-      }
-    }
-    lang_data[lang_code] = lines.filter(function(l){return (l!==null);});
-    return false;
-  });
-  return lang_data;
-}
-
-function reference_content(lang_data, reflang_code) {
-  var lang_lines = [];
-  for(var i in lang_data[reflang_code]) {
-    var txt = lang_data[reflang_code][i].trim();
-    if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file
-    var kv = txt.split("=", 2);
-    var key = kv[0].trim();
-    var val = kv[1].trim();
-    var o = {key:key, tr:{}};
-    o.tr[reflang_code] = val;
-    lang_lines.push(o);
-  }
-  delete lang_data[reflang_code];
-  return lang_lines;
-}
-
-function add_language(lang_lines, lang_name, lang_data) {
-  const find_line = function(lines, key) {
-    for(var i in lines) {
-      if((typeof(lines[i]) !== "object")) continue;
-      if(lines[i].key.toLowerCase()==key.toLowerCase()) return i;
-    }
-    return -1;
-  };
-  for(var i in lang_data) {
-    var txt = lang_data[i].trim();
-    if(txt.search(/^#/)>=0) continue;
-    if(txt.search("=")<0) continue;
-    var kv = txt.split("=", 2);
-    var key = kv[0].trim();
-    var val = kv[1].trim();
-    var line_i = find_line(lang_lines, key);
-    if(line_i >= 0) {
-      lang_data[i] = undefined;
-      lang_lines[line_i].tr[lang_name] = val;
-    }
-  }
-  return lang_data;
-}
-
-function complete_lang_lines(lang_lines, lang_names, reflang_code) {
-  var lang_outputs = {};
-  for(var i in lang_names) lang_outputs[lang_names[i]] = [];
-  for(var i_line in lang_lines) {
-    var entry = lang_lines[i_line];
-    if(typeof(entry) !== "object") {
-      for(var i in lang_names) lang_outputs[lang_names[i]].push(entry);
-    } else {
-      for(var i in lang_names) {
-        var name = lang_names[i];
-        if(entry.tr[name] !== undefined) {
-          lang_outputs[name].push(entry.key + "=" + entry.tr[name]);
-        } else {
-          var added = entry.key + "=" + entry.tr[reflang_code];
-          if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added;
-          lang_outputs[name].push(added);
-          if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'");
-        }
-      }
-    }
-  }
-  return lang_outputs;
-}
-
-const reflang_code = "en_us";
-var lang_data = load();
-var lang_names = Object.keys(lang_data);
-var lang_lines = reference_content(lang_data, reflang_code);
-for(var lang_name in lang_data) {
-  lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]);
-  lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; });
-  if(lang_data[lang_name].length == 0) delete lang_data[lang_name];
-}
-var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code);
-for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n";
-
-// Remaining lines in lang files (not in the reference lang file)
-for(var lang_name in lang_data) {
-  for(var i in lang_data[lang_name]) {
-    if(lang_data[lang_name][i].search(/^#/)<0) {
-      var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,"");
-      output_data[lang_name] += added + "\n";
-      print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'");
-    }
-  }
-}
-for(var name in output_data) output_data[name] = output_data[name].trim() + "\n";
-
-for(var name in output_data) {
-  fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]);
-}
diff --git a/scripts/sanatize-tabs-to-spaces.js b/scripts/sanatize-tabs-to-spaces.js
deleted file mode 100644
index 1bb65a8..0000000
--- a/scripts/sanatize-tabs-to-spaces.js
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-var file_list = (function() {
-  var ls = [];
-  const ext = ['java','lang'];
-  for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
-  for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
-  ls.sort();
-  ls.push("readme.md");
-  return ls;
-})();
-
-for(var file_i in file_list) {
-  var file = file_list[file_i];
-  var txt = fs.readfile(file);
-  if(txt===undefined) throw new Error("Failed to read '" + file + "'");
-  const txt_length = txt.length;
-  txt = txt.replace(/[\t]/g,"  ");
-  const n = txt.length - txt_length;
-  if(n > 0) {
-    print("File '" + file + "': Changed " + n + " tabs to 2 spaces." );
-    fs.writefile(file, txt);
-  }
-}
diff --git a/scripts/sanatize-trailing-whitespaces.js b/scripts/sanatize-trailing-whitespaces.js
deleted file mode 100644
index ee683d8..0000000
--- a/scripts/sanatize-trailing-whitespaces.js
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/djs
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
-
-var file_list = (function() {
-  var ls = [];
-  const ext = ['java','json','lang'];
-  for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i]));
-  for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
-  ls.sort();
-  ls.push("readme.md");
-  return ls;
-})();
-
-for(var file_i in file_list) {
-  var file = file_list[file_i];
-  var txt = fs.readfile(file);
-  if(txt===undefined) throw new Error("Failed to read '" + file + "'");
-  const txt_length = txt.length;
-  txt = txt.replace(/[\r\t ]+[\n]/g,"\n");
-  const n = txt_length - txt.length;
-  if(n > 0) {
-    print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." );
-    fs.writefile(file, txt);
-  }
-}
diff --git a/scripts/sanatize-version-check.js b/scripts/sanatize-version-check.js
deleted file mode 100644
index 975a02f..0000000
--- a/scripts/sanatize-version-check.js
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod base directory.");
-
-var version_minecraft="";
-var version_forge="";
-var version_engineersdecor="";
-
-fs.readfile("gradle.properties", function(line){
-  if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) {
-    version_minecraft = line.replace(/^[^=]+=/,"").trim();
-  } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) {
-    version_forge = line.replace(/^[^=]+=/,"").trim();
-  } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) {
-    version_engineersdecor = line.replace(/^[^=]+=/,"").trim();
-  }
-  return false;
-})
-
-const combined_version = version_minecraft + "-" + version_engineersdecor;
-
-var readme_version_found = fs.readfile("readme.md", function(line){
-  var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i);
-  if((!m) || (!m.length) || (m.length < 2)) {
-    m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i);
-    if((!m) || (!m.length) || (m.length < 2)) return false;
-  }
-  return m[1]==version_engineersdecor;
-});
-
-var ok=true;
-if(!readme_version_found) {
-  alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog.");
-  ok = false;
-}
-if(!ok) {
-  alert("Version data:");
-  alert(" - combined_version  : '" + combined_version + "'");
-  alert(" - version_forge     : '" + version_forge + "'");
-  exit(1);
-}
diff --git a/scripts/sync-main-repo.js b/scripts/sync-main-repo.js
deleted file mode 100644
index 5144f5d..0000000
--- a/scripts/sync-main-repo.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-const main_repo_local = fs.realpath("../engineersdecor-github");
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-const test_repo_local = fs.cwd();
-if(main_repo_local == "") throw new Error("Main repository (real) path not found.");
-if(fs.realpath(main_repo_local) == fs.realpath(test_repo_local)) throw new Error("This is already the main repository");
-if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
-if(fs.cwd().search("-github") < 0) throw new Error("Main repository is missing the '*-github' tag in the path name.");
-sys.shell("rm -rf build documentation gradle meta scripts src")
-sys.shell("rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md")
-if((!fs.chdir(test_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to local dev directory.");
-sys.shell("cp -r documentation gradle meta scripts src " + main_repo_local + "/")
-sys.shell("cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md " + main_repo_local + "/")
-if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
-print(sys.shell("git status -s"))
diff --git a/scripts/task-dist.js b/scripts/task-dist.js
deleted file mode 100644
index 6af7d72..0000000
--- a/scripts/task-dist.js
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
-
-function readme_history(file_path) {
-  var readme = fs.readfile(file_path);
-  if(!readme) throw new Error("Failed to load readme.md");
-  readme = readme.split(/[\r]?[\n]/);
-  while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
-  while((readme.length > 0) && readme[0].trim()=="") readme.shift();
-  // revision history section
-  if(!readme.length) throw new Error("Revision history section not found in readme");
-  readme.shift();
-  var end_of_history = readme.length;
-  for(var i=0; i= 0) { end_of_history=i; break; }
-  if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
-  // remove empty lines, splitters
-  while(readme.length >= end_of_history) readme.pop();
-  while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop();
-
-  const min_indent = readme
-    .map(function(s){return s.search(/[^\s]/)})
-    .filter(function(e){return e>=0})
-    .reduce(function(acc,e){return (e 1) {
-    for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); }
-  }
-  return readme.join("\n");
-}
-
-const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
-fs.writefile("dist/revision-history.html", html);
diff --git a/scripts/task-update-json.js b/scripts/task-update-json.js
deleted file mode 100644
index 9923852..0000000
--- a/scripts/task-update-json.js
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/djs
-"use strict";
-const root_dir = fs.realpath(fs.dirname(sys.script)+"/..");
-
-function read_history() {
-  var readme = fs.readfile(root_dir + "/readme.md");
-  if(!readme) throw new Error("Failed to load readme.md");
-  readme = readme.split(/[\r]?[\n]/);
-  while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
-  // revision history section
-  if(!readme.length) throw new Error("Revision history section not found in readme");
-  readme.shift();
-  var end_of_history = readme.length;
-  for(var i=0; i= 0) { end_of_history=i; break; }
-  if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
-  // remove empty lines, splitters
-  while(readme.length >= end_of_history) readme.pop();
-  for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
-  readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
-  // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
-  for(var i=readme.length-1; i>0; --i) {
-    var line = readme[i].replace(/^\s+/,"");
-    if(line.search(/^[\[\-]/) < 0) {
-      readme[i-1] += " " + line;
-      readme[i] = "";
-    }
-  }
-  readme = readme.filter(function(a){return a!="";});
-  // Condense log entries sepatated with newlines to one line for each version
-  for(var i=readme.length-1; i>0; --i) {
-    var line = readme[i].replace(/^\s+/,"");
-    if(line.search(/^-/) < 0) {
-      readme[i-1] += "\n" + line;
-      readme[i] = "";
-    }
-  }
-  readme = readme.filter(function(a){return a!="";});
-  // Separate versions.
-  var history = {};
-  for(var i in readme) {
-    var line = readme[i].replace(/^[\sv-]+/g,"").trim();
-    var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
-    var txt = line.substr(line.search(" ")).trim();
-    if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
-    history[ver] = txt;
-  }
-  return history;
-}
-
-var history = read_history();
-var latest_release = "";
-var latest_beta = "";
-for(var ver in history) { latest_beta=ver; break; }
-for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
-
-var update_json = {
-  homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
-  "1.12.2": history,
-  promos: {
-    "1.12.2-recommended": latest_release,
-    "1.12.2-latest": latest_beta,
-  }
-}
-
-fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
diff --git a/tasks.js b/tasks.js
new file mode 100644
index 0000000..95bd238
--- /dev/null
+++ b/tasks.js
@@ -0,0 +1,50 @@
+"use strict";
+const main_repo_local = fs.realpath("../engineersdecor-github");
+if(!fs.chdir(fs.dirname(fs.realpath(sys.script)))) throw new Error("Failed to switch to mod repository base directory.");
+if(!fs.isdir(".git")) throw new Error("Missing git repository in mod repository base directory.");
+var tasks = {};
+
+tasks["update-json"] = function() {
+  const root_dir = fs.realpath(fs.dirname(sys.script));
+  var update_jsons = {
+    "1.12.2": JSON.parse(fs.readfile(root_dir + "/1.12/meta/update.json")),
+    "1.13.2": JSON.parse(fs.readfile(root_dir + "/1.13/meta/update.json"))
+  };
+  var update_json = {
+    homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
+    "1.12.2": update_jsons["1.12.2"]["1.12.2"],
+    "1.13.2": update_jsons["1.13.2"]["1.13.2"],
+    promos: {
+      "1.12.2-recommended": update_jsons["1.12.2"]["promos"]["1.12.2-recommended"],
+      "1.12.2-latest": update_jsons["1.12.2"]["promos"]["1.12.2-latest"],
+      "1.13.2-recommended": update_jsons["1.13.2"]["promos"]["1.13.2-recommended"],
+      "1.13.2-latest": update_jsons["1.13.2"]["promos"]["1.13.2-latest"],
+    }
+  }
+  fs.mkdir(root_dir + "/meta");
+  fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));
+};
+
+tasks["sync-main-repository"] = function() {
+  if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory.");
+  const test_repo_local = fs.cwd();
+  if(main_repo_local == "") throw new Error("Main repository (real) path not found.");
+  if(fs.realpath(main_repo_local) == fs.realpath(test_repo_local)) throw new Error("This is already the main repository");
+  if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
+  if(fs.cwd().search("-github") < 0) throw new Error("Main repository is missing the '*-github' tag in the path name.");
+  // sys.shell("rm -rf build documentation gradle meta scripts src")
+  // sys.shell("rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md")
+  // if((!fs.chdir(test_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to local dev directory.");
+  // sys.shell("cp -r documentation gradle meta scripts src " + main_repo_local + "/")
+  // sys.shell("cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md " + main_repo_local + "/")
+  // if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory.");
+  // print(sys.shell("git status -s"))
+};
+
+const task_name = sys.args[0];
+if((task_name===undefined) || (tasks[task_name])===undefined) {
+  alert("No task ", task_name);
+  exit(1);
+} else {
+  tasks[task_name]();
+}