diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/port_config.ini b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/port_config.ini
new file mode 100644
index 000000000000..1cb2cb69c592
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/port_config.ini
@@ -0,0 +1,23 @@
+# name lanes
+Ethernet0 0
+Ethernet4 4
+Ethernet8 8
+Ethernet12 12
+Ethernet16 16
+Ethernet20 20
+Ethernet24 24
+Ethernet28 28
+Ethernet32 32
+Ethernet36 36
+Ethernet40 40
+Ethernet44 44
+Ethernet48 48
+Ethernet52 52
+Ethernet56 56
+Ethernet60 60
+Ethernet64 64
+Ethernet68 68
+Ethernet72 72,73,74,75
+Ethernet76 76,77,78,79
+Ethernet80 80,81,82,83
+Ethernet84 84,85,86,87
\ No newline at end of file
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai.profile b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai.profile
new file mode 100644
index 000000000000..32994eb9a823
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai.profile
@@ -0,0 +1 @@
+SAI_INIT_CONFIG_FILE=/usr/share/sai_2010.xml
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/installer.conf b/device/mellanox/x86_64-mlnx_msn2010-r0/installer.conf
new file mode 100644
index 000000000000..c9c9493a5404
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/installer.conf
@@ -0,0 +1 @@
+ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq"
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2010-r0/minigraph.xml
new file mode 100644
index 000000000000..580cdff142f2
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/minigraph.xml
@@ -0,0 +1,855 @@
+
+
+
+
+
+ ARISTA01T0
+ 10.0.0.33
+ sonic
+ 10.0.0.32
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.0
+ ARISTA01T2
+ 10.0.0.1
+ 1
+ 180
+ 60
+
+
+ ARISTA02T0
+ 10.0.0.35
+ sonic
+ 10.0.0.34
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.2
+ ARISTA02T2
+ 10.0.0.3
+ 1
+ 180
+ 60
+
+
+ ARISTA03T0
+ 10.0.0.37
+ sonic
+ 10.0.0.36
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.4
+ ARISTA03T2
+ 10.0.0.5
+ 1
+ 180
+ 60
+
+
+ ARISTA04T0
+ 10.0.0.39
+ sonic
+ 10.0.0.38
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.6
+ ARISTA04T2
+ 10.0.0.7
+ 1
+ 180
+ 60
+
+
+ ARISTA05T0
+ 10.0.0.41
+ sonic
+ 10.0.0.40
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.8
+ ARISTA05T2
+ 10.0.0.9
+ 1
+ 180
+ 60
+
+
+ ARISTA06T0
+ 10.0.0.43
+ sonic
+ 10.0.0.42
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.10
+ ARISTA06T2
+ 10.0.0.11
+ 1
+ 180
+ 60
+
+
+ ARISTA07T0
+ 10.0.0.45
+ sonic
+ 10.0.0.44
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.12
+ ARISTA07T2
+ 10.0.0.13
+ 1
+ 180
+ 60
+
+
+ ARISTA08T0
+ 10.0.0.47
+ sonic
+ 10.0.0.46
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.14
+ ARISTA08T2
+ 10.0.0.15
+ 1
+ 180
+ 60
+
+
+ ARISTA09T0
+ 10.0.0.49
+ sonic
+ 10.0.0.48
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.16
+ ARISTA09T2
+ 10.0.0.17
+ 1
+ 180
+ 60
+
+
+ ARISTA10T0
+ 10.0.0.51
+ sonic
+ 10.0.0.50
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.18
+ ARISTA10T2
+ 10.0.0.19
+ 1
+ 180
+ 60
+
+
+ ARISTA11T0
+ 10.0.0.53
+ sonic
+ 10.0.0.52
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.20
+ ARISTA11T2
+ 10.0.0.21
+ 1
+ 180
+ 60
+
+
+ ARISTA12T0
+ 10.0.0.55
+ sonic
+ 10.0.0.54
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.22
+ ARISTA12T2
+ 10.0.0.23
+ 1
+ 180
+ 60
+
+
+ ARISTA13T0
+ 10.0.0.57
+ sonic
+ 10.0.0.56
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.24
+ ARISTA13T2
+ 10.0.0.25
+ 1
+ 180
+ 60
+
+
+ ARISTA14T0
+ 10.0.0.59
+ sonic
+ 10.0.0.58
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.26
+ ARISTA14T2
+ 10.0.0.27
+ 1
+ 180
+ 60
+
+
+ ARISTA15T0
+ 10.0.0.61
+ sonic
+ 10.0.0.60
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.28
+ ARISTA15T2
+ 10.0.0.29
+ 1
+ 180
+ 60
+
+
+ ARISTA16T0
+ 10.0.0.63
+ sonic
+ 10.0.0.62
+ 1
+ 180
+ 60
+
+
+ sonic
+ 10.0.0.30
+ ARISTA16T2
+ 10.0.0.31
+ 1
+ 180
+ 60
+
+
+
+
+ 65100
+ sonic
+
+
+ 10.0.0.33
+
+
+
+
+ 10.0.0.1
+
+
+
+
+ 10.0.0.35
+
+
+
+
+ 10.0.0.3
+
+
+
+
+ 10.0.0.37
+
+
+
+
+ 10.0.0.5
+
+
+
+
+ 10.0.0.39
+
+
+
+
+ 10.0.0.7
+
+
+
+
+ 10.0.0.41
+
+
+
+
+ 10.0.0.9
+
+
+
+
+ 10.0.0.43
+
+
+
+
+ 10.0.0.11
+
+
+
+
+ 10.0.0.45
+
+
+
+
+ 10.0.0.13
+
+
+
+
+ 10.0.0.47
+
+
+
+
+ 10.0.0.15
+
+
+
+
+ 10.0.0.49
+
+
+
+
+ 10.0.0.17
+
+
+
+
+ 10.0.0.51
+
+
+
+
+ 10.0.0.19
+
+
+
+
+ 10.0.0.53
+
+
+
+
+ 10.0.0.21
+
+
+
+
+ 10.0.0.55
+
+
+
+
+ 10.0.0.23
+
+
+
+
+ 10.0.0.57
+
+
+
+
+ 10.0.0.25
+
+
+
+
+ 10.0.0.59
+
+
+
+
+ 10.0.0.27
+
+
+
+
+ 10.0.0.61
+
+
+
+
+ 10.0.0.29
+
+
+
+
+ 10.0.0.63
+
+
+
+
+ 10.0.0.31
+
+
+
+
+
+
+
+ 64001
+ ARISTA01T0
+
+
+
+ 65200
+ ARISTA01T2
+
+
+
+ 64002
+ ARISTA02T0
+
+
+
+ 65200
+ ARISTA02T2
+
+
+
+ 64003
+ ARISTA03T0
+
+
+
+ 65200
+ ARISTA03T2
+
+
+
+ 64004
+ ARISTA04T0
+
+
+
+ 65200
+ ARISTA04T2
+
+
+
+ 64005
+ ARISTA05T0
+
+
+
+ 65200
+ ARISTA05T2
+
+
+
+ 64006
+ ARISTA06T0
+
+
+
+
+
+
+
+
+
+ HostIP
+ Loopback0
+
+ 10.1.0.32/32
+
+ 10.1.0.32/32
+
+
+
+
+
+
+
+ sonic
+
+
+
+
+
+ Ethernet0
+ 10.0.0.0/31
+
+
+
+ Ethernet4
+ 10.0.0.2/31
+
+
+
+ Ethernet8
+ 10.0.0.4/31
+
+
+
+ Ethernet12
+ 10.0.0.6/31
+
+
+
+ Ethernet16
+ 10.0.0.8/31
+
+
+
+ Ethernet20
+ 10.0.0.10/31
+
+
+
+ Ethernet24
+ 10.0.0.12/31
+
+
+
+ Ethernet28
+ 10.0.0.14/31
+
+
+
+ Ethernet32
+ 10.0.0.16/31
+
+
+
+ Ethernet36
+ 10.0.0.18/31
+
+
+
+ Ethernet40
+ 10.0.0.20/31
+
+
+
+ Ethernet44
+ 10.0.0.22/31
+
+
+
+ Ethernet48
+ 10.0.0.24/31
+
+
+
+ Ethernet52
+ 10.0.0.26/31
+
+
+
+ Ethernet56
+ 10.0.0.28/31
+
+
+
+ Ethernet60
+ 10.0.0.30/31
+
+
+
+ Ethernet64
+ 10.0.0.32/31
+
+
+
+ Ethernet68
+ 10.0.0.34/31
+
+
+
+ Ethernet72
+ 10.0.0.36/31
+
+
+
+ Ethernet76
+ 10.0.0.38/31
+
+
+
+ Ethernet80
+ 10.0.0.40/31
+
+
+
+ Ethernet84
+ 10.0.0.42/31
+
+
+
+
+
+
+
+
+
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet0
+ ARISTA01T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet4
+ ARISTA02T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet8
+ ARISTA03T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet12
+ ARISTA04T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet16
+ ARISTA05T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet20
+ ARISTA06T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet24
+ ARISTA07T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet28
+ ARISTA08T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet32
+ ARISTA09T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet36
+ ARISTA10T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet40
+ ARISTA11T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet44
+ ARISTA12T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet48
+ ARISTA13T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet52
+ ARISTA14T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet56
+ ARISTA15T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet60
+ ARISTA16T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet64
+ ARISTA01T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet68
+ ARISTA02T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet72
+ ARISTA03T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet76
+ ARISTA04T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet80
+ ARISTA05T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ sonic
+ Ethernet84
+ ARISTA06T0
+ Ethernet1
+
+
+
+
+ sonic
+ ACS-MSN2010
+
+
+
+
+
+
+ sonic
+
+
+ DhcpResources
+
+
+
+
+ NtpResources
+
+ 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
+
+
+ SyslogResources
+
+
+
+
+ ErspanDestinationIpv4
+
+ 2.2.2.2
+
+
+
+
+
+
+ sonic
+ ACS-MSN2010
+
+
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/eeprom.py
new file mode 100644
index 000000000000..61e37b51db71
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/eeprom.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+#############################################################################
+# Mellanox
+#
+# Platform and model specific eeprom subclass, inherits from the base class,
+# and provides the followings:
+# - the eeprom format definition
+# - specific encoder/decoder if there is special need
+#############################################################################
+
+try:
+ import exceptions
+ import binascii
+ import time
+ import optparse
+ import warnings
+ import os
+ import sys
+ from sonic_eeprom import eeprom_base
+ from sonic_eeprom import eeprom_tlvinfo
+ import subprocess
+except ImportError, e:
+ raise ImportError (str(e) + "- required module not found")
+
+class board(eeprom_tlvinfo.TlvInfoDecoder):
+
+ _TLV_INFO_MAX_LEN = 256
+
+ def __init__(self, name, path, cpld_root, ro):
+ self.eeprom_path = "/bsp/eeprom/vpd_info"
+ super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/psuutil.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..b1900d173f57
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/psuutil.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+#############################################################################
+# Mellanox
+#
+# Module contains an implementation of SONiC PSU Base API and
+# provides the PSUs status which are available in the platform
+#
+#############################################################################
+
+import os.path
+
+try:
+ from sonic_psu.psu_base import PsuBase
+except ImportError as e:
+ raise ImportError (str(e) + "- required module not found")
+
+class PsuUtil(PsuBase):
+ """Platform-specific PSUutil class"""
+
+ def __init__(self):
+ PsuBase.__init__(self)
+
+ self.psu_path = "/bsp/module/"
+ self.psu_presence = "psu{}_pwr_status"
+ self.psu_oper_status = "psu{}_pwr_status"
+
+ def get_num_psus(self):
+ """
+ Retrieves the number of PSUs available on the device
+
+ :return: An integer, the number of PSUs available on the device
+ """
+ return 2
+
+ def get_psu_status(self, index):
+ """
+ Retrieves the oprational status of power supply unit (PSU) defined
+ by 1-based index
+
+ :param index: An integer, 1-based index of the PSU of which to query status
+ :return: Boolean, True if PSU is operating properly, False if PSU is faulty
+ """
+ if index is None:
+ return False
+
+ status = 0
+ try:
+ with open(self.psu_path + self.psu_oper_status.format(index), 'r') as power_status:
+ status = int(power_status.read())
+ except IOError:
+ return False
+
+ return status == 1
+
+ def get_psu_presence(self, index):
+ """
+ Retrieves the presence status of power supply unit (PSU) defined
+ by 1-based index
+
+ :param index: An integer, 1-based index of the PSU of which to query status
+ :return: Boolean, True if PSU is plugged, False if not
+ """
+ if index is None:
+ return False
+
+ try:
+ with open(self.psu_path + self.psu_presence.format(index), 'r') as presence_status:
+ return True
+ except IOError:
+ return False
+
+ return False
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmget.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmget.py
new file mode 100644
index 000000000000..170766e9bce4
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmget.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+import sys, errno
+import os
+from python_sdk_api.sxd_api import *
+from python_sdk_api.sx_api import *
+
+# Check if SFP port number is provided
+if len(sys.argv) < 2:
+ print "SFP module number is missed."
+ print "Usage: sfplpmget.py "
+ sys.exit(errno.EINVAL)
+
+# Init SDK API
+rc, handle = sx_api_open(None)
+if (rc != SX_STATUS_SUCCESS):
+ print "Failed to open api handle.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES)
+
+pid = os.getpid()
+rc = sxd_access_reg_init(pid, None, 0)
+if (rc != 0):
+ print "Failed to initializing register access.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES)
+
+# Get SFP module number
+sfp_module = int(sys.argv[1])
+
+# Get MCION
+mcion = ku_mcion_reg()
+mcion.module = sfp_module
+meta = sxd_reg_meta_t()
+meta.dev_id = 1
+meta.swid = 0
+meta.access_cmd = SXD_ACCESS_CMD_GET
+
+rc = sxd_access_reg_mcion(mcion, meta, 1, None, None)
+assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_mcion failed, rc = %d" % rc
+
+# Get low power mode status
+lpm_mask = 1 << 8
+lpm_status = (lpm_mask & mcion.module_status_bits) != 0
+print "LPM ON" if lpm_status else "LPM OFF"
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmset.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmset.py
new file mode 100644
index 000000000000..3f31af9f2944
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfplpmset.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+
+import sys, errno
+import time
+import os
+from python_sdk_api.sxd_api import *
+from python_sdk_api.sx_api import *
+
+def get_log_ports(handle, sfp_module):
+ port_attributes_list = new_sx_port_attributes_t_arr(64)
+ port_cnt_p = new_uint32_t_p()
+ uint32_t_p_assign(port_cnt_p, 64)
+
+ rc = sx_api_port_device_get(handle, 1 , 0, port_attributes_list, port_cnt_p)
+ assert rc == SX_STATUS_SUCCESS, "sx_api_port_device_get failed, rc = %d" % rc
+
+ port_cnt = uint32_t_p_value(port_cnt_p)
+ log_port_list = []
+ for i in range(0, port_cnt):
+ port_attributes = sx_port_attributes_t_arr_getitem(port_attributes_list, i)
+ if port_attributes.port_mapping.module_port == sfp_module:
+ log_port_list.append(port_attributes.log_port)
+
+ return log_port_list
+
+def set_sfp_admin_status(handle, meta, sfp_module, sfp_log_port_list, admin_status):
+ # Get PMAOS
+ pmaos = ku_pmaos_reg()
+ pmaos.module = sfp_module
+ meta.access_cmd = SXD_ACCESS_CMD_GET
+ rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None)
+ assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc
+
+ # Set admin status to PMAOS
+ pmaos.ase = 1
+ pmaos.ee = 1
+ pmaos.e = 2
+ pmaos.rst = 0
+ if admin_status == SX_PORT_ADMIN_STATUS_DOWN:
+ pmaos.admin_status = 2
+ else:
+ pmaos.admin_status = 1
+
+ meta.access_cmd = SXD_ACCESS_CMD_SET
+ rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None)
+ assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc
+
+# Check if SFP port number is provided
+if len(sys.argv) < 3:
+ print "SFP module number or LPM is missed."
+ print "Usage: sfplpmset.py "
+ sys.exit(errno.EINVAL)
+
+lpm_enable = None
+if sys.argv[2] == 'on':
+ lpm_enable = True
+elif sys.argv[2] == 'off':
+ lpm_enable = False
+else:
+ print "Unrecognized LPM parameter. Please use or values"
+ sys.exit(errno.EINVAL)
+
+# Init SDK API
+rc, handle = sx_api_open(None)
+if (rc != SX_STATUS_SUCCESS):
+ print "Failed to open api handle.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES)
+
+pid = os.getpid()
+rc = sxd_access_reg_init(pid, None, 0)
+if (rc != 0):
+ print "Failed to initializing register access.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES);
+
+# Get SFP module and log ports number and LPM status
+sfp_module = int(sys.argv[1])
+log_port_list = get_log_ports(handle, sfp_module)
+if not log_port_list:
+ print "Failed to get log ports"
+ sys.exit(errno.EACCES)
+
+# Get PMMP
+pmmp = ku_pmmp_reg()
+pmmp.module = sfp_module
+meta = sxd_reg_meta_t()
+meta.dev_id = 1
+meta.swid = 0
+meta.access_cmd = SXD_ACCESS_CMD_GET
+rc = sxd_access_reg_pmmp(pmmp, meta, 1, None, None)
+assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmmp failed, rc = %d" % rc
+
+# Disable admin status before LPM settings
+set_sfp_admin_status(handle, meta, sfp_module, log_port_list, SX_PORT_ADMIN_STATUS_DOWN)
+
+# Set low power mode status
+lpm_mask = 1 << 8
+if lpm_enable:
+ pmmp.eeprom_override = pmmp.eeprom_override | lpm_mask
+else:
+ pmmp.eeprom_override = pmmp.eeprom_override & (~lpm_mask)
+
+meta.access_cmd = SXD_ACCESS_CMD_SET
+rc = sxd_access_reg_pmmp(pmmp, meta, 1, None, None)
+assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmmp failed, rc = %d" % rc
+
+# Enable admin status after LPM settings
+set_sfp_admin_status(handle, meta, sfp_module, log_port_list, SX_PORT_ADMIN_STATUS_UP)
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfpreset.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfpreset.py
new file mode 100644
index 000000000000..69fa2be614c2
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfpreset.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+import sys, errno
+import os
+from python_sdk_api.sxd_api import *
+from python_sdk_api.sx_api import *
+
+# Check if SFP port number is provided
+if len(sys.argv) < 2:
+ print "SFP module number or LPM is missed."
+ print "Usage: sfpreset.py "
+ sys.exit(errno.EINVAL)
+
+# Init SDK API
+rc, handle = sx_api_open(None)
+if (rc != SX_STATUS_SUCCESS):
+ print "Failed to open api handle.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES)
+
+pid = os.getpid()
+rc = sxd_access_reg_init(pid, None, 0)
+if (rc != 0):
+ print "Failed to initializing register access.\nPlease check that SDK is running."
+ sys.exit(errno.EACCES)
+
+# Get SFP module number
+sfp_module = int(sys.argv[1])
+
+# Get PMAOS
+pmaos = ku_pmaos_reg()
+pmaos.module = sfp_module
+meta = sxd_reg_meta_t()
+meta.dev_id = 1
+meta.swid = 0
+meta.access_cmd = SXD_ACCESS_CMD_GET
+
+rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None)
+assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc
+
+# Reset SFP
+pmaos.rst = 1
+meta.access_cmd = SXD_ACCESS_CMD_SET
+rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None)
+assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc
+print "Reset flag is set"
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfputil.py
new file mode 100644
index 000000000000..d15c11943280
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/plugins/sfputil.py
@@ -0,0 +1,151 @@
+# sfputil.py
+#
+# Platform-specific SFP transceiver interface for SONiC
+#
+
+try:
+ import time
+ import subprocess
+ from sonic_sfp.sfputilbase import SfpUtilBase
+except ImportError as e:
+ raise ImportError("%s - required module not found" % str(e))
+
+
+class SfpUtil(SfpUtilBase):
+ """Platform-specific SfpUtil class"""
+
+ PORT_START = 0
+ PORT_END = 55
+ PORTS_IN_BLOCK = 56
+
+ EEPROM_OFFSET = 1
+
+ _port_to_eeprom_mapping = {}
+
+ @property
+ def port_start(self):
+ return self.PORT_START
+
+ @property
+ def port_end(self):
+ return self.PORT_END
+
+ @property
+ def qsfp_ports(self):
+ return range(0, self.PORTS_IN_BLOCK + 1)
+
+ @property
+ def port_to_eeprom_mapping(self):
+ return self._port_to_eeprom_mapping
+
+ def __init__(self):
+ eeprom_path = "/bsp/qsfp/qsfp{0}"
+
+ for x in range(0, self.port_end + 1):
+ self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET)
+
+ SfpUtilBase.__init__(self)
+
+ def get_presence(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ try:
+ reg_file = open("/bsp/qsfp/qsfp%d_status" % (port_num+1))
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ content = reg_file.readline().rstrip()
+
+ # content is a string with the qsfp status
+ if content == "1":
+ return True
+
+ return False
+
+ def get_low_power_mode(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ lpm_cmd = "docker exec syncd python /usr/share/sonic/platform/plugins/sfplpmget.py {}".format(port_num)
+
+ try:
+ output = subprocess.check_output(lpm_cmd, shell=True)
+ if 'LPM ON' in output:
+ return True
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to get LPM for {}, rc = {}, err msg: {}".format(port_num, e.returncode, e.output)
+ return False
+
+ return False
+
+ def set_low_power_mode(self, port_num, lpmode):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ curr_lpmode = self.get_low_power_mode(port_num)
+ if curr_lpmode == lpmode:
+ return True
+
+ lpm = 'on' if lpmode else 'off'
+ lpm_cmd = "docker exec syncd python /usr/share/sonic/platform/plugins/sfplpmset.py {} {}".format(port_num, lpm)
+ sfp_port_names = self.physical_to_logical[port_num]
+
+ # Get port admin status
+ try:
+ enabled_ports = subprocess.check_output("ip link show up", shell=True)
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to get ports status, err msg: {}".format(e.output)
+ return False
+
+ port_to_disable = []
+ for port in sfp_port_names:
+ if port in enabled_ports:
+ port_to_disable.append(port)
+
+ # Disable ports before LPM settings
+ for port in port_to_disable:
+ try:
+ subprocess.check_output("ifconfig {} down".format(port), shell=True)
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to set admin status to DOWN for {}, rc = {}, err msg: {}".format(port, e.returncode, e.output)
+ return False
+
+ time.sleep(3)
+
+ # Set LPM
+ try:
+ subprocess.check_output(lpm_cmd, shell=True)
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to set LPM for {}, rc = {}, err msg: {}".format(port_num, e.returncode, e.output)
+ return False
+
+ # Enable ports after LPM settings
+ for port in port_to_disable:
+ try:
+ subprocess.check_output("ifconfig {} up".format(port), shell=True)
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to set admin status to UP for {}, rc = {}, err msg: {}".format(port, e.returncode, e.output)
+ return False
+
+ return True
+
+ def reset(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ lpm_cmd = "docker exec syncd python /usr/share/sonic/platform/plugins/sfpreset.py {}".format(port_num)
+
+ try:
+ subprocess.check_output(lpm_cmd, shell=True)
+ return True
+ except subprocess.CalledProcessError as e:
+ print "Error! Unable to set LPM for {}, rc = {}, err msg: {}".format(port_num, e.returncode, e.output)
+ return False
+
+ return False
diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf
new file mode 100644
index 000000000000..170b0371fb0d
--- /dev/null
+++ b/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf
@@ -0,0 +1,19 @@
+bus "i2c-2" "i2c-1-mux (chan_id 1)"
+chip "mlxsw-i2c-2-48"
+ label temp1 "ASIC Temp"
+
+bus "i2c-7" "i2c-1-mux (chan_id 6)"
+chip "lm75-*"
+ label temp1 "Ambient Port Temp"
+
+bus "i2c-5" "i2c-1-mux (chan_id 4)"
+chip "tps53679-*"
+ label vin "TPS vin"
+ label vout1 "TPS vout1"
+ label vout2 "TPS vout2"
+ label temp1 "TPS Temp1"
+ label temp2 "TPS Temp2"
+ label pout1 "TPS pouti1"
+ label pout2 "TPS pout2"
+ label iout1 "TPS iout1"
+ label iout2 "TPS iout2"
diff --git a/platform/mellanox/mlnx-sai/Makefile b/platform/mellanox/mlnx-sai/Makefile
index 9a8005e5461f..a858bf098df2 100644
--- a/platform/mellanox/mlnx-sai/Makefile
+++ b/platform/mellanox/mlnx-sai/Makefile
@@ -6,8 +6,8 @@ MAIN_TARGET = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
# get sources
- rm -rf SAI-Implementation
- git clone https://github.com/Mellanox/SAI-Implementation.git
+ #rm -rf SAI-Implementation
+ #git clone https://github.com/Mellanox/SAI-Implementation.git
# build
pushd SAI-Implementation