--- a/net/minecraft/client/gui/screen/Screen.java
+++ b/net/minecraft/client/gui/screen/Screen.java
@@ -113,7 +113,10 @@
    }
 
    protected void func_230457_a_(MatrixStack p_230457_1_, ItemStack p_230457_2_, int p_230457_3_, int p_230457_4_) {
-      this.func_243308_b(p_230457_1_, this.func_231151_a_(p_230457_2_), p_230457_3_, p_230457_4_);
+      FontRenderer font = p_230457_2_.func_77973_b().getFontRenderer(p_230457_2_);
+      net.minecraftforge.fml.client.gui.GuiUtils.preItemToolTip(p_230457_2_);
+      this.renderWrappedToolTip(p_230457_1_, this.func_231151_a_(p_230457_2_), p_230457_3_, p_230457_4_, (font == null ? this.field_230712_o_ : font));
+      net.minecraftforge.fml.client.gui.GuiUtils.postItemToolTip();
    }
 
    public List<ITextComponent> func_231151_a_(ItemStack p_231151_1_) {
@@ -121,14 +124,20 @@
    }
 
    public void func_238652_a_(MatrixStack p_238652_1_, ITextComponent p_238652_2_, int p_238652_3_, int p_238652_4_) {
-      this.func_238654_b_(p_238652_1_, Arrays.asList(p_238652_2_.func_241878_f()), p_238652_3_, p_238652_4_);
+      this.func_243308_b(p_238652_1_, Arrays.asList(p_238652_2_), p_238652_3_, p_238652_4_);
    }
 
    public void func_243308_b(MatrixStack p_243308_1_, List<ITextComponent> p_243308_2_, int p_243308_3_, int p_243308_4_) {
-      this.func_238654_b_(p_243308_1_, Lists.transform(p_243308_2_, ITextComponent::func_241878_f), p_243308_3_, p_243308_4_);
+      this.renderWrappedToolTip(p_243308_1_, p_243308_2_, p_243308_3_, p_243308_4_, field_230712_o_);
    }
+   public void renderWrappedToolTip(MatrixStack matrixStack, List<? extends net.minecraft.util.text.ITextProperties> tooltips, int mouseX, int mouseY, FontRenderer font) {
+      net.minecraftforge.fml.client.gui.GuiUtils.drawHoveringText(matrixStack, tooltips, mouseX, mouseY, field_230708_k_, field_230709_l_, -1, font);
+   }
 
    public void func_238654_b_(MatrixStack p_238654_1_, List<? extends IReorderingProcessor> p_238654_2_, int p_238654_3_, int p_238654_4_) {
+      this.renderToolTip(p_238654_1_, p_238654_2_, p_238654_3_, p_238654_4_, field_230712_o_);
+   }
+   public void renderToolTip(MatrixStack p_238654_1_, List<? extends IReorderingProcessor> p_238654_2_, int p_238654_3_, int p_238654_4_, FontRenderer font) {
       if (!p_238654_2_.isEmpty()) {
          int i = 0;
 
@@ -289,9 +298,12 @@
    }
 
    public void func_231159_b_(String p_231159_1_, boolean p_231159_2_) {
+      p_231159_1_ = net.minecraftforge.event.ForgeEventFactory.onClientSendMessage(p_231159_1_);
+      if (p_231159_1_.isEmpty()) return;
       if (p_231159_2_) {
          this.field_230706_i_.field_71456_v.func_146158_b().func_146239_a(p_231159_1_);
       }
+      //if (net.minecraftforge.client.ClientCommandHandler.instance.executeCommand(mc.player, msg) != 0) return; //Forge: TODO Client command re-write
 
       this.field_230706_i_.field_71439_g.func_71165_d(p_231159_1_);
    }
@@ -302,10 +314,17 @@
       this.field_230712_o_ = p_231158_1_.field_71466_p;
       this.field_230708_k_ = p_231158_2_;
       this.field_230709_l_ = p_231158_3_;
+      java.util.function.Consumer<Widget> remove = (b) -> {
+         field_230710_m_.remove(b);
+         field_230705_e_.remove(b);
+      };
+      if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent.Pre(this, this.field_230710_m_, this::func_230480_a_, remove))) {
       this.field_230710_m_.clear();
       this.field_230705_e_.clear();
       this.func_231035_a_((IGuiEventListener)null);
       this.func_231160_c_();
+      }
+      net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent.Post(this, this.field_230710_m_, this::func_230480_a_, remove));
    }
 
    public List<? extends IGuiEventListener> func_231039_at__() {
@@ -328,6 +347,7 @@
    public void func_238651_a_(MatrixStack p_238651_1_, int p_238651_2_) {
       if (this.field_230706_i_.field_71441_e != null) {
          this.func_238468_a_(p_238651_1_, 0, 0, this.field_230708_k_, this.field_230709_l_, -1072689136, -804253680);
+         net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.GuiScreenEvent.BackgroundDrawnEvent(this, p_238651_1_));
       } else {
          this.func_231165_f_(p_238651_2_);
       }
@@ -346,6 +366,7 @@
       bufferbuilder.func_225582_a_((double)this.field_230708_k_, 0.0D, 0.0D).func_225583_a_((float)this.field_230708_k_ / 32.0F, (float)p_231165_1_).func_225586_a_(64, 64, 64, 255).func_181675_d();
       bufferbuilder.func_225582_a_(0.0D, 0.0D, 0.0D).func_225583_a_(0.0F, (float)p_231165_1_).func_225586_a_(64, 64, 64, 255).func_181675_d();
       tessellator.func_78381_a();
+      net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.GuiScreenEvent.BackgroundDrawnEvent(this, new MatrixStack()));
    }
 
    public boolean func_231177_au__() {
@@ -432,4 +453,8 @@
 
    public void func_230476_a_(List<Path> p_230476_1_) {
    }
+
+   public Minecraft getMinecraft() {
+      return this.field_230706_i_;
+   }
 }
