diff --git a/core/assets-raw/sprites/blocks/distribution/cross-full.png b/core/assets-raw/sprites/blocks/distribution/cross-full.png
new file mode 100644
index 0000000000..916e18cfd2
Binary files /dev/null and b/core/assets-raw/sprites/blocks/distribution/cross-full.png differ
diff --git a/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png
index e023e20061..47e4ed20c9 100644
Binary files a/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png and b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png differ
diff --git a/core/assets-raw/sprites/blocks/distribution/sorter.png b/core/assets-raw/sprites/blocks/distribution/sorter.png
index a4c8b37e59..8bbe0fb50a 100644
Binary files a/core/assets-raw/sprites/blocks/distribution/sorter.png and b/core/assets-raw/sprites/blocks/distribution/sorter.png differ
diff --git a/core/assets-raw/sprites/blocks/production/disassembler-bottom.png b/core/assets-raw/sprites/blocks/production/disassembler-bottom.png
new file mode 100644
index 0000000000..7337b1d716
Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/disassembler-bottom.png differ
diff --git a/core/assets-raw/sprites/blocks/production/disassembler-liquid.png b/core/assets-raw/sprites/blocks/production/disassembler-liquid.png
deleted file mode 100644
index 88006fc498..0000000000
Binary files a/core/assets-raw/sprites/blocks/production/disassembler-liquid.png and /dev/null differ
diff --git a/core/assets-raw/sprites/blocks/production/disassembler-spinner.png b/core/assets-raw/sprites/blocks/production/disassembler-spinner.png
index 8a7c2bd606..63758c0e82 100644
Binary files a/core/assets-raw/sprites/blocks/production/disassembler-spinner.png and b/core/assets-raw/sprites/blocks/production/disassembler-spinner.png differ
diff --git a/core/assets-raw/sprites/blocks/production/disassembler.png b/core/assets-raw/sprites/blocks/production/disassembler.png
index 4e4a4d3433..b99ebbd598 100644
Binary files a/core/assets-raw/sprites/blocks/production/disassembler.png and b/core/assets-raw/sprites/blocks/production/disassembler.png differ
diff --git a/core/assets-raw/sprites/blocks/production/melter-bottom.png b/core/assets-raw/sprites/blocks/production/melter-bottom.png
new file mode 100644
index 0000000000..a2dd7b5e0c
Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/melter-bottom.png differ
diff --git a/core/assets-raw/sprites/blocks/production/melter-liquid.png b/core/assets-raw/sprites/blocks/production/melter-liquid.png
deleted file mode 100644
index 19d66fa18a..0000000000
Binary files a/core/assets-raw/sprites/blocks/production/melter-liquid.png and /dev/null differ
diff --git a/core/assets-raw/sprites/blocks/production/melter.png b/core/assets-raw/sprites/blocks/production/melter.png
index 304f7119a5..90e833e2f5 100644
Binary files a/core/assets-raw/sprites/blocks/production/melter.png and b/core/assets-raw/sprites/blocks/production/melter.png differ
diff --git a/core/assets-raw/sprites/blocks/production/separator-bottom.png b/core/assets-raw/sprites/blocks/production/separator-bottom.png
new file mode 100644
index 0000000000..a100086fe3
Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/separator-bottom.png differ
diff --git a/core/assets-raw/sprites/blocks/production/separator-liquid.png b/core/assets-raw/sprites/blocks/production/separator-liquid.png
deleted file mode 100644
index 0f81574062..0000000000
Binary files a/core/assets-raw/sprites/blocks/production/separator-liquid.png and /dev/null differ
diff --git a/core/assets-raw/sprites/blocks/production/separator-spinner.png b/core/assets-raw/sprites/blocks/production/separator-spinner.png
index e09e119c3d..310c92c020 100644
Binary files a/core/assets-raw/sprites/blocks/production/separator-spinner.png and b/core/assets-raw/sprites/blocks/production/separator-spinner.png differ
diff --git a/core/assets-raw/sprites/blocks/production/separator.png b/core/assets-raw/sprites/blocks/production/separator.png
index cefbb02633..20c9e6b72f 100644
Binary files a/core/assets-raw/sprites/blocks/production/separator.png and b/core/assets-raw/sprites/blocks/production/separator.png differ
diff --git a/core/assets-raw/sprites/blocks/sandbox/item-source.png b/core/assets-raw/sprites/blocks/sandbox/item-source.png
index 98dc16ac3c..21c254cba5 100644
Binary files a/core/assets-raw/sprites/blocks/sandbox/item-source.png and b/core/assets-raw/sprites/blocks/sandbox/item-source.png differ
diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java
index f306522c57..d087f4ae94 100644
--- a/core/src/mindustry/content/Blocks.java
+++ b/core/src/mindustry/content/Blocks.java
@@ -8,8 +8,8 @@ import mindustry.entities.*;
 import mindustry.entities.abilities.*;
 import mindustry.entities.bullet.*;
 import mindustry.entities.effect.*;
