diff --git a/modules/v1_8_R3/pom.xml b/modules/v1_8_R3/pom.xml
new file mode 100644
index 00000000..b80de6a9
--- /dev/null
+++ b/modules/v1_8_R3/pom.xml
@@ -0,0 +1,96 @@
+
+
+
+ 4.0.0
+
+ EchoPet-v1_8_R3
+ EchoPet for v1_8_R3
+ v2
+ jar
+
+
+ UTF-8
+
+
+
+ com.dsh105
+ EchoPet-Parent
+ v2
+ ../../
+
+
+
+
+ org.bukkit
+ bukkit
+ 1.8.4-R0.1-SNAPSHOT
+ jar
+
+
+ org.bukkit
+ craftbukkit
+ 1.8.4-R0.1-SNAPSHOT
+ jar
+
+
+ com.dsh105
+ EchoPet-API
+ v2
+
+
+ org.bukkit
+ craftbukkit
+
+
+
+
+
+
+ ../../target
+ src/main/java/
+ ${project.name}
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+ maven-clean-plugin
+
+ true
+
+
+ target
+
+ **/*
+
+
+
+
+ 2.5
+
+
+
+
diff --git a/modules/v1_8_R3/src/main/java/com/dsh105/echopet/compat/nms/v1_8_R3/NMSEntityUtil.java b/modules/v1_8_R3/src/main/java/com/dsh105/echopet/compat/nms/v1_8_R3/NMSEntityUtil.java
new file mode 100644
index 00000000..86c573f8
--- /dev/null
+++ b/modules/v1_8_R3/src/main/java/com/dsh105/echopet/compat/nms/v1_8_R3/NMSEntityUtil.java
@@ -0,0 +1,176 @@
+/*
+ * This file is part of EchoPet.
+ *
+ * EchoPet is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * EchoPet is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with EchoPet. If not, see .
+ */
+
+package com.dsh105.echopet.compat.nms.v1_8_R3;
+
+import com.captainbern.minecraft.reflection.MinecraftReflection;
+import com.captainbern.reflection.ClassTemplate;
+import com.captainbern.reflection.Reflection;
+import com.captainbern.reflection.SafeField;
+import com.captainbern.reflection.SafeMethod;
+import com.captainbern.reflection.accessor.FieldAccessor;
+import com.captainbern.reflection.accessor.MethodAccessor;
+import net.minecraft.server.v1_8_R3.*;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity;
+import org.bukkit.entity.LivingEntity;
+
+import java.util.List;
+
+import static com.captainbern.reflection.matcher.Matchers.withArguments;
+import static com.captainbern.reflection.matcher.Matchers.withType;
+
+/*
+ * From EntityAPI :)
+ */
+
+public class NMSEntityUtil {
+
+ public static NavigationAbstract getNavigation(LivingEntity livingEntity) {
+ if (livingEntity instanceof CraftLivingEntity) {
+ return getNavigation(((CraftLivingEntity) livingEntity).getHandle());
+ }
+ return null;
+ }
+
+ public static NavigationAbstract getNavigation(EntityLiving entityLiving) {
+ if (entityLiving instanceof EntityInsentient) {
+ return ((EntityInsentient) entityLiving).getNavigation();
+ }
+ return null;
+ }
+
+ public static EntitySenses getEntitySenses(LivingEntity livingEntity) {
+ if (livingEntity instanceof CraftLivingEntity) {
+ return getEntitySenses(((CraftLivingEntity) livingEntity).getHandle());
+ }
+ return null;
+ }
+
+ public static EntitySenses getEntitySenses(EntityLiving entityLiving) {
+ if (entityLiving instanceof EntityInsentient) {
+ return ((EntityInsentient) entityLiving).getEntitySenses();
+ }
+ return null;
+ }
+
+ public static ControllerJump getControllerJump(LivingEntity livingEntity) {
+ if (livingEntity instanceof CraftLivingEntity) {
+ return getControllerJump(((CraftLivingEntity) livingEntity).getHandle());
+ }
+ return null;
+ }
+
+ public static ControllerJump getControllerJump(EntityLiving entityLiving) {
+ if (entityLiving instanceof EntityInsentient) {
+ return ((EntityInsentient) entityLiving).getControllerJump();
+ }
+ return null;
+ }
+
+ public static ControllerMove getControllerMove(LivingEntity livingEntity) {
+ if (livingEntity instanceof CraftLivingEntity) {
+ return getControllerMove(((CraftLivingEntity) livingEntity).getHandle());
+ }
+ return null;
+ }
+
+ public static ControllerMove getControllerMove(EntityLiving entityLiving) {
+ if (entityLiving instanceof EntityInsentient) {
+ return ((EntityInsentient) entityLiving).getControllerMove();
+ }
+ return null;
+ }
+
+ public static ControllerLook getControllerLook(LivingEntity livingEntity) {
+ if (livingEntity instanceof CraftLivingEntity) {
+ return getControllerLook(((CraftLivingEntity) livingEntity).getHandle());
+ }
+ return null;
+ }
+
+ public static ControllerLook getControllerLook(EntityLiving entityLiving) {
+ if (entityLiving instanceof EntityInsentient) {
+ return ((EntityInsentient) entityLiving).getControllerLook();
+ }
+ return null;
+ }
+
+ public static boolean isInGuardedAreaOf(EntityLiving entityLiving, int x, int y, int z) {
+ // TODO: not used currently
+ return false;
+ /*if (entityLiving instanceof EntityCreature) {
+ return ((EntityCreature) entityLiving).d(new BlockPosition(x, y, z));
+ } else {
+ return false;
+ }*/
+ }
+
+ /*
+ * Hacky stuff to get around doTick() becoming final
+ */
+
+ protected static FieldAccessor GOALS;
+ protected static FieldAccessor ACTIVE_GOALS;
+
+ protected static MethodAccessor ADD_GOAL;
+
+ protected static FieldAccessor