IcmpDestinationUnreachableMessage();
     virtual ~IcmpDestinationUnreachableMessage();
 
-    Icmpv4Type get_type_v4() const;
-    void set_type_v4( const Icmpv4Type type );
+    virtual Icmpv4Type get_type_v4() const;
+    virtual void set_type_v4( const Icmpv4Type type );
 
-    Icmpv6Type get_type_v6() const;
-    void set_type_v6( const Icmpv6Type type );
+    virtual Icmpv6Type get_type_v6() const;
+    virtual void set_type_v6( const Icmpv6Type type );
 
-    uint8_t get_code() const;
-    void set_code( const uint8_t code );
+    virtual uint8_t get_code() const;
+    virtual void set_code( const uint8_t code );
 
-    uint16_t get_checksum() const;
-    void set_checksum( const uint16_t checksum );
+    virtual uint16_t get_checksum() const;
+    virtual void set_checksum( const uint16_t checksum );
 
-    uint16_t get_identifier() const;
-    void set_identifier( const uint16_t identifier );
+    virtual uint16_t get_identifier() const;
+    virtual void set_identifier( const uint16_t identifier );
 
-    uint16_t get_sequence_number() const;
-    void set_sequence_number( const uint16_t sequence_number );
+    virtual uint16_t get_sequence_number() const;
+    virtual void set_sequence_number( const uint16_t sequence_number );
 
-    std::istream& read( std::istream &is );
-    std::ostream& write( std::ostream &os ) const;
+    virtual std::istream& read( std::istream &is );
+    virtual std::ostream& write( std::ostream &os ) const;
 
 private:
     /// packet payload object
 
     IcmpEchoReplyMessage();
     virtual ~IcmpEchoReplyMessage();
 
-    Icmpv4Type get_type_v4() const;
-    void set_type_v4( const Icmpv4Type type );
+    virtual Icmpv4Type get_type_v4() const;
+    virtual void set_type_v4( const Icmpv4Type type );
 
-    Icmpv6Type get_type_v6() const;
-    void set_type_v6( const Icmpv6Type type );
+    virtual Icmpv6Type get_type_v6() const;
+    virtual void set_type_v6( const Icmpv6Type type );
 
-    uint8_t get_code() const;
-    void set_code( const uint8_t code );
+    virtual uint8_t get_code() const;
+    virtual void set_code( const uint8_t code );
 
-    uint16_t get_checksum() const;
-    void set_checksum( const uint16_t checksum );
+    virtual uint16_t get_checksum() const;
+    virtual void set_checksum( const uint16_t checksum );
 
-    uint16_t get_identifier() const;
-    void set_identifier( const uint16_t identifier );
+    virtual uint16_t get_identifier() const;
+    virtual void set_identifier( const uint16_t identifier );
 
-    uint16_t get_sequence_number() const;
-    void set_sequence_number( const uint16_t sequence_number );
+    virtual uint16_t get_sequence_number() const;
+    virtual void set_sequence_number( const uint16_t sequence_number );
 
-    std::istream& read( std::istream &is );
-    std::ostream& write( std::ostream &os ) const;
+    virtual std::istream& read( std::istream &is );
+    virtual std::ostream& write( std::ostream &os ) const;
 
 private:
     /// packet payload object
 
     IcmpEchoRequestMessage();
     virtual ~IcmpEchoRequestMessage();
 
-    Icmpv4Type get_type_v4() const;
-    void set_type_v4( const Icmpv4Type type );
+    virtual Icmpv4Type get_type_v4() const;
+    virtual void set_type_v4( const Icmpv4Type type );
 
-    Icmpv6Type get_type_v6() const;
-    void set_type_v6( const Icmpv6Type type );
+    virtual Icmpv6Type get_type_v6() const;
+    virtual void set_type_v6( const Icmpv6Type type );
 
-    uint8_t get_code() const;
-    void set_code( const uint8_t code );
+    virtual uint8_t get_code() const;
+    virtual void set_code( const uint8_t code );
 
-    uint16_t get_checksum() const;
-    void set_checksum( const uint16_t checksum );
+    virtual uint16_t get_checksum() const;
+    virtual void set_checksum( const uint16_t checksum );
 
-    uint16_t get_identifier() const;
-    void set_identifier( const uint16_t identifier );
+    virtual uint16_t get_identifier() const;
+    virtual void set_identifier( const uint16_t identifier );
 
