diff --git a/cli/desc/version200/snmp.py b/cli/desc/version200/snmp.py
new file mode 100755
index 0000000..ad9b31e
--- /dev/null
+++ b/cli/desc/version200/snmp.py
@@ -0,0 +1,214 @@
+#
+# Copyright (c) 2013 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+#      http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+# (c) in 2012 by Big Switch Networks - All rights reserved
+#
+# snmp-server commands
+#
+
+import command
+from midw import local_interfaces_firewall_open
+
+def snmp_validate_firewall(data):
+    intfs = local_interfaces_firewall_open( [ 'udp', 'tcp' ], 161)
+    if len(intfs) == 0:
+        # by issueing a warning, running-config doesn't display the
+        # error during replay.
+        command.sdnsh.warning('SNMP server port not open on any controller-node '
+                              'interface. Use firewall rule configuration to open '
+                              'SNMP UDP port 161')
+
+    
+
+command.add_action('snmp-validate-firewall', snmp_validate_firewall,
+                    {'kwargs': { 'data'   : '$data',
+                               }})
+
+"""
+#
+# --------------------------------------------------------------------------------
+# SNMP command descriptions 
+#
+#  [no] snmp-server enable
+#  [no] snmp-server community <string>
+#  [no] snmp-server location <string>
+#  [no] snmp-server contact <string>
+#
+SNMP_SERVER_COMMAND_DESCRIPTION = {
+    'name'         : 'snmp-server',
+    'mode'         : 'config*',
+    'short-help'   : 'SMNP configuration, enable server, configure parameters',
+    'doc'          : 'snmp|snmp-server',
+    'doc-example'  : 'snmp|snmp-server-example',
+    'command-type' : 'update-config',
+    'obj-type'     : 'snmp-server-config',
+    'data'         : { 'id' : 'snmp' },
+    'args'         : (
+        {
+            'choices' : (
+                {
+                    'token'      : 'enable',
+                    'short-help' : 'Enable SNMP',
+                    'doc'        : 'snmp|snmp-server-enable',
+                    'action'     : (
+                                       {
+                                          'proc' : 'update-config',
+                                          'data' : {
+                                                      'id'            : 'snmp',
+                                                      'server-enable' : True,
+                                                   },
+                                       },
+                                       {
+                                          'proc' : 'snmp-validate-firewall'
+                                       },
+                    ),
+                    'no-action'  : {
+                                      'proc' : 'update-config',
+                                      'data' : {
+                                                  'id'            : 'snmp',
+                                                  'server-enable' : False,
+                                               },
+                                   },
+                },
+                (
+                    {
+                        'token'           : 'community',
+                        'short-help'      : 'Set community string and access privs',
+                        'data'            : { 'community' : None },
+                        'doc'             : 'snmp|snmp-server-community',
+                    },
+                    {
+                        'token'           : 'ro',
+                        'short-help'      : 'Read-only access with this community string',
+                        'optional-for-no' : True,
+                    },
+                    {
+                        'field'           : 'community',
+                        'type'            : 'string',
+                        'optional-for-no' : True,
+                        'syntax-help'     : 'Value for the SNMP commuity string',
+                    },
+                ),
+                (
+                    {
+                        'token'           : 'location',
+                        'short-help'      : 'Text for mib object sysLocation',
+                        'data'            : { 'location' : None },
+                        'doc'             : 'snmp|snmp-server-location',
+                    },
+                    {
+                        'field'           : 'location',
+                        'type'            : 'string',
+                        'optional-for-no' : True,
+                        'syntax-help'     : 'Value for the SNMP location string',
+                    },
+                ),
+                (
+                    {
+                        'token'           : 'contact',
+                        'short-help'      : 'Text for mib object sysContact',
+                        'data'            : { 'contact' : None },
+                        'doc'             : 'snmp|snmp-server-contact',
+                    },
+                    {
+                        'field'           : 'contact',
+                        'type'            : 'string',
+                        'optional-for-no' : True,
+                        'syntax-help'     : 'Value for the SNMP contact string',
+                    },
+                ),
+            ),
+        },
+    )
+}
+"""
+
+def snmp_firewall_interfaces(data):
+    """
+    There is currently only one row of data in the query,
+    add to that a 'interfaces' entity, which lists the interfaces
+    which have the snmp port open
+    """
+    if not hasattr(command, 'query_result'):
+        return
+    if command.query_result == None:
+        return
+
+    intfs = local_interfaces_firewall_open( [ 'udp', 'tcp' ], 161)
+
+    intfs_text = ', '.join([x['discovered-ip'] if x['discovered-ip'] != ''
+                            else x['ip'] for x in intfs])
+
+    for q in command.query_result:
+        q['interfaces'] = intfs_text
+
+
+command.add_action('snmp-firewall-interfaces', snmp_firewall_interfaces,
+                    {'kwargs': { 'data'   : '$data',
+                               }})
+
+"""
+SNMP_SERVER_SHOW_COMMAND_DESCRIPTION = {
+    'name'         : 'show',
+    'mode'         : 'login',
+    'short-help'   : 'Show configured snmp details',
+    'doc'          : 'snmp|show',
+    'doc-example'  : 'snmp|show-example',
+    'command-type' : 'display-table',
+    'obj-type'     : 'snmp-server-config',
+    'short-help'   : 'Show SNMP configuration',
+    'format'       : 'snmp-config-summary',
+    'args' : (
+        'snmp',
+    ),
+    'action'       : (
+        {
+            'proc' : 'query-table',
+        },
+        {
+            'proc'  : 'snmp-firewall-interfaces'
+        },
+        {
+            'proc'   : 'display-table',
+        },
+    ),
+}
+
+import fmtcnv
+
+SNMP_CONFIG_SUMMARY_FORMAT = {
+    'snmp-config-summary' : {
+        'field-orderings' : {
+            'default'     : [
+                                'server-enable',
+                                'community',
+                                'location',
+                                'contact',
+                                'interfaces',
+                            ],
+        },
+        'fields' : {
+            'server-enable'           : {
+                                          'verbose-name' : 'SNMP server status',
+                                          'formatter'    : fmtcnv.replace_boolean_with_enable_disable,
+                                        },
+            'community'               : { 'verbose-name' : 'Community string' },
+            'location'                : { 'verbose-name' : 'System location' },
+            'contact'                 : { 'verbose-name' : 'System contact' },
+        },
+    }
+}
+"""
\ No newline at end of file
