diff --git a/paper-api/src/main/java/org/bukkit/entity/AbstractArrow.java b/paper-api/src/main/java/org/bukkit/entity/AbstractArrow.java
new file mode 100644
index 000000000..4460f6c9e
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/AbstractArrow.java
@@ -0,0 +1,114 @@
+package org.bukkit.entity;
+
+import org.bukkit.block.Block;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Represents an arrow.
+ */
+public interface AbstractArrow extends Projectile {
+
+ /**
+ * Gets the knockback strength for an arrow, which is the
+ * {@link org.bukkit.enchantments.Enchantment#KNOCKBACK KnockBack} level
+ * of the bow that shot it.
+ *
+ * @return the knockback strength value
+ */
+ public int getKnockbackStrength();
+
+ /**
+ * Sets the knockback strength for an arrow.
+ *
+ * @param knockbackStrength the knockback strength value
+ */
+ public void setKnockbackStrength(int knockbackStrength);
+
+ /**
+ * Gets the base amount of damage this arrow will do.
+ *
+ * Defaults to 2.0 for a normal arrow with
+ * 0.5 * (1 + power level) added for arrows fired from
+ * enchanted bows.
+ *
+ * @return base damage amount
+ */
+ public double getDamage();
+
+ /**
+ * Sets the base amount of damage this arrow will do.
+ *
+ * @param damage new damage amount
+ */
+ public void setDamage(double damage);
+
+ /**
+ * Gets whether this arrow is critical.
+ *
+ * Critical arrows have increased damage and cause particle effects. + *
+ * Critical arrows generally occur when a player fully draws a bow before + * firing. + * + * @return true if it is critical + */ + public boolean isCritical(); + + /** + * Sets whether or not this arrow should be critical. + * + * @param critical whether or not it should be critical + */ + public void setCritical(boolean critical); + + /** + * Gets whether this arrow is in a block or not. + *
+ * Arrows in a block are motionless and may be picked up by players.
+ *
+ * @return true if in a block
+ */
+ public boolean isInBlock();
+
+ /**
+ * Gets the block to which this arrow is attached.
+ *
+ * @return the attached block or null if not attached
+ */
+ @Nullable
+ public Block getAttachedBlock();
+
+ /**
+ * Gets the current pickup status of this arrow.
+ *
+ * @return the pickup status of this arrow.
+ */
+ @NotNull
+ public PickupStatus getPickupStatus();
+
+ /**
+ * Sets the current pickup status of this arrow.
+ *
+ * @param status new pickup status of this arrow.
+ */
+ public void setPickupStatus(@NotNull PickupStatus status);
+
+ /**
+ * Represents the pickup status of this arrow.
+ */
+ public enum PickupStatus {
+ /**
+ * The arrow cannot be picked up.
+ */
+ DISALLOWED,
+ /**
+ * The arrow can be picked up.
+ */
+ ALLOWED,
+ /**
+ * The arrow can only be picked up by players in creative mode.
+ */
+ CREATIVE_ONLY
+ }
+}
diff --git a/paper-api/src/main/java/org/bukkit/entity/Arrow.java b/paper-api/src/main/java/org/bukkit/entity/Arrow.java
index ef6e348b5..ec8443b67 100644
--- a/paper-api/src/main/java/org/bukkit/entity/Arrow.java
+++ b/paper-api/src/main/java/org/bukkit/entity/Arrow.java
@@ -1,114 +1,97 @@
package org.bukkit.entity;
-import org.bukkit.block.Block;
+import java.util.List;
+import org.bukkit.Color;
+import org.bukkit.potion.PotionData;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-/**
- * Represents an arrow.
- */
-public interface Arrow extends Projectile {
+public interface Arrow extends AbstractArrow {
/**
- * Gets the knockback strength for an arrow, which is the
- * {@link org.bukkit.enchantments.Enchantment#KNOCKBACK KnockBack} level
- * of the bow that shot it.
+ * Sets the underlying potion data
*
- * @return the knockback strength value
+ * @param data PotionData to set the base potion state to
*/
- public int getKnockbackStrength();
+ void setBasePotionData(@NotNull PotionData data);
/**
- * Sets the knockback strength for an arrow.
+ * Returns the potion data about the base potion
*
- * @param knockbackStrength the knockback strength value
- */
- public void setKnockbackStrength(int knockbackStrength);
-
- /**
- * Gets the base amount of damage this arrow will do.
- *
- * Defaults to 2.0 for a normal arrow with
- * 0.5 * (1 + power level) added for arrows fired from
- * enchanted bows.
- *
- * @return base damage amount
- */
- public double getDamage();
-
- /**
- * Sets the base amount of damage this arrow will do.
- *
- * @param damage new damage amount
- */
- public void setDamage(double damage);
-
- /**
- * Gets whether this arrow is critical.
- *
- * Critical arrows have increased damage and cause particle effects. - *
- * Critical arrows generally occur when a player fully draws a bow before - * firing. - * - * @return true if it is critical - */ - public boolean isCritical(); - - /** - * Sets whether or not this arrow should be critical. - * - * @param critical whether or not it should be critical - */ - public void setCritical(boolean critical); - - /** - * Gets whether this arrow is in a block or not. - *
- * Arrows in a block are motionless and may be picked up by players. - * - * @return true if in a block - */ - public boolean isInBlock(); - - /** - * Gets the block to which this arrow is attached. - * - * @return the attached block or null if not attached - */ - @Nullable - public Block getAttachedBlock(); - - /** - * Gets the current pickup status of this arrow. - * - * @return the pickup status of this arrow. + * @return a PotionData object */ @NotNull - public PickupStatus getPickupStatus(); + PotionData getBasePotionData(); /** - * Sets the current pickup status of this arrow. + * Gets the color of this arrow. * - * @param status new pickup status of this arrow. + * @return arrow color */ - public void setPickupStatus(@NotNull PickupStatus status); + @NotNull + Color getColor(); /** - * Represents the pickup status of this arrow. + * Sets the color of this arrow. Will be applied as a tint to its particles. + * + * @param color arrow color */ - public enum PickupStatus { - /** - * The arrow cannot be picked up. - */ - DISALLOWED, - /** - * The arrow can be picked up. - */ - ALLOWED, - /** - * The arrow can only be picked up by players in creative mode. - */ - CREATIVE_ONLY - } + void setColor(@NotNull Color color); + + /** + * Checks for the presence of custom potion effects. + * + * @return true if custom potion effects are applied + */ + boolean hasCustomEffects(); + + /** + * Gets an immutable list containing all custom potion effects applied to + * this arrow. + *
+ * Plugins should check that hasCustomEffects() returns true before calling
+ * this method.
+ *
+ * @return the immutable list of custom potion effects
+ */
+ @NotNull
+ List
- * Plugins should check that hasCustomEffects() returns true before calling
- * this method.
- *
- * @return the immutable list of custom potion effects
- */
- @NotNull
- List