diff --git a/utils/misc/src/main/java/org/onlab/packet/pim/PIMHelloOption.java b/utils/misc/src/main/java/org/onlab/packet/pim/PIMHelloOption.java
index 7d05d92..2372e1a 100644
--- a/utils/misc/src/main/java/org/onlab/packet/pim/PIMHelloOption.java
+++ b/utils/misc/src/main/java/org/onlab/packet/pim/PIMHelloOption.java
@@ -23,29 +23,43 @@
 import static org.onlab.packet.PacketUtils.checkBufferLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 
+/**
+ * PIM HELLO option.
+ */
 public class PIMHelloOption {
 
-    /**
+    /*
      * PIM Option types.
      */
     public static final short OPT_HOLDTIME = 1;
-    public static final short OPT_PRUNEDELAY = 2;
-    public static final short OPT_PRIORITY = 19;
-    public static final short OPT_GENID = 20;
-    public static final short OPT_ADDRLIST = 24;
-
+    public static final short HOLDTIME_LENGTH = 2;
     public static final short DEFAULT_HOLDTIME = 105;
-    public static final int DEFAULT_PRUNEDELAY = 2000; // 2,000 ms
+
+    public static final short OPT_PRUNEDELAY = 2;
+    public static final short PRUNEDELAY_LENGTH = 4;
+    public static final short DEFAULT_PRUNEDELAY = 500; // 500 ms
+    public static final short DEFAULT_OVERRIDEINTERVAL = 2500; // 2500 ms
+
+    public static final short OPT_PRIORITY = 19;
+    public static final short PRIORITY_LENGTH = 4;
     public static final int DEFAULT_PRIORITY = 1;
+
+    public static final short OPT_GENID = 20;
+    public static final short GENID_LENGTH = 4;
     public static final int DEFAULT_GENID = 0;
 
+    public static final short OPT_ADDRLIST = 24;
+
     public static final int MINIMUM_OPTION_LEN_BYTES = 4;
 
     // Values for this particular hello option.
-    private short optType;
-    private short optLength;
+    private short optType = 0;
+    private short optLength = 0;
     private byte[] optValue;
 
+    /**
+     * Constructs a new hello option with no fields set.
+     */
     public PIMHelloOption() {
     }
 
@@ -59,25 +73,25 @@
         this.optType = type;
         switch (type) {
             case OPT_HOLDTIME:
-                this.optLength = 2;
+                this.optLength = HOLDTIME_LENGTH;
                 this.optValue = new byte[optLength];
                 ByteBuffer.wrap(this.optValue).putShort(PIMHelloOption.DEFAULT_HOLDTIME);
                 break;
 
             case OPT_PRUNEDELAY:
-                this.optLength = 4;
+                this.optLength = PRUNEDELAY_LENGTH;
                 this.optValue = new byte[this.optLength];
                 ByteBuffer.wrap(this.optValue).putInt(PIMHelloOption.DEFAULT_PRUNEDELAY);
                 break;
 
             case OPT_PRIORITY:
-                this.optLength = 4;
+                this.optLength = PRIORITY_LENGTH;
                 this.optValue = new byte[this.optLength];
                 ByteBuffer.wrap(this.optValue).putInt(PIMHelloOption.DEFAULT_PRIORITY);
                 break;
 
             case OPT_GENID:
-                this.optLength = 4;
+                this.optLength = GENID_LENGTH;
                 this.optValue = new byte[this.optLength];
                 ByteBuffer.wrap(this.optValue).putInt(PIMHelloOption.DEFAULT_GENID);
                 break;
@@ -109,17 +123,85 @@
         return this.optLength;
     }
 
-    public void setValue(ByteBuffer bb) throws DeserializationException {
+    public void setValue(ByteBuffer bb) {
         this.optValue = new byte[this.optLength];
         bb.get(this.optValue, 0, this.optLength);
     }
 
+    public void setValue(byte[] value) {
+        this.optValue = value;
+    }
+
     public byte[] getValue() {
         return this.optValue;
     }
 
+    /**
+     * Creates a new PIM Hello option with the specified values.
+     *
+     * @param type hello option type
+     * @param length option length
+     * @param value option value
+     * @return new PIM Hello option
+     */
+    public static PIMHelloOption create(short type, short length, ByteBuffer value) {
+        PIMHelloOption option = new PIMHelloOption();
+        option.setOptType(type);
+        option.setOptLength(length);
+        value.rewind();
+        option.setValue(value);
+        return option;
+    }
+
+    /**
+     * Creates a new priority option.
+     *
+     * @param priority priority
+     * @return priority option
+     */
+    public static PIMHelloOption createPriority(int priority) {
+        return create(OPT_PRIORITY, PRIORITY_LENGTH,
+                ByteBuffer.allocate(PRIORITY_LENGTH).putInt(priority));
+    }
+
+    /**
+     * Creates a new hold time option.
+     *
+     * @param holdTime hold time
+     * @return hold time option
+     */
+    public static PIMHelloOption createHoldTime(short holdTime) {
+        return create(OPT_HOLDTIME, HOLDTIME_LENGTH,
+                ByteBuffer.allocate(HOLDTIME_LENGTH).putShort(holdTime));
+    }
+
+    /**
+     * Creates a new generation ID option with a particular generation ID.
+     *
+     * @param genId generation ID value
+     * @return generation ID option
+     */
+    public static PIMHelloOption createGenID(int genId) {
+        return create(OPT_GENID, GENID_LENGTH,
+                ByteBuffer.allocate(GENID_LENGTH).putInt(genId));
+    }
+
+    /**
+     * Creates a new LAN Prune Delay option.
+     *
+     * @param propagationDelay prune delay
+     * @param overrideInterval override interval
+     * @return prune delay option
+     */
+    public static PIMHelloOption createPruneDelay(short propagationDelay, short overrideInterval) {
+        return create(OPT_PRUNEDELAY, PRUNEDELAY_LENGTH,
+                ByteBuffer.allocate(PRUNEDELAY_LENGTH)
+                        .putShort(propagationDelay)
+                        .putShort(overrideInterval));
+    }
+
     public static PIMHelloOption deserialize(ByteBuffer bb) throws DeserializationException {
-        checkInput(bb.array(), bb.position(), bb.limit() - bb.position(), 4);
+        checkInput(bb.array(), bb.position(), bb.limit() - bb.position(), MINIMUM_OPTION_LEN_BYTES);
 
         PIMHelloOption opt = new PIMHelloOption();
         opt.setOptType(bb.getShort());
@@ -132,7 +214,7 @@
     }
 
     public byte[] serialize() {
-        int len = 4 + this.optLength;
+        int len = MINIMUM_OPTION_LEN_BYTES + this.optLength;
         ByteBuffer bb = ByteBuffer.allocate(len);
         bb.putShort(this.optType);
         bb.putShort(this.optLength);
