diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
index 47928e6..4fae9cf 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
@@ -127,7 +127,7 @@ public class ZNpcsPlus extends JavaPlugin {
 
         ConfigManager configManager = new ConfigManager(getDataFolder());
         MojangSkinCache skinCache = new MojangSkinCache(configManager);
-        EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache);
+        EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache, configManager);
         PacketFactory packetFactory = setupPacketFactory(scheduler, propertyRegistry);
         propertyRegistry.registerTypes(packetFactory);
 
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
index d3cd5ce..eaaea72 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
@@ -10,6 +10,7 @@ import com.github.retrooper.packetevents.protocol.player.EquipmentSlot;
 import lol.pyr.znpcsplus.api.entity.EntityProperty;
 import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
 import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
+import lol.pyr.znpcsplus.config.ConfigManager;
 import lol.pyr.znpcsplus.entity.properties.*;
 import lol.pyr.znpcsplus.entity.properties.villager.VillagerLevelProperty;
 import lol.pyr.znpcsplus.entity.properties.villager.VillagerProfessionProperty;
@@ -42,8 +43,9 @@ import java.util.stream.Collectors;
 public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
     private final Map<Class<?>, PropertySerializer<?>> serializerMap = new HashMap<>();
     private final Map<String, EntityPropertyImpl<?>> byName = new HashMap<>();
+    private final ConfigManager configManager;
 
-    public EntityPropertyRegistryImpl(MojangSkinCache skinCache) {
+    public EntityPropertyRegistryImpl(MojangSkinCache skinCache, ConfigManager configManager) {
         registerSerializer(new ComponentPropertySerializer());
         registerSerializer(new NamedTextColorPropertySerializer());
         registerSerializer(new SkinDescriptorSerializer(skinCache));
@@ -77,6 +79,8 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
 
         registerPrimitiveSerializers(Integer.class, Boolean.class, Double.class, Float.class, Long.class, Short.class, Byte.class, String.class);
 
+        this.configManager = configManager;
+
         /*
         registerType("using_item", false); // TODO: fix it for 1.8 and add new property to use offhand item and riptide animation
 
@@ -144,6 +148,9 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
         register(new DinnerboneProperty(legacyNames, optionalComponents));
 
         register(new DummyProperty<>("look", LookType.FIXED));
+        register(new DummyProperty<>("look_distance", configManager.getConfig().lookPropertyDistance()));
+        register(new DummyProperty<>("view_distance", configManager.getConfig().viewDistance()));
+
         register(new GlowProperty(packetFactory));
         register(new BitsetProperty("fire", 0, 0x01));
         register(new BitsetProperty("invisible", 0, 0x20));
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java
index 3bc2af7..259341c 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeImpl.java
@@ -110,7 +110,7 @@ public class NpcTypeImpl implements NpcType {
 
         public NpcTypeImpl build() {
             ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion();
-            addProperties("fire", "invisible", "silent", "look",
+            addProperties("fire", "invisible", "silent", "look", "look_distance", "view_distance",
                     "potion_color", "potion_ambient", "dinnerbone");
             // TODO: make this look nicer after completing the rest of the properties
             if (version.isNewerThanOrEquals(ServerVersion.V_1_9)) addProperties("glow");
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java
index 5576028..2f45c55 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java
@@ -27,9 +27,10 @@ public class NpcProcessorTask extends BukkitRunnable {
     }
 
     public void run() {
-        double distSq = NumberConversions.square(configManager.getConfig().viewDistance());
-        double lookPropertyDistSq = NumberConversions.square(configManager.getConfig().lookPropertyDistance());
+        EntityPropertyImpl<Integer> viewDistanceProperty = propertyRegistry.getByName("view_distance", Integer.class); // Not sure why this is an Integer, but it is
         EntityPropertyImpl<LookType> lookProperty = propertyRegistry.getByName("look", LookType.class);
+        EntityPropertyImpl<Double> lookDistanceProperty = propertyRegistry.getByName("look_distance", Double.class);
+        double lookDistance;
         for (NpcEntryImpl entry : npcRegistry.getProcessable()) {
             NpcImpl npc = entry.getNpc();
             if (!npc.isEnabled()) continue;
@@ -37,6 +38,7 @@ public class NpcProcessorTask extends BukkitRunnable {
             double closestDist = Double.MAX_VALUE;
             Player closest = null;
             LookType lookType = npc.getProperty(lookProperty);
+            lookDistance =  NumberConversions.square(npc.getProperty(lookDistanceProperty));
             for (Player player : Bukkit.getOnlinePlayers()) {
                 if (!player.getWorld().equals(npc.getWorld())) {
                     if (npc.isVisibleTo(player)) npc.hide(player);
@@ -45,7 +47,7 @@ public class NpcProcessorTask extends BukkitRunnable {
                 double distance = player.getLocation().distanceSquared(npc.getBukkitLocation());
 
                 // visibility
-                boolean inRange = distance <= distSq;
+                boolean inRange = distance <= NumberConversions.square(npc.getProperty(viewDistanceProperty));
                 if (!inRange && npc.isVisibleTo(player)) {
                     NpcDespawnEvent event = new NpcDespawnEvent(player, entry);
                     Bukkit.getPluginManager().callEvent(event);
@@ -62,7 +64,7 @@ public class NpcProcessorTask extends BukkitRunnable {
                         closestDist = distance;
                         closest = player;
                     }
-                    if (lookType.equals(LookType.PER_PLAYER) && lookPropertyDistSq >= distance) {
+                    if (lookType.equals(LookType.PER_PLAYER) && lookDistance >= distance) {
                         NpcLocation expected = npc.getLocation().lookingAt(player.getLocation().add(0, -npc.getType().getHologramOffset(), 0));
                         if (!expected.equals(npc.getLocation())) npc.setHeadRotation(player, expected.getYaw(), expected.getPitch());
                     }
@@ -70,7 +72,7 @@ public class NpcProcessorTask extends BukkitRunnable {
             }
             // look property
             if (lookType.equals(LookType.CLOSEST_PLAYER)) {
-                if (closest != null && lookPropertyDistSq >= closestDist) {
+                if (closest != null && lookDistance >= closestDist) {
                     NpcLocation expected = npc.getLocation().lookingAt(closest.getLocation().add(0, -npc.getType().getHologramOffset(), 0));
                     if (!expected.equals(npc.getLocation())) npc.setHeadRotation(expected.getYaw(), expected.getPitch());
                 }