-import mindustry.entities.part.*;
 import mindustry.entities.part.DrawPart.*;
+import mindustry.entities.part.*;
 import mindustry.entities.pattern.*;
 import mindustry.gen.*;
 import mindustry.graphics.*;
@@ -1042,7 +1042,7 @@ public class Blocks{
 
             craftTime = 10f;
             hasLiquids = hasPower = true;
-            drawer = new DrawMulti(new DrawDefault(), new DrawLiquidRegion());
+            drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(), new DrawDefault());
 
             consumePower(1f);
             consumeItem(Items.scrap, 1);
@@ -1062,6 +1062,8 @@ public class Blocks{
 
             consumePower(1.1f);
             consumeLiquid(Liquids.slag, 4f / 60f);
+
+            drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(), new DrawRegion("-spinner", 3), new DrawDefault());
         }};
 
         disassembler = new Separator("disassembler"){{
@@ -1080,6 +1082,8 @@ public class Blocks{
             consumePower(4f);
             consumeItem(Items.scrap);
             consumeLiquid(Liquids.slag, 0.12f);
+
+            drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(), new DrawRegion("-spinner", 3), new DrawDefault());
         }};
 
         sporePress = new GenericCrafter("spore-press"){{
diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java
index b37195173c..a400ef8c20 100644
--- a/core/src/mindustry/world/blocks/distribution/Sorter.java
+++ b/core/src/mindustry/world/blocks/distribution/Sorter.java
@@ -1,5 +1,6 @@
 package mindustry.world.blocks.distribution;
 
+import arc.*;
 import arc.graphics.g2d.*;
 import arc.math.*;
 import arc.scene.ui.layout.*;
@@ -49,6 +50,11 @@ public class Sorter extends Block{
         return build == null || build.sortItem == null ? 0 : build.sortItem.color.rgba();
     }
 
+    @Override
+    protected TextureRegion[] icons(){
+        return new TextureRegion[]{Core.atlas.find("source-bottom"), region};
+    }
+
     public class SorterBuild extends Building{
         public @Nullable Item sortItem;
 
@@ -63,15 +69,16 @@ public class Sorter extends Block{
 
         @Override
         public void draw(){
-            super.draw();
 
             if(sortItem == null){
-                Draw.rect("cross", x, y);
+                Draw.rect("cross-full", x, y);
             }else{
                 Draw.color(sortItem.color);
-                Draw.rect("center", x, y);
+                Fill.square(x, y, tilesize/2f - 0.00001f);
                 Draw.color();
             }
+
+            super.draw();
         }
 
         @Override
diff --git a/core/src/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java
index 79d3741691..e4c2a2a146 100644
--- a/core/src/mindustry/world/blocks/production/Separator.java
+++ b/core/src/mindustry/world/blocks/production/Separator.java
@@ -1,17 +1,16 @@
 package mindustry.world.blocks.production;
 
-import arc.*;
 import arc.graphics.g2d.*;
 import arc.math.*;
 import arc.util.*;
 import arc.util.io.*;
-import mindustry.annotations.Annotations.*;
+import mindustry.entities.units.*;
 import mindustry.gen.*;
-import mindustry.graphics.*;
 import mindustry.logic.*;
 import mindustry.type.*;
 import mindustry.world.*;
 import mindustry.world.consumers.*;
+import mindustry.world.draw.*;
 import mindustry.world.meta.*;
 
 /**
@@ -23,9 +22,7 @@ public class Separator extends Block{
     public ItemStack[] results;
     public float craftTime;
 
-    public @Load("@-liquid") TextureRegion liquidRegion;
-    public @Load("@-spinner") TextureRegion spinnerRegion;
-    public float spinnerSpeed = 3f;
+    public DrawBlock drawer = new DrawDefault();
 
     public Separator(String name){
         super(name);
@@ -51,6 +48,23 @@ public class Separator extends Block{
         consItems = findConsumer(c -> c instanceof ConsumeItems);
     }
 
+    @Override
+    public void load(){
+        super.load();
+
+        drawer.load(this);
+    }
+
+    @Override
+    public void drawPlanRegion(BuildPlan plan, Eachable<BuildPlan> list){
+        drawer.drawPlan(this, plan, list);
+    }
+
+    @Override
+    public TextureRegion[] icons(){
+        return drawer.finalIcons(this);
+    }
+
     public class SeparatorBuild extends Building{
         public float progress;
         public float totalProgress;
@@ -79,6 +93,7 @@ public class Separator extends Block{
             return total < itemCapacity && enabled;
         }
 
+        /*
         @Override
         public void draw(){
             super.draw();
@@ -88,6 +103,32 @@ public class Separator extends Block{
             if(Core.atlas.isFound(spinnerRegion)){
                 Draw.rect(spinnerRegion, x, y, totalProgress * spinnerSpeed);
             }
+        }*/
+
+        @Override
+        public void draw(){
+            drawer.draw(this);
+        }
+
+        @Override
+        public void drawLight(){
+            super.drawLight();
+            drawer.drawLight(this);
+        }
+
+        @Override
+        public float warmup(){
+            return warmup;
+        }
+
+        @Override
+        public float progress(){
+            return progress;
+        }
+
+        @Override
+        public float totalProgress(){
+            return totalProgress;
         }
 
         @Override
diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java
index 06afbd3e66..0a7461a7ec 100644
--- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java
+++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java
@@ -1,5 +1,6 @@
 package mindustry.world.blocks.sandbox;
 
+import arc.*;
 import arc.graphics.g2d.*;
 import arc.scene.ui.layout.*;
 import arc.util.*;
@@ -45,6 +46,11 @@ public class ItemSource extends Block{
         stats.add(Stat.output, itemsPerSecond, StatUnit.itemsSecond);
     }
 
+    @Override
+    protected TextureRegion[] icons(){
+        return new TextureRegion[]{Core.atlas.find("source-bottom"), region};
+    }
+
     @Override
     public void drawPlanConfig(BuildPlan plan, Eachable<BuildPlan> list){
         drawPlanConfigCenter(plan, plan.config, "center", true);
@@ -61,15 +67,15 @@ public class ItemSource extends Block{
 
         @Override
         public void draw(){
-            super.draw();
-
             if(outputItem == null){
-                Draw.rect("cross", x, y);
+                Draw.rect("cross-full", x, y);
             }else{
                 Draw.color(outputItem.color);
-                Draw.rect("center", x, y);
+                Fill.square(x, y, tilesize/2f - 0.00001f);
                 Draw.color();
             }
+
+            super.draw();
         }
 
         @Override
diff --git a/core/src/mindustry/world/draw/DrawRegion.java b/core/src/mindustry/world/draw/DrawRegion.java
index 492310eafb..26416abaa5 100644
--- a/core/src/mindustry/world/draw/DrawRegion.java
+++ b/core/src/mindustry/world/draw/DrawRegion.java
@@ -21,6 +21,11 @@ public class DrawRegion extends DrawBlock{
         this.suffix = suffix;
     }
 
+    public DrawRegion(String suffix, float rotateSpeed){
+        this.suffix = suffix;
+        this.rotateSpeed = rotateSpeed;
+    }
+
     public DrawRegion(){
     }