-    uint16_t get_sequence_number() const;
-    void set_sequence_number( const uint16_t sequence_number );
+    virtual uint16_t get_sequence_number() const;
+    virtual void set_sequence_number( const uint16_t sequence_number );
 
-    std::istream& read( std::istream &is );
-    std::ostream& write( std::ostream &os ) const;
+    virtual std::istream& read( std::istream &is );
+    virtual std::ostream& write( std::ostream &os ) const;
 
 private:
     /// packet payload object
 
     IcmpGenericMessage();
     virtual ~IcmpGenericMessage();
 
-    Icmpv4Type get_type_v4() const;
-    void set_type_v4( const Icmpv4Type type );
+    virtual Icmpv4Type get_type_v4() const;
+    virtual void set_type_v4( const Icmpv4Type type );
 
-    Icmpv6Type get_type_v6() const;
-    void set_type_v6( const Icmpv6Type type );
+    virtual Icmpv6Type get_type_v6() const;
+    virtual void set_type_v6( const Icmpv6Type type );
 
-    uint8_t get_code() const;
-    void set_code( const uint8_t code );
+    virtual uint8_t get_code() const;
+    virtual void set_code( const uint8_t code );
 
-    uint16_t get_checksum() const;
-    void set_checksum( const uint16_t checksum );
+    virtual uint16_t get_checksum() const;
+    virtual void set_checksum( const uint16_t checksum );
 
-    uint16_t get_identifier() const;
-    void set_identifier( const uint16_t identifier );
+    virtual uint16_t get_identifier() const;
+    virtual void set_identifier( const uint16_t identifier );
 
-    uint16_t get_sequence_number() const;
-    void set_sequence_number( const uint16_t sequence_number );
+    virtual uint16_t get_sequence_number() const;
+    virtual void set_sequence_number( const uint16_t sequence_number );
 
-    std::istream& read( std::istream &is );
-    std::ostream& write( std::ostream &os ) const;
+    virtual std::istream& read( std::istream &is );
+    virtual std::ostream& write( std::ostream &os ) const;
 
 };
 
 
     );
     virtual ~IcmpPinger();
 
-    void ping(
+    virtual void ping(
             const std::string &destination_ip,
             const int destination_port,
             boost::function< void(bool) > ping_done_callback
 
     Icmpv4Header get_icmp_header() const;
     IcmpData get_icmp_data() const;
 
-    bool match_echo_reply(
+    virtual bool match_echo_reply(
             const uint16_t identifier,
             const uint16_t sequence_number,
             const boost::asio::ip::address &source_address
     ) const;
-    bool match_destination_unreachable(
+    virtual bool match_destination_unreachable(
             const uint16_t identifier,
             const uint16_t sequence_number,
             const boost::asio::ip::address &source_address
     ) const;
 
-    void print_echo_reply(
+    virtual void print_echo_reply(
             const std::size_t &bytes_transferred,
             const boost::posix_time::ptime &time_packet_sent
     ) const;
-    void print_destination_unreachable() const;
+    virtual void print_destination_unreachable() const;
 
-    bool read( std::istream &is );
-    void write( std::ostream &os ) const;
+    virtual bool read( std::istream &is );
+    virtual void write( std::ostream &os ) const;
 
     friend std::istream& operator>>(
             std::istream &is,
 
     Icmpv6Header get_icmp_header() const;
     IcmpData get_icmp_data() const;
 
-    bool match_echo_reply(
+    virtual bool match_echo_reply(
             const uint16_t identifier,
             const uint16_t sequence_number,
             const boost::asio::ip::address &source_address
     ) const;
-    bool match_destination_unreachable(
+    virtual bool match_destination_unreachable(
             const uint16_t identifier,
             const uint16_t sequence_number,
             const boost::asio::ip::address &source_address
     ) const;
 
-    void print_echo_reply(
+    virtual void print_echo_reply(
             const std::size_t &bytes_transferred,
             const boost::posix_time::ptime &time_packet_sent
     ) const;
-    void print_destination_unreachable() const;
+    virtual void print_destination_unreachable() const;
 
-    bool read( std::istream &is );
-    void write( std::ostream &os ) const;
+    virtual bool read( std::istream &is );
+    virtual void write( std::ostream &os ) const;
 
     friend std::istream& operator>>(
             std::istream &is,
 
     );
     virtual ~TcpPinger();
 
-    void ping(
+    virtual void ping(
             const std::string &destination_ip,
             const int destination_port,
             boost::function<void(bool)> ping_done_callback