diff --git a/tests/FuncUtils.py b/tests/FuncUtils.py
index 9e3fea6..d87d754 100644
--- a/tests/FuncUtils.py
+++ b/tests/FuncUtils.py
@@ -1,4 +1,4 @@
-""" Some common function definitions used by Conformance tests -- OF-SWITCH 1.0.0 Testcases """
+""" Defined Some common functions used by Conformance tests -- OF-SWITCH 1.0.0 Testcases """
 
 import sys
 import copy
@@ -282,7 +282,7 @@
     return (pkt_matchvlanid,match)
 
 def match_vlan_pcp(self,of_ports,priority=None):
-    #Generate Match_Vlan_Id
+    #Generate Match_Vlan_Priority
 
     #Create a simple tcp packet and generate match on ethernet dst address flow
     pkt_matchvlanpcp = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1,dl_vlan_pcp=10)
@@ -389,6 +389,43 @@
 
     return (pkt_iptos,match)
 
+def match_ip_src(self,of_ports,priority=None):
+    #Generate a Match on IP Type of service flow
+
+        #Create a simple tcp packet and generate match on Type of service 
+    pkt_iptos = simple_tcp_packet(ip_src='148.165.130.66')
+    match = parse.packet_to_flow_match(pkt_iptos)
+    self.assertTrue(match is not None, "Could not generate flow match from pkt")
+
+    ofp.OFPFW_NW_SRC_BITS = 32
+    print hex(ofp.OFPFW_NW_SRC_BITS)
+    ofp.OFPFW_NW_SRC_MASK = ((1 << ofp.OFPFW_NW_SRC_BITS) - 1) << ofp.OFPFW_NW_SRC_SHIFT
+    print hex(ofp.OFPFW_NW_SRC_MASK)
+    match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_NW_SRC_MASK
+    print hex(match.wildcards)
+
+    msg = message.flow_mod()
+    msg.out_port = ofp.OFPP_NONE
+    msg.command = ofp.OFPFC_ADD
+    msg.buffer_id = 0xffffffff
+    msg.match = match
+    if priority != None :
+        msg.priority = priority
+    act = action.action_output()
+    act.port = of_ports[1]
+    self.assertTrue(msg.actions.add(act), "could not add action")
+
+    rv = self.controller.message_send(msg)
+    self.assertTrue(rv != -1, "Error installing flow mod")
+    self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+
+    return (pkt_iptos,match)
+
+
+
+
+
+
 def match_ip_protocol(self,of_ports,priority=None):
     #Generate a Match on IP Protocol
 
@@ -469,6 +506,7 @@
 
     return (pkt_matchdst,match)        
 
+
 def match_ethernet_type(self,of_ports,priority=None):
     #Generate a Match_Ethernet_Type flow
 
