--- a/mcproxy/include/proxy/igmp_sender.hpp
+++ b/mcproxy/include/proxy/igmp_sender.hpp
@@ -37,9 +37,10 @@ class igmp_sender : public sender
 {
 private:
     bool send_igmpv3_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr, bool s_flag, const source_list<source>& slist) const;
+    bool send_igmpv2_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr ) const;
 
 public:
-    igmp_sender(const std::shared_ptr<const interfaces>& interfaces);
+    igmp_sender(const std::shared_ptr<const interfaces>& interfaces, const group_mem_protocol gmp);
 
     bool send_record(unsigned int if_index, mc_filter filter_mode, const addr_storage& gaddr, const source_list<source>& slist) const override;
 
--- a/mcproxy/src/proxy/igmp_sender.cpp
+++ b/mcproxy/src/proxy/igmp_sender.cpp
@@ -32,7 +32,7 @@
 
 #include <memory>
 
-igmp_sender::igmp_sender(const std::shared_ptr<const interfaces>& interfaces): sender(interfaces, IGMPv3)
+igmp_sender::igmp_sender(const std::shared_ptr<const interfaces>& interfaces, const group_mem_protocol gmp): sender(interfaces, gmp)
 {
     HC_LOG_TRACE("");
 
@@ -119,10 +119,79 @@ bool igmp_sender::send_mc_addr_and_src_s
     return rc;
 }
 
+bool igmp_sender::send_igmpv2_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr ) const
+{
+    HC_LOG_TRACE("");
+
+    std::unique_ptr<unsigned char[]> packet;
+    unsigned int size;
+
+	size = sizeof(ip) + sizeof(router_alert_option) + sizeof(igmp);
+	packet.reset(new unsigned char[size]);
+
+    addr_storage dst_addr;
+
+    if (gaddr == addr_storage(AF_INET)) { //is general query
+        dst_addr = IPV4_ALL_HOST_ADDR;
+    } else {
+        dst_addr = gaddr;
+    }
+
+    //-------------------------------------------------------------------
+    //fill ip header
+    ip* ip_hdr = reinterpret_cast<ip*>(packet.get());
+
+    ip_hdr->ip_v = 4;
+    ip_hdr->ip_hl = (sizeof(ip) + sizeof(router_alert_option)) / 4;
+    ip_hdr->ip_tos = 0;
+    ip_hdr->ip_len = htons(size);
+    ip_hdr->ip_id = 0;
+    ip_hdr->ip_off = htons(0 | IP_DF); //dont fragment flag
+    ip_hdr->ip_ttl = 1;
+    ip_hdr->ip_p = IPPROTO_IGMP;
+    ip_hdr->ip_sum = 0;
+    ip_hdr->ip_src = m_interfaces->get_saddr(interfaces::get_if_name(if_index)).get_in_addr();
+    ip_hdr->ip_dst = dst_addr.get_in_addr();
+
+    //-------------------------------------------------------------------
+    //fill router_alert_option header
+    router_alert_option* ra_hdr = reinterpret_cast<router_alert_option*>(reinterpret_cast<unsigned char*>(ip_hdr) + sizeof(ip));
+    *ra_hdr = router_alert_option();
+
+    ip_hdr->ip_sum = m_sock.calc_checksum(reinterpret_cast<unsigned char*>(ip_hdr), sizeof(ip) + sizeof(router_alert_option));
+
+    //-------------------------------------------------------------------
+    //fill igmpv3 query
+    igmp* query = reinterpret_cast<igmp*>(reinterpret_cast<unsigned char*>(ra_hdr) + sizeof(router_alert_option));
+
+    query->igmp_type = IGMP_MEMBERSHIP_QUERY;
+
+    if (gaddr == addr_storage(AF_INET)) { //general query
+        query->igmp_code = tv.maxrespi_to_maxrespc_igmpv3(tv.get_query_response_interval());
+    } else {
+        query->igmp_code = tv.maxrespi_to_maxrespc_igmpv3(tv.get_last_listener_query_time());
+    }
+
+    query->igmp_cksum = 0;
+    query->igmp_group = gaddr.get_in_addr();
+
+    query->igmp_cksum = m_sock.calc_checksum(reinterpret_cast<unsigned char*>(query), (sizeof(igmp) ));
+
+    if (!m_sock.choose_if(if_index)) {
+        return false;
+    }
+
+    return m_sock.send_packet(dst_addr, reinterpret_cast<unsigned char*>(ip_hdr), size);
+}
+
 bool igmp_sender::send_igmpv3_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr, bool s_flag, const source_list<source>& slist) const
 {
     HC_LOG_TRACE("");
 
+    if ( (m_group_mem_protocol & IGMPv3) == 0 ) {
+		return send_igmpv2_query( if_index, tv, gaddr );
+	}
+
     std::unique_ptr<unsigned char[]> packet;
     unsigned int size;
 
--- a/mcproxy/src/proxy/proxy_instance.cpp
+++ b/mcproxy/src/proxy/proxy_instance.cpp
@@ -119,7 +119,7 @@ bool proxy_instance::init_sender()
 {
     HC_LOG_TRACE("");
     if (is_IPv4(m_group_mem_protocol)) {
-        m_sender = std::make_shared<igmp_sender>(m_interfaces);
+        m_sender = std::make_shared<igmp_sender>(m_interfaces, m_group_mem_protocol );
     } else if (is_IPv6(m_group_mem_protocol)) {
         m_sender = std::make_shared<mld_sender>(m_interfaces);
     } else {
