diff --git a/src/main/java/net/minecraft/server/BlockButtonAbstract.java b/src/main/java/net/minecraft/server/BlockButtonAbstract.java
index b8f62e5b9f..bdc48ffd43 100644
--- a/src/main/java/net/minecraft/server/BlockButtonAbstract.java
+++ b/src/main/java/net/minecraft/server/BlockButtonAbstract.java
@@ -238,15 +238,6 @@ public abstract class BlockButtonAbstract extends Block {
         if (!world.isStatic) {
             if (this.a) {
                 if ((world.getData(i, j, k) & 8) == 0) {
-                    // CraftBukkit start - Call interaction when entities (currently arrows) hit wooden buttons
-                    EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k));
-                    world.getServer().getPluginManager().callEvent(event);
-
-                    if (event.isCancelled()) {
-                        return;
-                    }
-                    // CraftBukkit end
-
                     this.n(world, i, j, k);
                 }
             }
@@ -262,6 +253,30 @@ public abstract class BlockButtonAbstract extends Block {
         List list = world.a(EntityArrow.class, AxisAlignedBB.a().a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ));
         boolean flag1 = !list.isEmpty();
 
+        // CraftBukkit start - Call interact event when arrows turn on wooden buttons
+        if (flag != flag1 && flag1) {
+            org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k);
+            boolean allowed = false;
+
+            // If all of the events are cancelled block the button press, else allow
+            for (Object object : list) {
+                if (object != null) {
+                    EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
+                    world.getServer().getPluginManager().callEvent(event);
+
+                    if (!event.isCancelled()) {
+                        allowed = true;
+                        break;
+                    }
+                }
+            }
+
+            if (!allowed) {
+                return;
+            }
+        }
+        // CraftBukkit end
+
         if (flag1 && !flag) {
             world.setData(i, j, k, i1 | 8, 3);
             this.d(world, i, j, k, i1);
diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java
index ba7b66053b..3b9de8a7b0 100644
--- a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java
+++ b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java
@@ -43,7 +43,7 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract {
             while (iterator.hasNext()) {
                 Entity entity = (Entity) iterator.next();
 
-                // CraftBukkit start
+                // CraftBukkit start - Fire interact event when turning on a pressure plate
                 org.bukkit.World bworld = world.getWorld();
                 org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
                 org.bukkit.event.Cancellable cancellable;
@@ -55,8 +55,9 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract {
                     manager.callEvent((EntityInteractEvent) cancellable);
                 }
 
+                // We only want to block turning the plate on if all events are cancelled
                 if (cancellable.isCancelled()) {
-                    return 0;
+                    continue;
                 }
                 // CraftBukkit end
 
diff --git a/src/main/java/net/minecraft/server/BlockTripwire.java b/src/main/java/net/minecraft/server/BlockTripwire.java
index 520b4e3efa..f020300f7f 100644
--- a/src/main/java/net/minecraft/server/BlockTripwire.java
+++ b/src/main/java/net/minecraft/server/BlockTripwire.java
@@ -147,31 +147,37 @@ public class BlockTripwire extends Block {
             }
         }
 
-        // CraftBukkit start
-        org.bukkit.World bworld = world.getWorld();
-        org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
+        // CraftBukkit start - Call interact even when triggering connected tripwire
+        if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) {
+            org.bukkit.World bworld = world.getWorld();
+            org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
+            org.bukkit.block.Block block = bworld.getBlockAt(i, j, k);
+            boolean allowed = false;
 
-        if (flag != flag1) {
-            if (flag1) {
-                for (Object object : list) {
-                    if (object != null) {
-                        org.bukkit.event.Cancellable cancellable;
+            // If all of the events are cancelled block the tripwire trigger, else allow
+            for (Object object : list) {
+                if (object != null) {
+                    org.bukkit.event.Cancellable cancellable;
 
-                        if (object instanceof EntityHuman) {
-                            cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null);
-                        } else if (object instanceof Entity) {
-                            cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), bworld.getBlockAt(i, j, k));
-                            manager.callEvent((EntityInteractEvent) cancellable);
-                        } else {
-                            continue;
-                        }
+                    if (object instanceof EntityHuman) {
+                        cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null);
+                    } else if (object instanceof Entity) {
+                        cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
+                        manager.callEvent((EntityInteractEvent) cancellable);
+                    } else {
+                        continue;
+                    }
 
-                        if (cancellable.isCancelled()) {
-                            return;
-                        }
+                    if (!cancellable.isCancelled()) {
+                        allowed = true;
+                        break;
                     }
                 }
             }
+
+            if (!allowed) {
+                return;
+            }
         }
         // CraftBukkit end