diff --git a/tests/message_types.py b/tests/message_types.py
new file mode 100644
index 0000000..beec3f9
--- /dev/null
+++ b/tests/message_types.py
@@ -0,0 +1,667 @@
+"""These tests fall under Conformance Test-Suite (OF-SWITCH-1.0.0 TestCases).
+    Refer Documentation -- Detailed testing methodology 
+    <Some of test-cases are directly taken from oftest> """
+
+"Test Suite 8 --> Message Types "
+
+import logging
+
+import unittest
+import random
+
+from oftest import config
+import oftest.controller as controller
+import oftest.cstruct as ofp
+import oftest.message as message
+import oftest.dataplane as dataplane
+import oftest.action as action
+import oftest.parse as parse
+import oftest.base_tests as base_tests
+import time
+
+from oftest.testutils import *
+from time import sleep
+from FuncUtils import*
+
+
+
+class HelloWithBody(base_tests.SimpleDataPlane):
+
+    """Verify switch should be able to receive OFPT_HELLO messages with body , 
+        but it should ignore the contents of the body"""
+
+    def runTest(self):
+        
+        logging.info("Running Hello test")
+
+        #Send Hello message
+        logging.info("Sending Hello...")
+        request = message.hello()
+        request.data = 'OpenFlow Will Rule The World'
+        rv=self.controller.message_send(request)
+        self.assertTrue(rv is not None,"Unable to send the message")
+
+        #Verify Hello message in response 
+        logging.info("Waiting for a Hello on the control plane with same xid,version--1.0.0 and data field empty")
+        (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_HELLO,
+                                               timeout=1)
+        self.assertTrue(response is not None, 
+                               'Switch did not exchange hello message in return') 
+        self.assertEqual(len(response.data), 0, 'Response data field non-empty')
+        self.assertTrue(response.header.version == 0x01, 'Openflow-version field is not 1.0.0')
+
+
+class EchoWithData(base_tests.SimpleProtocol):
+    
+    """Verify if OFPT_ECHO_REQUEST has data field,
+    switch responds back with OFPT_ECHO_REPLY with data field copied into it. """
+
+    def runTest(self):
+
+        logging.info("Running EchoWithData test")
+        
+        #Send Echo Request 
+        logging.info("Sending Echo With Data ...")
+        request = message.echo_request()
+        request.data = 'OpenFlow Will Rule The World'
+        rv=self.controller.message_send(request)
+        self.assertTrue(rv is not None,"Unable to send the message")
+
+        #Verify Echo Reply is recieved 
+        logging.info("Waiting for Echo Reply with data field copied from Echo Request")
+        (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_ECHO_REPLY,
+                                               timeout=1)
+        self.assertTrue(response is not None,
+                        "Did not get echo reply (with data)")
+        self.assertEqual(response.header.type, ofp.OFPT_ECHO_REPLY,
+                         'Response is not echo_reply')
+        self.assertEqual(request.header.xid, response.header.xid,
+                         'Response xid does not match the request Xid')
+        self.assertEqual(request.data, response.data,
+                         'Response data does not match request data')
+
+
+class ErrorMsg(base_tests.SimpleProtocol):
+
+    """
+    Verify OFPT_ERROR msg is implemented
+
+    When the header in the  request msg  
+    contains a version field which is not supported by the switch , 
+    it generates OFPT_ERROR_msg with Type field OFPET_BAD_REQUEST 
+    and code field OFPBRC_BAD_VERSION
+    """
+    
+    def runTest(self):
+
+        logging.info("Running Error Msg test")
+
+        #Send Echo Request
+        logging.info("Sending a Echo request with a version which is not supported by the switch")
+        request=message.echo_request()
+        request.header.version=0  
+        rv=self.controller.message_send(request)
+        self.assertTrue(rv is not None,"Unable to send the message")
+
+        logging.info("Waiting for a OFPT_ERROR msg on the control plane...") 
+        (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_ERROR,         
+                                               timeout=5)
+        self.assertTrue(response is not None, 
+                               'Switch did not reply with error message')
+        self.assertTrue(response.type==ofp.OFPET_BAD_REQUEST, 
+                               'Message field type is not OFPET_BAD_REQUEST') 
+        self.assertTrue(response.type==ofp.OFPET_BAD_REQUEST, 
+                               'Message field code is not OFPBRC_BAD_VERSION')
+
+
+class FeaturesReplyBody(base_tests.SimpleProtocol):
+    """Verify the body of Features Reply message"""
+
+    def runTest(self):
+        
+        logging.info("Running Features Reply Body test")
+
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+        
+        # Sending Features_Request
+        logging.info("Sending Features_Request...")
+        request = message.features_request()
+        (reply, pkt) = self.controller.transact(request)
+        self.assertTrue(reply is not None, "Failed to get any reply")
+        self.assertEqual(reply.header.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
+        self.assertEqual(reply.header.xid,request.header.xid,'Transaction id does not match')
+        
+        supported_actions =[]
+        if(reply.actions &1<<ofp.OFPAT_OUTPUT):
+            supported_actions.append('OFPAT_OUTPUT')
+        if(reply.actions &1<<ofp.OFPAT_SET_VLAN_VID):
+            supported_actions.append('OFPAT_SET_VLAN_VID')
+        if(reply.actions &1<<ofp.OFPAT_SET_VLAN_PCP):
+            supported_actions.append('OFPAT_SET_VLAN_PCP')
+        if(reply.actions &1<<ofp.OFPAT_STRIP_VLAN):
+            supported_actions.append('OFPAT_STRIP_VLAN')
+        if(reply.actions &1<<ofp.OFPAT_SET_DL_SRC):
+            supported_actions.append('OFPAT_SET_DL_SRC')
+        if(reply.actions &1<<ofp.OFPAT_SET_DL_DST):
+            supported_actions.append('OFPAT_SET_NW_SRC')
+        if(reply.actions &1<<ofp.OFPAT_SET_NW_DST):
+            supported_actions.append('OFPAT_SET_NW_DST')
+        if(reply.actions &1<<ofp.OFPAT_SET_NW_TOS):
+            supported_actions.append('OFPAT_SET_NW_TOS')
+        if(reply.actions &1<<ofp.OFPAT_SET_TP_SRC):
+            supported_actions.append('OFPAT_SET_TP_SRC')
+        if(reply.actions &1<<ofp.OFPAT_SET_TP_DST):
+            supported_actions.append('OFPAT_SET_TP_DST')
+        if(reply.actions &1<<ofp.OFPAT_VENDOR):
+            supported_actions.append('OFPAT_VENDOR')
+        if(reply.actions &1<<ofp.OFPAT_ENQUEUE):
+            supported_actions.append('OFPAT_ENQUEUE')
+        
+        self.assertTrue(len(supported_actions) != 0,"Features Reply did not contain actions supported by sw")
+        logging.info("Supported Actions: " + str(supported_actions))
+
+        supported_capabilities = []
+        if(reply.capabilities &1<<ofp.OFPC_FLOW_STATS):
+            supported_capabilities.append('OFPC_FLOW_STATS')
+        if(reply.capabilities &1<<ofp.OFPC_TABLE_STATS):
+            supported_capabilities.append('OFPC_TABLE_STATS')
+        if(reply.capabilities &1<<ofp.OFPC_PORT_STATS):
+            supported_capabilities.append('OFPC_PORT_STATS')
+        if(reply.capabilities &1<<ofp.OFPC_STP):
+            supported_capabilities.append('OFPC_STP')
+        if(reply.capabilities &1<<ofp.OFPC_RESERVED):
+            supported_capabilities.append('OFPC_RESERVED')
+        if(reply.capabilities &1<<ofp.OFPC_IP_REASM):
+            supported_capabilities.append('OFPC_IP_REASM')
+        if(reply.capabilities &1<<ofp.OFPC_QUEUE_STATS):
+            supported_capabilities.append('OFPC_QUEUE_STATS')
+        if(reply.capabilities &1<<ofp.OFPC_ARP_MATCH_IP):
+            supported_capabilities.append('OFPC_ARP_MATCH_IP')
+
+        self.assertTrue(len(supported_capabilities) != 0,"Features Reply did not contain capabilities supported by sw")
+        logging.info("Supported Capabilities: " +  str(supported_capabilities))
+
+        self.assertTrue(reply.datapath_id != 0 , "Features Reply did not contain datapath of the sw")
+        logging.info("Datapath Id: " + str(reply.datapath_id))
+        
+        self.assertTrue(reply.n_buffers != 0 , "Features Reply does not contain no. of max packets buffered at once")
+        logging.info("Buffer Size: " + str(reply.n_buffers))
+
+        self.assertTrue(reply.n_tables != 0 , "Features Reply does not contain no. of tables supported by datapath")
+        logging.info("No of tables: " + str(reply.n_tables))
+        
+        ports=0
+        ports = len(reply.ports)
+        self.assertTrue(ports != 0, "Features Reply does not contain no. of ports and their ports definitions")
+        self.assertTrue(ports==len(of_ports),"No. of openflow ports in the features Reply is incorrect")
+        logging.info("No. of openflow ports: " + str(ports))
+
+
+class GetConfigReply(base_tests.SimpleProtocol):
+
+    """Verify the body of OFPT_GET_CONFIG_REPLY message """
+
+    def runTest(self):
+
+        logging.info("Running GetConfigReply Test")
+       
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Send get_config_request
+        logging.info("Sending Get Config Request...")
+        request = message.get_config_request()
+        (reply, pkt) = self.controller.transact(request)
+
+        #Verify get_config_reply is recieved
+        logging.info("Waiting for Get Config Reply with expected body")
+        self.assertTrue(reply is not None, "Failed to get any reply")
+        self.assertEqual(reply.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+        self.assertEqual(reply.header.xid,request.header.xid,'Transaction id does not match')
+
+        if reply.miss_send_len == 0 :
+           logging.info ("the switch must send zero-size packet_in message")
+        else :
+            logging.info("miss_send_len: " + str(reply.miss_send_len))
+        
+        if reply.flags == 0 :
+            logging.info("OFPC_FRAG_NORMAL:No special handling for fragments.")
+        if reply.flags == 1 :
+            logging.info("OFPC_FRAG_DROP:Drop fragments.")
+        if reply.flags == 2 :
+            logging.info("OFPC_FRAG_REASM:Reassemble")
+        if reply.flags == 3:
+            logging.info("OFPC_FRAG_MASK")
+
+
+class SetConfigRequest(base_tests.SimpleProtocol):
+
+    """Verify OFPT_SET_CONFIG is implemented"""
+
+    def runTest(self):
+
+        logging.info("Running SetConfigRequest Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+        
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Send get_config_request -- retrive miss_send_len field
+        logging.info("Sending Get Config Request ")
+        request = message.get_config_request()
+        (reply, pkt) = self.controller.transact(request)
+        self.assertTrue(reply is not None, "Failed to get any reply")
+        self.assertEqual(reply.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+
+        miss_send_len = 0
+        miss_send_len = reply.miss_send_len
+        old_flags = 0 
+        old_flags = reply.flags
+
+        #Send set_config_request --- set a different miss_sen_len field and flag
+        logging.info("Sending Set Config Request...")
+        req = message.set_config()
+        
+        if miss_send_len < 65400 :# Max miss_send len is 65535
+            req.miss_send_len = miss_send_len + 100
+            new_miss_send_len = req.miss_send_len
+        else :
+            req.miss_send_len = miss_send_len - 100
+            new_miss_send_len = req.miss_send_len
+        
+        if old_flags > 0 :
+            req.flags = old_flags-1
+            new_flags = req.flags
+        else :
+            req.flags = old_flags+1 
+            new_flags = req.flags
+
+        rv=self.controller.message_send(req)
+        self.assertTrue(rv is not None,"Unable to send the message")
+
+        #Send get_config_request -- verify change came into effect
+        logging.info("Sending Get Config Request...")
+        request = message.get_config_request()
+
+        (rep, pkt) = self.controller.transact(request)
+        self.assertTrue(rep is not None, "Failed to get any reply")
+        self.assertEqual(rep.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+        self.assertEqual(rep.miss_send_len,new_miss_send_len, "miss_send_len configuration parameter could not be set")
+        self.assertEqual(rep.flags,new_flags, "frag flags could not be set")
+      
+
+
+class PacketInSize1(base_tests.SimpleDataPlane):
+
+    """ When packet_in is triggered due to a flow table miss,
+        verify the data sent in packet_in varies in accordance with the
+        miss_send_len field set in OFPT_SET_CONFIG"""
+
+    def runTest(self):
+
+        logging.info("Running PacketInSize Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Send a set_config_request message 
+        miss_send_len = [0 ,32 ,64,100]
+        
+        for bytes in miss_send_len :
+            req = message.set_config()
+            req.miss_send_len = bytes
+            rv=self.controller.message_send(req)
+            self.assertTrue(rv is not None,"Unable to send the message")
+            sleep(1)
+
+            # Send packet to trigger packet_in event
+            pkt = simple_tcp_packet()
+            match = parse.packet_to_flow_match(pkt)
+            self.assertTrue(match is not None, "Could not generate flow match from pkt")
+            match.wildcards=ofp.OFPFW_ALL
+            match.in_port = of_ports[0]
+            self.dataplane.send(of_ports[0],str(pkt))
+
+            #Verify packet_in generated
+            (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=3)
+            self.assertTrue(response is not None,
+                        'Packet In not received on control plane')
+        
+            # Verify data bytes sent in packet_in is same as miss_send_length
+            self.assertEqual(len(response.data),bytes,"PacketIn Size is not equal to miss_send_len") 
+
+
+class PacketInSize2(base_tests.SimpleDataPlane):
+
+    """When the packet is sent because of a "send to controller" action, 
+        verify the data sent in packet_in varies in accordance with the
+        max_len field set in action_output"""
+
+    
+    def runTest(self):
+
+        logging.info("Running PacketInSize2 Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Create a simple tcp packet
+        pkt = simple_tcp_packet()
+        match = parse.packet_to_flow_match(pkt)
+        self.assertTrue(match is not None, "Could not generate flow match from pkt")
+        match.wildcards=ofp.OFPFW_ALL
+        match.in_port = of_ports[0]
+
+        max_len = [0 ,32 ,64,100]
+        
+        for bytes in max_len :
+
+            #Insert a flow entry with action --output to controller
+            request = message.flow_mod()
+            request.match = match
+            act = action.action_output()
+            act.port = ofp.OFPP_CONTROLLER
+            act.max_len = bytes 
+            request.actions.add(act)
+            
+            logging.info("Inserting flow....")
+            rv = self.controller.message_send(request)
+            self.assertTrue(rv != -1, "Error installing flow mod")
+            self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+            
+            #Send packet matching the flow
+            logging.debug("Sending packet to dp port " + str(of_ports[0]))
+            self.dataplane.send(of_ports[0], str(pkt))
+
+            #Verifying packet_in recieved on the control plane 
+            (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=10)
+            self.assertTrue(response is not None,
+                        'Packet in message not received by controller')
+
+            #Verify buffer_id field 
+            self.assertTrue(response.buffer_id != -1,"PacketIn buffer field is incorrect")
+
+            #Verify the reasON field is OFPR_ACTION
+            self.assertEqual(response.reason,ofp.OFPR_ACTION,"PacketIn reason field is incorrect")
+
+            #verify the data field
+            self.assertEqual(len(response.data),bytes,"Packet_in size is not equal to max_len field")
+
+           
+class PacketInBody1(base_tests.SimpleDataPlane):
+
+    """Verify the packet_in message body, 
+    when packet_in is triggered due to a flow table miss"""
+
+    def runTest(self):
+
+        logging.info("Running PacketInBody1 Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Set miss_send_len field 
+        logging.info("Sending  set_config_request to set miss_send_len... ")
+        req = message.set_config()
+        req.miss_send_len = 65535
+        rv=self.controller.message_send(req)
+        self.assertTrue(rv is not None,"Unable to send the message")
+        sleep(1)
+
+        # Send packet to trigger packet_in event
+        pkt = simple_tcp_packet()
+        match = parse.packet_to_flow_match(pkt)
+        self.assertTrue(match is not None, "Could not generate flow match from pkt")
+        match.wildcards=ofp.OFPFW_ALL
+        match.in_port = of_ports[0]
+        self.dataplane.send(of_ports[0],str(pkt))
+
+        #Verify packet_in generated
+        (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=3)
+        self.assertTrue(response is not None,
+                        'Packet In not received on control plane')
+
+        #Verify Frame Total Length Field in Packet_in 
+        self.assertEqual(response.total_len,len(str(pkt)), "PacketIn total_len field is incorrect")
+
+        #Verify in_port field in Packet_in
+        self.assertEqual(response.in_port,of_ports[0],"PacketIn in_port or recieved port field is incorrect")
+
+        #Verify the reason field in Packet_in is OFPR_NO_MATCH
+        self.assertEqual(response.reason,ofp.OFPR_NO_MATCH,"PacketIn reason field is incorrect")
+
+        #Verify data field 
+        self.assertTrue(len(response.data) == len(str(pkt)), "Complete Data packet was not sent")
+
+
+
+class PacketInBody2(base_tests.SimpleDataPlane):
+
+    """Verify the packet_in message body, when packet_in is generated due to action output to controller"""
+
+    def runTest(self):
+
+        logging.info("Running PacketInBody2 Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        # Create a simple tcp packet
+        pkt = simple_tcp_packet()
+        match = parse.packet_to_flow_match(pkt)
+        self.assertTrue(match is not None, "Could not generate flow match from pkt")
+        match.wildcards=ofp.OFPFW_ALL
+        match.in_port = of_ports[0]
+
+        #Insert a flow entry with action output to controller 
+        request = message.flow_mod()
+        request.match = match
+        act = action.action_output()
+        act.port = ofp.OFPP_CONTROLLER
+        act.max_len = 65535 # Send the complete packet and do not buffer
+        request.actions.add(act)
+
+        logging.info("Inserting flow....")
+        rv = self.controller.message_send(request)
+        self.assertTrue(rv != -1, "Error installing flow mod")
+        self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+            
+        #Send packet matching the flow
+        logging.debug("Sending packet to dp port " + str(of_ports[0]))
+        self.dataplane.send(of_ports[0], str(pkt))
+
+        #Verifying packet_in recieved on the control plane 
+        (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=10)
+        self.assertTrue(response is not None,
+                    'Packet in message not received by controller')
+
+        #Verify the reason field is OFPR_ACTION
+        self.assertEqual(response.reason,ofp.OFPR_ACTION,"PacketIn reason field is incorrect")
+
+        #Verify Frame Total Length Field in Packet_in 
+        self.assertEqual(response.total_len,len(str(pkt)), "PacketIn total_len field is incorrect")
+
+        #verify the data field
+        self.assertEqual(len(response.data),len(str(pkt)),"Complete Data Packet was not sent")
+
+        #Verify in_port field in Packet_in
+        self.assertEqual(response.in_port,of_ports[0],"PacketIn in_port or recieved port field is incorrect")
+
+
+
+class PortStatusMessage(base_tests.SimpleDataPlane):
+
+    """Verify Port Status Messages are sent to the controller 
+    whenever physical ports are added, modified or deleted"""
+
+    def runTest(self):
+
+        logging.info("Running PortStatusMessage Test")
+        of_ports = config["port_map"].keys()
+        
+        #Clear switch state      
+        rv = delete_all_flows(self.controller)
+        self.assertEqual(rv, 0, "Failed to delete all flows")
+
+        #Bring down the port by shutting the interface connected 
+        logging.info("Bringing down the interface ..")
+        default_port_num = 0
+        num = test_param_get('port',default=default_port_num)
+        self.dataplane.port_down(of_ports[num])  
+        
+        #Verify Port Status message is recieved with reason-- Port Deleted
+        logging.info("Verify PortStatus-Down message is recieved on the control plane ")
+        (response, raw) = self.controller.poll(ofp.OFPT_PORT_STATUS, timeout=15)
+        self.assertTrue(response is not None,
+                    'Port Status Message not generated')
+        self.assertEqual(response.reason,ofp.OFPPR_DELETE,"The reason field of Port Status Message is incorrect")
+
+        #Bring up the port by starting the interface connected
+        logging.info("Bringing up the interface ...")
+        self.dataplane.port_up(of_ports[num])
+
+        #Verify Port Status message is recieved with reason-- Port Added
+        logging.info("Verify Port Status Up message is received")
+        (response, raw) = self.controller.poll(ofp.OFPT_PORT_STATUS, timeout=15)
+        self.assertTrue(response is not None,
+                    'Port Status Message not generated')
+        self.assertEqual(response.reason,ofp.OFPPR_ADD,"The reason field of Port Status Message is incorrect")
+
+
+class PortConfigurationMod(base_tests.SimpleDataPlane):
+    
+    """ Modify the behavior of physical port using Port Modification Messages """
+
+    def runTest(self):
+
+        logging.info("Running PortConfigMod Test")
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+
+        #Retrieve Port Configuration
+        logging.info("Sends Features Request and retrieve Port Configuration from reply")
+        (hw_addr, port_config, advert) = \
+            port_config_get(self.controller, of_ports[0])
+        self.assertTrue(port_config is not None, "Did not get port config")
+        logging.debug("No flood bit port " + str(of_ports[0]) + " is now " + 
+                           str(port_config & ofp.OFPPC_NO_FLOOD))
+
+        
+        #Modify Port Configuration 
+        logging.info("Modify Port Configuration using Port Modification Message:OFPT_PORT_MOD")
+        rv = port_config_set(self.controller, of_ports[0],
+                             port_config ^ ofp.OFPPC_NO_FLOOD, ofp.OFPPC_NO_FLOOD)
+        self.assertTrue(rv != -1, "Error sending port mod")
+        self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+
+        
+        #Verify Port Status Message is generated with reason: OFPPR_MODIFY
+        (response, raw) = self.controller.poll(ofp.OFPT_PORT_STATUS, timeout=15)
+        self.assertTrue(response is not None,
+                    'Port Status Message not generated')
+        self.assertEqual(response.reason,ofp.OFPPR_MODIFY,"The reason field of Port Status Message is incorrect")
+
+        
+        # Verify change took place with same feature request
+        logging.info("Verify the change and then set it back")
+        (hw_addr, port_config2, advert) = port_config_get(self.controller, of_ports[0])
+        
+        logging.debug("No flood bit port " + str(of_ports[0]) + " is now " + 
+                           str(port_config2 & ofp.OFPPC_NO_FLOOD))
+        self.assertTrue(port_config2 is not None, "Did not get port config2")
+        self.assertTrue(port_config2 & ofp.OFPPC_NO_FLOOD !=
+                        port_config & ofp.OFPPC_NO_FLOOD,
+                        "Bit change did not take")
+        
+        # Set it back
+        rv = port_config_set(self.controller, of_ports[0],port_config,
+                             ofp.OFPPC_NO_FLOOD)
+        self.assertTrue(rv != -1, "Error sending port mod")
+        self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+
+
+class DescStatsReplyBody(base_tests.SimpleDataPlane):
+    
+    """Verify Description Stats message body """
+    
+    def runTest(self):
+        logging.info("Running DescStatsGet test")
+        
+        logging.info("Sending stats request")
+        request = message.desc_stats_request()
+        response, pkt = self.controller.transact(request)
+        self.assertTrue(response is not None,
+                        "Did not get reply for desc stats")
+        
+        mfr_desc = ""
+        hw_desc = ""
+        sw_dec = ""
+        serial_num = ""
+        dp_decription = ""
+
+        for stats in response.stats:
+
+            mfr_desc += stats.mfr_desc
+            hw_desc += stats.hw_desc
+            sw_dec += stats.sw_desc
+            serial_num += stats.serial_num
+            dp_decription += stats.dp_desc
+
+        logging.info("Manufacture Description :" + mfr_desc)
+        logging.info("Hardware description : " + hw_desc)
+        logging.info("Software Description :" + sw_dec)
+        logging.info("Serial number :" + serial_num)
+        logging.info("Human readable description of datapath :" + dp_decription)
+
+
+
+class QueueConfigReply(base_tests.SimpleProtocol):
+
+    """Verify Queue Configuration Reply message body """
+
+      
+    def runTest(self):
+        
+        logging.info("Running QueueConfigRequest")
+
+        of_ports = config["port_map"].keys()
+        of_ports.sort()
+        
+        logging.info("Sending Queue Config Request ...")
+        request = message.queue_get_config_request()
+        request.port = of_ports[0]
+        response, pkt = self.controller.transact(request)
+        self.assertTrue(response is not None,
+                        "Did not get reply ")
+        self.assertTrue(response.header.type == ofp.OFPT_QUEUE_GET_CONFIG_REPLY, "Reply is not Queue Config Reply")
+
+        #Verify Reply Body
+        self.assertEqual(response.header.xid, request.header.xid , "Transaction Id in reply is not same as request")
+        self.assertEqual(response.port,request.port , "Port queried does not match ")
+        queues = []
+        queues = response.queues
+        logging.info ("Queues Configured for port " + str(of_ports[0]) + str(queues))
+
+
+
+
